From e9cc1520bfbc28c1c62a14d1f0e625ca8549d9d4 Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Sun, 20 Nov 2011 16:37:19 +0000 Subject: Added origin brush support for func_rotate. --- src/model/mapfile.cc | 106 ++++++++++++++++++++++++++++++-------------------- src/model/material.cc | 5 +++ 2 files changed, 69 insertions(+), 42 deletions(-) (limited to 'src/model') diff --git a/src/model/mapfile.cc b/src/model/mapfile.cc index 2cbee2b..7020d47 100644 --- a/src/model/mapfile.cc +++ b/src/model/mapfile.cc @@ -948,64 +948,74 @@ void MapFile::make_brushface(Face *face) primitives = (*mit).second; } - // add vertices to the bounding box - for (std::vector::iterator it = vl.begin(); it != vl.end(); it++) { - class_box.expand(*(*it) * SCALE); - } + if ((face->material()->flags() & Material::Origin)) { + // add vertices to the origin list + for (std::vector::iterator it = vl.begin(); it != vl.end(); it++) { + class_origin_vertices.push_back(new math::Vector3f((*(*it) * SCALE))); + } + + } else { + + // add vertices to the bounding box + for (std::vector::iterator it = vl.begin(); it != vl.end(); it++) { + class_box.expand(*(*it) * SCALE); + } - // the actual polygon normal is on the other side - Vector3f face_normal(face->normal()* -1); - face_normal.normalize(); + // the actual polygon normal is on the other side + Vector3f face_normal(face->normal()* -1); + face_normal.normalize(); - // clip faces have to be triangulated and can not be split into quads - if (!(face->material()->flags() & Material::Clip)) { + // clip faces have to be triangulated and can not be split into quads + if (!(face->material()->flags() & Material::Clip)) { + + // split polygon into quads + while (vl.size() > 3) { + std::vector::iterator v0 = vl.begin(); + std::vector::reverse_iterator vn = vl.rbegin(); + std::vector::reverse_iterator vn1 = vl.rbegin(); + ++vn1; + std::vector::reverse_iterator vn2 = vl.rbegin(); + ++vn2; + ++vn2; + + Quad *quad = new Quad(*(*vn2) * SCALE, *(*vn1) * SCALE, *(*vn) * SCALE, *(*v0) * SCALE, face_normal, face->detail()); + primitives->add_quad(quad); + + if (face->material()->flags() & Material::Texture) { + quad->t0().assign(map_texture_coords(face, *(*vn2))); + quad->t1().assign(map_texture_coords(face, *(*vn1))); + quad->t2().assign(map_texture_coords(face, *(*vn))); + quad->t3().assign(map_texture_coords(face, *(*v0))); + } + + delete(*vn); + delete(*vn1); + vl.pop_back(); + vl.pop_back(); + } + } - // split polygon into quads - while (vl.size() > 3) { + // split polygon into triangles + while (vl.size() > 2) { std::vector::iterator v0 = vl.begin(); std::vector::reverse_iterator vn = vl.rbegin(); std::vector::reverse_iterator vn1 = vl.rbegin(); ++vn1; - std::vector::reverse_iterator vn2 = vl.rbegin(); - ++vn2; - ++vn2; - Quad *quad = new Quad(*(*vn2) * SCALE, *(*vn1) * SCALE, *(*vn) * SCALE, *(*v0) * SCALE, face_normal, face->detail()); - primitives->add_quad(quad); + Triangle * triangle = new Triangle(*(*vn1) * SCALE, *(*vn) * SCALE, *(*v0) * SCALE, face_normal, face->detail()); + primitives->add_triangle(triangle); if (face->material()->flags() & Material::Texture) { - quad->t0().assign(map_texture_coords(face, *(*vn2))); - quad->t1().assign(map_texture_coords(face, *(*vn1))); - quad->t2().assign(map_texture_coords(face, *(*vn))); - quad->t3().assign(map_texture_coords(face, *(*v0))); + triangle->t0().assign(map_texture_coords(face, *(*vn1))); + triangle->t1().assign(map_texture_coords(face, *(*vn))); + triangle->t2().assign(map_texture_coords(face, *(*v0))); } - + delete(*vn); - delete(*vn1); - vl.pop_back(); vl.pop_back(); } } - // split polygon into triangles - while (vl.size() > 2) { - std::vector::iterator v0 = vl.begin(); - std::vector::reverse_iterator vn = vl.rbegin(); - std::vector::reverse_iterator vn1 = vl.rbegin(); - ++vn1; - - Triangle * triangle = new Triangle(*(*vn1) * SCALE, *(*vn) * SCALE, *(*v0) * SCALE, face_normal, face->detail()); - primitives->add_triangle(triangle); - - if (face->material()->flags() & Material::Texture) { - triangle->t0().assign(map_texture_coords(face, *(*vn1))); - triangle->t1().assign(map_texture_coords(face, *(*vn))); - triangle->t2().assign(map_texture_coords(face, *(*v0))); - } - - delete(*vn); - vl.pop_back(); - } } else { con_warn << name() << " unresolved brush face at line " << line() << std::endl; } @@ -1196,6 +1206,18 @@ void MapFile::load_fragmentgroup(Model *model, const FragmentGroup::Type class_t group->set_speed(class_speed); group->set_engine(class_engine); group->set_movement(class_axis.forward()); + + // origin bruhes override group center + if (class_origin_vertices.size()) { + math::Vector3f v; + for (std::vector::iterator i = class_origin_vertices.begin(); i != class_origin_vertices.end(); i++) { + v += *(*i); + } + + v /= (float) class_origin_vertices.size(); + translation.assign(v); + group->set_location(translation); + } break; case FragmentGroup::Move: diff --git a/src/model/material.cc b/src/model/material.cc index 2f32f6c..56bb3fc 100644 --- a/src/model/material.cc +++ b/src/model/material.cc @@ -68,6 +68,9 @@ void Material::print() } if (flags() & Clip) { con_print << "clip "; + } + if (flags() & Origin) { + con_print << "origin "; } } con_print << std::endl; @@ -238,6 +241,8 @@ void Material::load_shader(const std::string &shadername) material->set_flags(Ignore); } else if (firstword.compare("clip") == 0) { material->set_flags(Clip); + } else if (firstword.compare("origin") == 0) { + material->set_flags(Origin); } else if (firstword.compare("qer_editorimage") == 0) { // keyword qer_editorimage is ignored continue; -- cgit v1.2.3