diff --git a/include/model.h b/include/model.h index 064e288..2fc9b44 100755 --- a/include/model.h +++ b/include/model.h @@ -19,6 +19,7 @@ Model(std::vector & _faces); ~Model(); void setCenter(Vec& c); + void setCenter(Vec* c); Vec calcCenter(); void rotate(Vec rot); void draw(); @@ -29,5 +30,6 @@ float getDelta(); void showNormals(); void hideNormals(); + Model* clone(); }; #endif diff --git a/include/poly.h b/include/poly.h index 600a530..33a24e5 100755 --- a/include/poly.h +++ b/include/poly.h @@ -25,6 +25,7 @@ Poly(std::vector & _points, Color _color); ~Poly(); void setCenter(Vec c); + void setCenter(Vec* c); Vec getInitRotation(Vec& v); Vec calcCenter(); void setPosition(Vec newcenter); @@ -38,10 +39,12 @@ void vardump(std::string whitespace); void addPoint(Vec* p); void setColor(Color c); + void setColor(Color* c); Color* getColor(); void setDelta(float d); void showNormals(); void hideNormals(); void calcNormal(); + Poly* clone(); }; #endif diff --git a/include/vec.h b/include/vec.h index 2dadadc..42a0fea 100755 --- a/include/vec.h +++ b/include/vec.h @@ -20,6 +20,8 @@ float* getCoords(); Vec operator+(Vec* v); Vec operator+(Vec c); + void add(Vec a); + void sub(Vec a); void add(Vec& a); void sub(Vec& a); Vec operator-(Vec& v); diff --git a/obj/sample2.obj b/obj/sample2.obj new file mode 100755 index 0000000..461ce81 --- /dev/null +++ b/obj/sample2.obj @@ -0,0 +1,11 @@ +v 0 0 0 +v 5 5 3 +v 10 0 0 +v 0 0 10 +v 5 5 7 +v 10 0 10 +f 4 6 5 +f 3 1 2 +f 1 3 6 4 +f 2 5 6 3 +f 2 1 4 5 diff --git a/sources/main.cpp b/sources/main.cpp index a9a5cfa..3496f91 100755 --- a/sources/main.cpp +++ b/sources/main.cpp @@ -212,7 +212,11 @@ Color white (1,1,1); Color green (0,1,0); Color cyan (0,1,1); + Color grey (0.5f,0.5f,0.5f); + std::vector models; + + /* begin cube */ Vec* ulh = new Vec(0 ,0 ,0 ); Vec* ulv = new Vec(0 ,0 ,10); Vec* urv = new Vec(10,0 ,10); @@ -223,7 +227,7 @@ Vec* orv = new Vec(10,10,10); Vec* orh = new Vec(10,10,0 ); - Vec cen (5,5,5); + Vec cen (5,0,5); Model* cube = new Model(); @@ -272,20 +276,46 @@ cube->addFace(new Poly(front, white)); cube->setCenter(cen); + //cube->setDelta(PI/2.0); - cube->showNormals(); + //cube->showNormals(); + + /* end cube */ + //models.push_back(cube); + + /* begin import */ + char* modelfile = "obj/sample2.obj"; //char* modelfile = "obj/sample.obj"; - char* modelfile = "obj/untitled.obj"; + //char* modelfile = "obj/untitled.obj"; //char* modelfile = "obj/teapot.obj"; Model* myModel = importModel(modelfile); printf("imported %s : %d faces\n", modelfile, myModel->numFaces()); - Vec myCen = Vec(0,0,0); + Vec myCen = Vec(5,-10,5); myModel->setCenter(myCen); - myModel->setDelta(PI); + //myModel->showNormals(); + myModel->setDelta(PI/2.0); //myModel->vardump(""); + /* end import */ + + //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) { @@ -340,7 +370,7 @@ glEnable(GL_COLOR_MATERIAL); - //glShadeModel(GL_SMOOTH); + glShadeModel(GL_SMOOTH); /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// @@ -351,6 +381,23 @@ float deltacolor = 0.0f; int react_keyevent = 0; + float viewerMovingSpeed = 1.0f; + + std::vector::size_type modelCounter = 0; + + Model* t; + 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))); + models.push_back(t); + } + for ( int i = 1; 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))); + models.push_back(t); + } while (!done) { ///////////////////// @@ -371,6 +418,7 @@ //initial viewer position glLoadIdentity(); + //move viewer glTranslatef(viewer_pos.x(), viewer_pos.y(), viewer_pos.z()); @@ -380,12 +428,28 @@ glRotatef(viewer_rot.y(), 0.0f, 1.0f, 0.0f); glRotatef(viewer_rot.x(), 1.0f, 0.0f, 0.0f); - //draw cube - cube->draw(); - cube->rotate(Vec(0.1f, 0.5f, 1.0f)); + /* 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(); + + for ( modelCounter = 0; modelCounter < models.size(); modelCounter++ ) { + models.at(modelCounter)->draw(); + models.at(modelCounter)->rotate(Vec(1.5f, 0.0f, 0.0f)); + } + + cube->draw(); myModel->draw(); - myModel->rotate(Vec(0.2f, 0.3f, 1.2f)); + + //draw cube + //cube->draw(); + //cube->rotate(Vec(0.1f, 0.5f, 1.0f)); + //myModel->draw(); + //myModel->rotate(Vec(0.2f, 0.3f, 1.2f)); //////////////// @@ -457,17 +521,24 @@ glClearColor(0.0f, 0.0f, 0.5f, 1.0f); }*/ + // speed + if ( keystate[SDLK_LSHIFT] || keystate[SDLK_RSHIFT] ) { + viewerMovingSpeed = 10.0f; + } else { + viewerMovingSpeed = 1.0f; + } + // rotate viewer - if (keystate[SDLK_LEFT]) viewer_rot.add(viewer_yrot); - if (keystate[SDLK_RIGHT]) viewer_rot.sub(viewer_yrot); - if (keystate[SDLK_UP]) viewer_rot.add(viewer_xrot); - if (keystate[SDLK_DOWN]) viewer_rot.sub(viewer_xrot); + if (keystate[SDLK_LEFT]) viewer_rot.add(viewer_yrot*viewerMovingSpeed); + if (keystate[SDLK_RIGHT]) viewer_rot.sub(viewer_yrot*viewerMovingSpeed); + if (keystate[SDLK_UP]) viewer_rot.add(viewer_xrot*viewerMovingSpeed); + if (keystate[SDLK_DOWN]) viewer_rot.sub(viewer_xrot*viewerMovingSpeed); // move viewer - if (keystate[SDLK_w]) viewer_pos.add(viewer_zmove_neg); - if (keystate[SDLK_s]) viewer_pos.add(viewer_zmove_pos); - if (keystate[SDLK_a]) viewer_pos.add(viewer_xmove_pos); - if (keystate[SDLK_d]) viewer_pos.add(viewer_xmove_neg); + if (keystate[SDLK_w]) viewer_pos.add(viewer_zmove_neg*viewerMovingSpeed); + if (keystate[SDLK_s]) viewer_pos.add(viewer_zmove_pos*viewerMovingSpeed); + if (keystate[SDLK_a]) viewer_pos.add(viewer_xmove_pos*viewerMovingSpeed); + if (keystate[SDLK_d]) viewer_pos.add(viewer_xmove_neg*viewerMovingSpeed); if (keystate[SDLK_SPACE]) { deltacolor += 0.01f; diff --git a/sources/model.cpp b/sources/model.cpp index 1156db4..8af3e08 100755 --- a/sources/model.cpp +++ b/sources/model.cpp @@ -22,11 +22,19 @@ 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); + } +} + void Model::setCenter(Vec& c) { position = c.clone(); for (std::vector::size_type i = 0 ; i < faces.size(); i++ ) { - faces.at(i)->setCenter(c); + faces.at(i)->setCenter(c); } } @@ -45,7 +53,7 @@ } void Model::rotate(Vec rot) { - rotation->add(rot); + rotation->add((Vec)rot); for (std::vector::size_type i = 0 ; i < faces.size(); i++ ) { faces.at(i)->rotate(rot); @@ -99,3 +107,16 @@ faces.at(i)->hideNormals(); } } + +Model* Model::clone() { + Model* nm = new Model(); + + for (std::vector::size_type i = 0 ; i < faces.size(); i++ ) { + nm->addFace(faces.at(i)->clone()); + } + + nm->setCenter(position); + nm->setDelta(delta); + + return nm; +} diff --git a/sources/poly.cpp b/sources/poly.cpp index 32576a9..d25e6fa 100755 --- a/sources/poly.cpp +++ b/sources/poly.cpp @@ -62,6 +62,10 @@ position = c.clone(); } +void Poly::setCenter(Vec* c) { + position = c->clone(); +} + /* * initial rotation relative to rotation center */ @@ -96,13 +100,13 @@ position = newcenter.clone(); for ( std::vector::size_type i = 0; i < initpoints.size(); i++ ) { - initpoints.at(i)->add(diff); + initpoints.at(i)->add((Vec)diff); } } //additional rotation in arcs void Poly::rotate(Vec rot) { - rotation->add(rot); + rotation->add((Vec)rot); } Vec Poly::rotate_x(Vec& c) { @@ -154,8 +158,8 @@ /* draw face normal */ glBegin(GL_LINES); nc.drawColor(); - glVertex3fv((calcCenter()-*position).c); - glVertex3fv((calcCenter()+(*normal * 3.0f)-*position).c); + glVertex3fv(calcCenter().c); + glVertex3fv((calcCenter()+(*normal * 3.0f)).c); glEnd(); /* draw vertex normals */ @@ -164,8 +168,8 @@ /* face normal */ glBegin(GL_LINES); nc.drawColor(); - glVertex3fv((*initpoints.at(i)-*position).c); - glVertex3fv((*initpoints.at(i)+(*normal * 1.5f)-*position).c); + glVertex3fv((*initpoints.at(i)).c); + glVertex3fv((*initpoints.at(i)+(*normal * 1.5f)).c); glEnd(); } else { /* vertex normal (delta) */ @@ -181,10 +185,12 @@ } } + n = n.normalize(); + glBegin(GL_LINES); nc.drawColor(); - glVertex3fv((*initpoints.at(i)-*position).c); - glVertex3fv((*initpoints.at(i)+(*normal * 1.5f)-*position).c); + glVertex3fv((*initpoints.at(i)).c); + glVertex3fv((*initpoints.at(i)+(n * 1.5f)).c); glEnd(); } } @@ -211,11 +217,13 @@ } } + n = n.normalize(); + glNormal3fv(n.c); } color->drawColor(); - glVertex3fv((*initpoints.at(i) - *position).c); + glVertex3fv((*initpoints.at(i)).c); } glEnd(); @@ -254,6 +262,10 @@ color = c.clone(); } +void Poly::setColor(Color* c) { + color = c->clone(); +} + Color* Poly::getColor() { return color; } @@ -269,3 +281,23 @@ void Poly::hideNormals() { drawNormals = false; } + +Poly* Poly::clone() { + Poly* np = new Poly(); + + for (std::vector::size_type i = 0 ; i < initpoints.size(); i++ ) { + np->addPoint(initpoints.at(i)->clone()); + } + + if ( drawNormals ) { + np->showNormals(); + } else { + np->hideNormals(); + } + + np->setDelta(delta); + np->setCenter(position); + np->setColor(color); + + return np; +} diff --git a/sources/vec.cpp b/sources/vec.cpp index 182f9c1..ad7f930 100755 --- a/sources/vec.cpp +++ b/sources/vec.cpp @@ -43,6 +43,17 @@ return Vec(x() + v.x(), y() + v.y(), z() + v.z()); } +void Vec::add(Vec a) { + c[0] += a.x(); + c[1] += a.y(); + c[2] += a.z(); +} + +void Vec::sub(Vec a) { + c[0] -= a.x(); + c[1] -= a.y(); + c[2] -= a.z(); +} void Vec::add(Vec& a) { c[0] += a.x();