nuclear@0: #include nuclear@0: #include "zscn.h" nuclear@0: nuclear@0: struct Face { nuclear@0: Vector3 v[3]; nuclear@0: Vector3 n[3]; nuclear@0: Vector2 t[3]; nuclear@0: nuclear@0: const henge::Material *mat; nuclear@0: nuclear@0: Face() nuclear@0: { nuclear@0: memset(this, 0, sizeof(Face)); nuclear@0: } nuclear@0: }; nuclear@0: nuclear@0: static void proc_mesh(std::list *facelist, const henge::TriMesh *mesh, nuclear@0: const henge::Material *mat, const Matrix4x4 &xform); nuclear@0: static bool operator <(const Face &a, const Face &b); nuclear@0: nuclear@0: ZScene::~ZScene() nuclear@0: { nuclear@0: } nuclear@0: nuclear@0: void ZScene::render(unsigned int msec) const nuclear@0: { nuclear@0: setup_lights(msec); nuclear@0: nuclear@0: glMatrixMode(GL_MODELVIEW); nuclear@0: nuclear@0: Matrix4x4 view_mat; nuclear@0: henge::store_matrix(&view_mat); nuclear@0: nuclear@0: std::list facelist; nuclear@0: nuclear@0: for(size_t i=0; iget_xform_matrix(msec) * view_mat; nuclear@0: nuclear@0: const henge::Material *mat = ((henge::RObject*)obj)->get_material_ptr(); nuclear@0: const henge::TriMesh *mesh = obj->get_mesh(); nuclear@0: nuclear@0: proc_mesh(&facelist, mesh, mat, xform); nuclear@0: } nuclear@0: nuclear@0: facelist.sort(); nuclear@0: nuclear@0: glPushAttrib(GL_ENABLE_BIT); nuclear@0: glDisable(GL_DEPTH_TEST); nuclear@0: nuclear@0: glPushMatrix(); nuclear@0: glLoadIdentity(); nuclear@0: nuclear@0: glBegin(GL_TRIANGLES); nuclear@0: nuclear@0: const henge::Material *cur_mat = 0; nuclear@0: std::list::iterator face = facelist.begin(); nuclear@0: while(face != facelist.end()) { nuclear@0: if(face->mat != cur_mat) { nuclear@0: glEnd(); nuclear@0: nuclear@0: face->mat->bind(); nuclear@0: cur_mat = face->mat; nuclear@0: nuclear@0: glBegin(GL_TRIANGLES); nuclear@0: } nuclear@0: nuclear@0: for(int i=0; i<3; i++) { nuclear@0: glNormal3f(face->n[i].x, face->n[i].y, face->n[i].z); nuclear@0: glTexCoord2f(face->t[i].x, face->t[i].y); nuclear@0: glVertex3f(face->v[i].x, face->v[i].y, face->v[i].z); nuclear@0: } nuclear@0: nuclear@0: face++; nuclear@0: } nuclear@0: glEnd(); nuclear@0: nuclear@0: glMatrixMode(GL_MODELVIEW); nuclear@0: glPopMatrix(); nuclear@0: glPopAttrib(); nuclear@0: } nuclear@0: nuclear@0: static void proc_mesh(std::list *facelist, const henge::TriMesh *mesh, nuclear@0: const henge::Material *mat, const Matrix4x4 &xform) nuclear@0: { nuclear@0: Matrix3x3 norm_xform = xform; nuclear@0: nuclear@0: const Vector3 *vert = mesh->get_data_vec3(henge::EL_VERTEX); nuclear@0: const Vector3 *norm = mesh->get_data_vec3(henge::EL_NORMAL); nuclear@0: const Vector2 *tc = mesh->get_data_vec2(henge::EL_TEXCOORD); nuclear@0: const unsigned int *index = mesh->get_data_int(henge::EL_INDEX); nuclear@0: nuclear@0: int nvert = mesh->get_count(henge::EL_VERTEX); nuclear@0: int nindex = mesh->get_count(henge::EL_INDEX); nuclear@0: nuclear@0: if(!vert || !nvert) { nuclear@0: return; nuclear@0: } nuclear@0: nuclear@0: int face_count = (index ? nindex : nvert) / 3; nuclear@0: nuclear@0: for(int i=0; ipush_back(face); nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: static bool operator <(const Face &a, const Face &b) nuclear@0: { nuclear@0: return (a.v[0].z + a.v[1].z + a.v[2].z) < (b.v[0].z + b.v[1].z + b.v[2].z); nuclear@0: }