diff --git a/include/model.h b/include/model.h index 46642bf..4966dd3 100755 --- a/include/model.h +++ b/include/model.h @@ -22,6 +22,8 @@ ~Model(); void setCenter(Vec& c); void setCenter(Vec* c); + void setPosition(Vec c); + void setPosition(Vec* c); Vec calcCenter(); void rotate(Vec rot); void draw(); @@ -36,5 +38,7 @@ void setColor(Color* c); void show(); void hide(); + void translate(Vec d); + void scale(float f); }; #endif diff --git a/include/poly.h b/include/poly.h index 0694dd4..a6fa1b8 100755 --- a/include/poly.h +++ b/include/poly.h @@ -16,10 +16,12 @@ int size; Vec* position; Vec* rotation; + Vec* center; Vec* normal; Color* color; float delta; bool drawNormals; + float scaleFactor; public: Poly(); Poly(std::vector & _points); @@ -30,11 +32,10 @@ Vec getInitRotation(Vec& v); Vec calcCenter(); void setPosition(Vec newcenter); + void setPosition(Vec* newcenter); + void setRotation(Vec rot); + void setRotation(Vec* rot); void rotate(Vec rot); - Vec rotate_x(Vec& c); - Vec rotate_y(Vec& c); - Vec rotate_z(Vec& c); - Vec rotate_xyz(Vec out); void draw(); int numPoints(); void vardump(std::string whitespace); @@ -47,5 +48,7 @@ void hideNormals(); void calcNormal(); Poly* clone(); + void translate(Vec d); + void scale(float f); }; #endif diff --git a/include/thing.h b/include/thing.h index dfeb470..cebaf09 100644 --- a/include/thing.h +++ b/include/thing.h @@ -28,13 +28,16 @@ private: Vec* rotation; Vec* position; + Color* bgcolor; public: View(); + View(Vec pos); + View(Vec pos, Vec rot); void rotate(Vec rot); void setPosition(Vec newpos); - void setCenter(Vec newcenter); void translate(Vec d); void draw(); + void setColor(Color* c); }; #endif diff --git a/sources/animation.cpp b/sources/animation.cpp index 13d4973..a07fcf7 100644 --- a/sources/animation.cpp +++ b/sources/animation.cpp @@ -129,13 +129,21 @@ if ( kbd[SDLK_w] ) { things.at(current)->translate(Vec(0.0f, 0.0f, 1.0f*speed)); } if ( kbd[SDLK_s] ) { things.at(current)->translate(Vec(0.0f, 0.0f, -1.0f*speed)); } + /* rotate x */ + if ( kbd[SDLK_c] ) { things.at(current)->rotate(Vec(1.0f*speed, 0.0f, 0.0f)); } + if ( kbd[SDLK_f] ) { things.at(current)->rotate(Vec(-1.0f*speed, 0.0f, 0.0f)); } + + /* rotate y */ + if ( kbd[SDLK_b] ) { things.at(current)->rotate(Vec(0.0f, 1.0f*speed, 0.0f)); } + if ( kbd[SDLK_v] ) { things.at(current)->rotate(Vec(0.0f, -1.0f*speed, 0.0f)); } + /* rotate z */ if ( kbd[SDLK_q] ) { things.at(current)->rotate(Vec(0.0f, 0.0f, 1.0f*speed)); } if ( kbd[SDLK_e] ) { things.at(current)->rotate(Vec(0.0f, 0.0f, -1.0f*speed)); } /* scaling */ - if ( kbd[SDLK_x] ) { things.at(current)->scale(1.1f*speed); } - if ( kbd[SDLK_y] ) { things.at(current)->scale(0.9f*speed); } + if ( kbd[SDLK_x] ) { things.at(current)->scale(1.01f*speed); printf("anim scale: %f\n", 1.01f*speed); } + if ( kbd[SDLK_y] ) { things.at(current)->scale(0.99f*speed); printf("anim scale: %f\n", 0.99f*speed); } /* cycle color */ if ( kbd[SDLK_PERIOD] || kbd[SDLK_COMMA] ) { @@ -166,7 +174,6 @@ /* show/hide object */ if ( kbd[SDLK_h] ) { - printf("h\n"); if ( showMe ) { things.at(current)->hide(); } else { diff --git a/sources/main.cpp b/sources/main.cpp index b2fcdfd..4504c59 100755 --- a/sources/main.cpp +++ b/sources/main.cpp @@ -227,7 +227,9 @@ Color cyan (0,1,1); Color grey (0.5f,0.5f,0.5f); - View* myView = new View(); + Vec initPos = Vec(30.0f, -30.0f, -30.0f); + Vec initRot = Vec(0.0f, 0.0f, 0.0f); + View* myView = new View(initPos, initRot); UserAnimation* userAnim = new UserAnimation(); userAnim->init(); userAnim->addThing((Thing*)myView); @@ -263,7 +265,8 @@ Vec* orv = new Vec(10,10,10); Vec* orh = new Vec(10,10,0 ); - Vec cen (5,0,5); + Vec cubePos (5,0,5); + Vec cubeCen (5,5,5); Model* cube = new Model(); @@ -311,7 +314,8 @@ cube->addFace(new Poly(rear, yellow)); cube->addFace(new Poly(front, white)); - cube->setCenter(cen); + cube->setPosition(cubePos); + //cube->setCenter(cubeCen); userAnim->addThing((Thing*)cube); //cube->setDelta(PI/2.0); @@ -330,7 +334,7 @@ Model* myModel = importModel(modelfile); printf("imported %s : %d faces\n", modelfile, myModel->numFaces()); Vec myCen = Vec(5,-10,5); - myModel->setCenter(myCen); + myModel->setPosition(myCen); myModel->showNormals(); myModel->setDelta(PI/2.0); @@ -342,20 +346,6 @@ //models.push_back(myModel); - /* stage */ - Model* stage = new Model(); - Vec* lr = new Vec(-1000000.0f, 0.0f, -1000000.0f); - Vec* lf = new Vec(-1000000.0f, 0.0f, 1000000.0f); - Vec* rr = new Vec(1000000.0f, 0.0f, -1000000.0f); - Vec* rf = new Vec(1000000.0f, 0.0f, 1000000.0f); - Poly* sp = new Poly(); - sp->addPoint(lr); - sp->addPoint(lf); - sp->addPoint(rf); - sp->addPoint(rr); - sp->setColor(grey); - stage->addFace(sp); - // Prepare configuration: int bitsPerColor = 8; if (WINDOW_COLORDEPTH == 16) { @@ -426,16 +416,23 @@ std::vector::size_type modelCounter = 0; Model* t; + Color* tc; for ( int i = 0; i < 50; i++ ) { t = cube->clone(); t->rotate(Vec(i*5.0f, 0.0f, 0.0f)); - t->setCenter(new Vec(200.0f*cos(((float)i)*PI/50.0f), 0.0f, 200.0f*sin(((float)i)*PI/50.0f))); + t->setPosition(new Vec(200.0f*cos(((float)i)*PI/50.0f), 0.0f, 200.0f*sin(((float)i)*PI/50.0f))); + t->scale(pow(1.02f, i)); + tc = new Color(i*0.02f, 1.0f, 1.0f-i*0.02f); + t->setColor(tc); models.push_back(t); } - for ( int i = 1; i < 50; i++ ) { + for ( int i = 0; i < 50; i++ ) { t = cube->clone(); t->rotate(Vec(i*-5.0f, 0.0f, 0.0f)); - t->setCenter(new Vec(200.0f*cos(((float)-i)*PI/50.0f), 0.0f, 200.0f*sin(((float)-i)*PI/50.0f))); + t->scale(pow(0.98f, i)); + t->setPosition(new Vec(200.0f*cos(((float)-i)*PI/50.0f), 0.0f, 200.0f*sin(((float)-i)*PI/50.0f))); + tc = new Color(i*0.02f, 1.0f-i*0.02f, 1.0f-i*0.02f); + t->setColor(tc); models.push_back(t); } @@ -466,31 +463,16 @@ //initial viewer position glLoadIdentity(); - - //move viewer - //glTranslatef(viewer_pos.x(), viewer_pos.y(), viewer_pos.z()); - - //rotate viewer - //glRotatef(viewer_rot.z(), 0.0f, 0.0f, 1.0f); - //glRotatef(viewer_rot.y(), 0.0f, 1.0f, 0.0f); - //glRotatef(viewer_rot.x(), 1.0f, 0.0f, 0.0f); + // move viewer myView->draw(); - + /* do animations */ for ( std::vector::size_type anim_ct = 0; anim_ct < anims.size(); anim_ct++ ) { ((UserAnimation*)anims.at(anim_ct))->tick(); } - /* draw x- axis */ - //glBegin(GL_LINES); black.drawColor(); glVertex3f(-1000000.0f, 0.0f, 0.0f); glVertex3f(1000000.0f, 0.0f, 0.0f); glEnd(); - /* draw y- axis */ - //glBegin(GL_LINES); black.drawColor(); glVertex3f(0.0f, -1000000.0f, 0.0f); glVertex3f(0.0f, 1000000.0f, 0.0f); glEnd(); - /* draw z- axis */ - //glBegin(GL_LINES); black.drawColor(); glVertex3f(0.0f, 0.0f, -1000000.0f); glVertex3f(0.0f, 0.0f, 1000000.0f); glEnd(); - - //stage->draw(); - + /* draw some models */ for ( modelCounter = 0; modelCounter < models.size(); modelCounter++ ) { models.at(modelCounter)->draw(); models.at(modelCounter)->rotate(Vec(1.5f, 0.0f, 0.0f)); @@ -517,34 +499,12 @@ } } - /* Update mouse: - OldMouseX = MouseX; - OldMouseY = MouseY; - unsigned buttons = SDL_GetMouseState(&MouseX, &MouseY); - - if (buttons&SDL_BUTTON(1)) { - MouseButtonLeft = true; - } else { - MouseButtonLeft = false; - } - - if (buttons&SDL_BUTTON(3)) {// <-- Beware: may be 2 on mouses - // without the middle button! - MouseButtonRight = true; - } else { - MouseButtonRight = false; - } - - //if (MouseButtonLeft) - // delta += 1.0f; */ - // Update keyboard (used like a joypad): Uint8 *keystate = SDL_GetKeyState(NULL); if (keystate[SDLK_ESCAPE]) { done = true; } - // lights etc. if (react_keyevent == 0) { react_keyevent = 10; @@ -567,20 +527,6 @@ react_keyevent -= 1; } - //background color - /* if (keystate[SDLK_1]) { - glClearColor(0.5f, 0.0f, 0.0f, 1.0f); - } - - if (keystate[SDLK_2]) { - glClearColor(0.0f, 0.5f, 0.0f, 1.0f); - } - - if (keystate[SDLK_3]) { - glClearColor(0.0f, 0.0f, 0.5f, 1.0f); - }*/ - - if ( keystate[SDLK_z] ) { fog++; fog = fog % 4; @@ -617,10 +563,11 @@ } } - + glFlush(); + //////////////// // Swap buffers: - //mysleep(2000); // Just don't kill computer resources ;) + mysleep(2000); // Just don't kill computer resources ;) SDL_GL_SwapBuffers(); } diff --git a/sources/model.cpp b/sources/model.cpp index 99c8017..266ac45 100755 --- a/sources/model.cpp +++ b/sources/model.cpp @@ -3,8 +3,6 @@ #include Model::Model() { - rotation = new Vec(0,0,0); - position = new Vec(0,0,0); drawMe = true; } @@ -15,26 +13,19 @@ Vec c = calcCenter(); setCenter(c); - rotation = new Vec(0,0,0); drawMe = true; } Model::~Model() { - delete position; - delete rotation; } void Model::setCenter(Vec* c) { - position = c->clone(); - for (std::vector::size_type i = 0 ; i < faces.size(); i++ ) { - faces.at(i)->setCenter(position); + faces.at(i)->setCenter(c); } } void Model::setCenter(Vec& c) { - position = c.clone(); - for (std::vector::size_type i = 0 ; i < faces.size(); i++ ) { faces.at(i)->setCenter(c); } @@ -55,8 +46,6 @@ } void Model::rotate(Vec rot) { - rotation->add((Vec)rot); - for (std::vector::size_type i = 0 ; i < faces.size(); i++ ) { faces.at(i)->rotate(rot); } @@ -79,9 +68,8 @@ } void Model::vardump(std::string whitespace) { - printf("%sModel(%d faces, center: [%f, %f, %f], rotation: [%f, %f, %f])\n", - whitespace.c_str(), faces.size(), position->x(), position->y(), position->z(), - rotation->x(), rotation->y(), rotation->z()); + printf("%sModel(%d faces)\n", + whitespace.c_str(), faces.size()); for (std::vector::size_type i = 0 ; i < faces.size(); i++ ) { faces.at(i)->vardump(whitespace+" "); @@ -138,3 +126,28 @@ void Model::hide() { drawMe = false; } + +void Model::translate(Vec d) { + for (std::vector::size_type i = 0 ; i < faces.size(); i++ ) { + faces.at(i)->translate(d); + } +} + +void Model::scale(float f) { + printf("model scale: %f\n", f); + for (std::vector::size_type i = 0 ; i < faces.size(); i++ ) { + faces.at(i)->scale(f); + } +} + +void Model::setPosition(Vec p) { + for (std::vector::size_type i = 0 ; i < faces.size(); i++ ) { + faces.at(i)->setPosition(p); + } +} + +void Model::setPosition(Vec* p) { + for (std::vector::size_type i = 0 ; i < faces.size(); i++ ) { + faces.at(i)->setPosition(p); + } +} diff --git a/sources/poly.cpp b/sources/poly.cpp index d25e6fa..fc9970f 100755 --- a/sources/poly.cpp +++ b/sources/poly.cpp @@ -13,11 +13,12 @@ Poly::Poly() { drawNormals = false; delta = 0.0f; + scaleFactor = 1.0f; position = new Vec(0,0,0); + center = new Vec(0,0,0); rotation = new Vec(0,0,0); color = new Color(1,0,0); normal = new Vec(0,0,0); - setCenter(Vec(0,0,0)); } Poly::Poly(std::vector & _points) { @@ -26,16 +27,19 @@ Poly::Poly(std::vector & _points, Color _color) { delta = 0.0f; + scaleFactor = 1.0f; drawNormals = false; position = new Vec(0,0,0); rotation = new Vec(0,0,0); + center = new Vec(0,0,0); + normal = new Vec(0,0,0); color = _color.clone(); for (std::vector::size_type i = 0 ; i < _points.size(); i++ ) { addPoint(_points.at(i)); } - setCenter(calcCenter()); + //setCenter(calcCenter()); } @@ -59,11 +63,13 @@ * the polygon is located */ void Poly::setCenter(Vec c) { - position = c.clone(); + delete center; + center = c.clone(); } void Poly::setCenter(Vec* c) { - position = c->clone(); + delete center; + center = c->clone(); } /* @@ -95,13 +101,23 @@ * polygon to an absolute position) */ void Poly::setPosition(Vec newcenter) { - Vec diff = newcenter - (*position); delete position; position = newcenter.clone(); +} - for ( std::vector::size_type i = 0; i < initpoints.size(); i++ ) { - initpoints.at(i)->add((Vec)diff); - } +void Poly::setPosition(Vec* newcenter) { + delete position; + position = newcenter->clone(); +} + +void Poly::setRotation(Vec rot) { + delete rotation; + rotation = rot.clone(); +} + +void Poly::setRotation(Vec* rot) { + delete rotation; + rotation = rot->clone(); } //additional rotation in arcs @@ -109,34 +125,6 @@ rotation->add((Vec)rot); } -Vec Poly::rotate_x(Vec& c) { - Vec initrot = getInitRotation(c); - Vec rot = initrot + *rotation; - float r = Vec(0, c.y(), c.z()).length(); - return Vec (c.x(), r*cos(rot.x()), r*sin(rot.x())); -} - -Vec Poly::rotate_y(Vec& c) { - Vec initrot = getInitRotation(c); - Vec rot = initrot + *rotation; - float r = Vec(c.x(), 0, c.z()).length(); - return Vec (r*sin(rot.y()), c.y(), r*cos(rot.y())); -} - -Vec Poly::rotate_z(Vec& c) { - Vec initrot = getInitRotation(c); - Vec rot = initrot + *rotation; - float r = Vec(c.x(), c.y(), 0).length(); - return Vec (r*cos(rot.z()), r*sin(rot.z()), c.z()); -} - -Vec Poly::rotate_xyz(Vec out) { - Vec ret = rotate_x(out); - ret = rotate_y(ret); - ret = rotate_z(ret); - return ret; -} - void Poly::draw() { Vec n = Vec(0.0f, 0.0f, 0.0f); Color nc = Color(1.0f, 0.0f, 1.0f); @@ -146,14 +134,27 @@ //save camera position glPushMatrix(); - //center poly + //center on origin + //glTranslatef(-center->x(), -center->y(), -center->z()); + glTranslatef(center->x(), center->y(), center->z()); + + //move to origin glTranslatef(-position->x(), -position->y(), -position->z()); //rotate poly glRotatef(rotation->x(), 1.0f, 0.0f, 0.0f); glRotatef(rotation->y(), 0.0f, 1.0f, 0.0f); glRotatef(rotation->z(), 0.0f, 0.0f, 1.0f); - + + //move to origin + //glTranslatef(position->x(), position->y(), position->z()); + + //center on origin + glTranslatef(center->x(), center->y(), center->z()); + + //scale + glScalef(scaleFactor, scaleFactor, scaleFactor); + if ( drawNormals ) { /* draw face normal */ glBegin(GL_LINES); @@ -296,8 +297,20 @@ } np->setDelta(delta); - np->setCenter(position); + np->setPosition(position); + np->setCenter(center); + np->setRotation(rotation); np->setColor(color); + np->scale(scaleFactor); return np; } + +void Poly::translate(Vec d) { + position->add((Vec)d); +} + +void Poly::scale(float f) { + printf("scale: %f\n", f); + scaleFactor *= f; +} diff --git a/sources/thing.cpp b/sources/thing.cpp index b180bb5..f21e376 100644 --- a/sources/thing.cpp +++ b/sources/thing.cpp @@ -21,18 +21,37 @@ View::View() { rotation = new Vec(0.0f, 0.0f, 0.0f); position = new Vec(0.0f, 0.0f, 0.0f); + bgcolor = new Color(0.0f, 0.0f, 0.0f); +} + +View::View(Vec pos) { + rotation = new Vec(0.0f, 0.0f, 0.0f); + position = pos.clone(); + bgcolor = new Color(0.0f, 0.0f, 0.0f); +} + +View::View(Vec pos, Vec rot) { + rotation = rot.clone(); + position = pos.clone(); + bgcolor = new Color(0.0f, 0.0f, 0.0f); } void View::rotate(Vec rot) { rotation->add((Vec)rot); } -void View::setPosition(Vec newpos) { /*TODO*/ } -void View::setCenter(Vec newcenter) { /*TODO*/ } +void View::setPosition(Vec newpos) { + delete position; + position = newpos.clone(); +} void View::translate(Vec d) { - /* TODO */ position->add((Vec)d); } +void View::setColor(Color* c) { + bgcolor = c; +} void View::draw() { + glClearColor(bgcolor->r, bgcolor->g, bgcolor->b, 1.0f); + glRotatef(rotation->x(), 1.0f, 0.0f, 0.0f); glRotatef(rotation->y(), 0.0f, 1.0f, 0.0f); glRotatef(rotation->z(), 0.0f, 0.0f, 1.0f);