void BMaxObject::UpdateGeometry() { SetGeometryDirty(false); if (m_pAnimatedMesh && m_pAnimatedMesh->IsLoaded()) { Vector3 vMin, vMax; if (m_pAnimatedMesh->GetBoundingBox(&vMin, &vMax)) { Matrix4 mat; GetLocalTransform(&mat); CShapeOBB obb(CShapeBox(vMin, vMax), mat); CShapeBox minmaxBox; minmaxBox.Extend(obb); if (GetScaling()!= 1.0){ minmaxBox.SetMinMax(minmaxBox.GetMin() * GetScaling(), minmaxBox.GetMax() * GetScaling()); } SetAABB(&minmaxBox.GetMin(), &minmaxBox.GetMax()); } UnloadPhysics(); if (m_dwPhysicsMethod == 0) m_dwPhysicsMethod = PHYSICS_LAZY_LOAD; else if (IsPhysicsEnabled() && ((m_dwPhysicsMethod&PHYSICS_ALWAYS_LOAD)>0)) { LoadPhysics(); } } }
void TMesh::Position(vector newCenter) { vector oldCenter = GetCenter(); Translate(newCenter-oldCenter); SetAABB(); }
void dgBroadPhaseAggregate::AddBody(dgBody* const body) { dgAssert(body->GetBroadPhase()); m_broadPhase->Remove(body); dgBroadPhaseBodyNode* const newNode = new (m_broadPhase->GetWorld()->GetAllocator()) dgBroadPhaseBodyNode(body); if (!m_root) { m_root = newNode; newNode->m_parent = this; } else { dgBroadPhaseTreeNode* const tmp = m_broadPhase->InsertNode(m_root, newNode); dgList<dgBroadPhaseTreeNode*>::dgListNode* const link = m_fitnessList.Append(tmp); tmp->m_fitnessNode = link; } body->m_broadPhaseaggregateNode = this; SetAABB (m_root->m_minBox, m_root->m_maxBox); for (dgBroadPhaseNode* ptr = this; ptr->m_parent; ptr = ptr->m_parent) { if (dgBoxInclusionTest(ptr->m_minBox, ptr->m_maxBox, ptr->m_parent->m_minBox, ptr->m_parent->m_maxBox)) { break; } dgVector minBox; dgVector maxBox; dgFloat32 area; area = m_broadPhase->CalculateSurfaceArea(ptr->m_parent, ptr, minBox, maxBox); ptr->m_parent->m_minBox = minBox; ptr->m_parent->m_maxBox = maxBox; ptr->m_parent->m_surfaceArea = area; } }
void TMesh::Scale(float scf) { for (int vi = 0; vi < vertsN; vi++) { verts[vi] = verts[vi] * scf; } SetAABB(); }
EntTriggerPush::EntTriggerPush(EngineExport *EE) : Entity(EE) { ClassName = "trigger_push"; SetAABB(Vector3f(-5, -5, -5), Vector3f(5, 5, 5)); // Link(); }
void TMesh::Rotate(vector axis, float theta) { vector center = GetCenter(); for (int vi = 0; vi < vertsN; vi++){ //vector d = center - axis; verts[vi].rotatePoint(center, axis, theta); normals[vi].rotateVector(axis, theta); } SetAABB(); }
void TMesh::ScaleToNewDiagonal(float newDiagonal) { float oldDiagonal = (aabb->corners[1] - aabb->corners[0]).length(); float sf = newDiagonal / oldDiagonal; V3 oldCenter = GetCenter(); Position(V3(0.0f, 0.0f, 0.0f)); Scale(sf); Position(oldCenter); SetAABB(); }
void TMesh::Scale(float scf) { vector center = GetCenter(); for (int vi = 0; vi < vertsN; vi++) { vector len = verts[vi] - center; len = len * scf; verts[vi] = center + len; } SetAABB(); }
EntHaste::EntHaste(EngineExport *EE) : Entity(EE) { ClassName = "light"; SetAABB(Vector3f(-20, -20, -20), Vector3f(20, 20, 30)); LoadMesh(String("basehaste/models/items/silencer/silencer.obj")); EE->AttachToWorld(this); float_time = 0; // Link(); }
TMesh::TMesh(V3 *vs, V3 *colors) { verts = 0; vertsN = 0; tris = 0; trisN = 0; normals = 0; cols = 0; aabb = 0; enabled = false; tcs = 0; texture = 0; texID = -1; vertsN = 4; verts = new V3[vertsN]; cols = new V3[vertsN]; normals = new V3[vertsN]; tcs = new float[2*vertsN]; trisN = 2; tris = new unsigned int[trisN*3]; int i = 0; tris[i++] = 0; tris[i++] = 1; tris[i++] = 2; tris[i++] = 2; tris[i++] = 3; tris[i++] = 0; V3 n = (vs[1]-vs[0])%(vs[2]-vs[0]).normalize(); for (int i = 0; i < vertsN; i++) { verts[i] = vs[i]; cols[i] = colors[i]; normals[i] = n; } tcs[0] = 0.0f; tcs[1] = 0.0f; tcs[2] = 0.0f; tcs[3] = 1.0f; tcs[4] = 1.0f; tcs[5] = 1.0f; tcs[6] = 1.0f; tcs[7] = 0.0f; enabled = true; SetAABB(); }
void TMesh::Position(V3 newCenter) { V3 oldCenter = GetCenter(); Translate(newCenter-oldCenter); SetAABB(); }
void TMesh::Translate(V3 tv) { for (int vi = 0; vi < vertsN; vi++) verts[vi] = verts[vi] + tv; SetAABB(); }
void TMesh::LoadBin(const char *fname) { ifstream ifs(fname, ios::binary); if (ifs.fail()) { cerr << "INFO: cannot open file: " << fname << endl; return; } ifs.read((char*)&vertsN, sizeof(int)); char yn; ifs.read(&yn, 1); // always xyz if (yn != 'y') { cerr << "INTERNAL ERROR: there should always be vertex xyz data" << endl; return; } if (verts) delete verts; verts = new V3[vertsN]; ifs.read(&yn, 1); // cols 3 floats if (cols) delete cols; cols = 0; if (yn == 'y') { cols = new V3[vertsN]; } ifs.read(&yn, 1); // normals 3 floats if (normals) delete normals; normals = 0; if (yn == 'y') { normals = new V3[vertsN]; } ifs.read(&yn, 1); // texture coordinates 2 floats //float *tcs = 0; // don't have texture coordinates for now if (tcs) delete tcs; tcs = 0; if (yn == 'y') { tcs = new float[vertsN*2]; } ifs.read((char*)verts, vertsN*3*sizeof(float)); // load verts if (cols) { ifs.read((char*)cols, vertsN*3*sizeof(float)); // load cols } if (normals) ifs.read((char*)normals, vertsN*3*sizeof(float)); // load normals if (tcs) ifs.read((char*)tcs, vertsN*2*sizeof(float)); // load texture coordinates ifs.read((char*)&trisN, sizeof(int)); if (tris) delete tris; tris = new unsigned int[trisN*3]; ifs.read((char*)tris, trisN*3*sizeof(unsigned int)); // read tiangles ifs.close(); SetAABB(); enabled = true; }
//Sets up a 3d quad with a texture and texture coord if given TMesh::TMesh(vector center, vector dims, unsigned int color, int texN, float tile) : aabb(0) { enabled = true; shade = false; this->dims = dims; vertsN = 8*3; trisN = 12; verts = new vector[vertsN]; cols = new vector[vertsN]; normals = new vector[vertsN]; tris = new unsigned int[trisN*3]; tcs = new float[(vertsN)*2]; for ( int i = 0; i < 3; i++ ) { int vi = 0; verts[(3*vi++)+i] = center + vector(-dims[0]/2.0f, +dims[1]/2.0f, +dims[2]/2.0f); verts[(3*vi++)+i] = center + vector(-dims[0]/2.0f, -dims[1]/2.0f, +dims[2]/2.0f); verts[(3*vi++)+i] = center + vector(+dims[0]/2.0f, +dims[1]/2.0f, +dims[2]/2.0f); verts[(3*vi++)+i] = center + vector(+dims[0]/2.0f, -dims[1]/2.0f, +dims[2]/2.0f); verts[(3*vi++)+i] = center + vector(+dims[0]/2.0f, +dims[1]/2.0f, -dims[2]/2.0f); verts[(3*vi++)+i] = center + vector(+dims[0]/2.0f, -dims[1]/2.0f, -dims[2]/2.0f); verts[(3*vi++)+i] = center + vector(-dims[0]/2.0f, +dims[1]/2.0f, -dims[2]/2.0f); verts[(3*vi++)+i] = center + vector(-dims[0]/2.0f, -dims[1]/2.0f, -dims[2]/2.0f); } for ( int vi = 0; vi < vertsN; vi++ ) { cols[vi].SetFromColor(color); } normals[0] = normals[3] = normals[7] = normals[10] = vector(0.0f, 0.0f, -1.0f); normals[6] = normals[9] = normals[13] = normals[16] = vector(1.0f, 0.0f, 0.0f); normals[12] = normals[15] = normals[19] = normals[22] = vector(0.0f, 0.0f, 1.0f); normals[18] = normals[21] = normals[1] = normals[4] = vector(-1.0f, 0.0f, 0.0f); normals[20] = normals[2] = normals[14] = normals[8] = vector(0.0f, 1.0f, 0.0f); normals[11] = normals[17] = normals[5] = normals[23] = vector(0.0f, -1.0f, 0.0f); int tri = 0; tris[3*tri+0] = 7; //2 tris[3*tri+1] = 0; //0 tris[3*tri+2] = 3; //1 tri++; tris[3*tri+0] = 3; //1 tris[3*tri+1] = 10; //3 tris[3*tri+2] = 7; //2 tri++; tris[3*tri+0] = 13; //4 tris[3*tri+1] = 6; //2 tris[3*tri+2] = 9; //3 tri++; tris[3*tri+0] = 9; //3 tris[3*tri+1] = 16; //5 tris[3*tri+2] = 13; //4 tri++; tris[3*tri+0] = 19; //6 tris[3*tri+1] = 12; //4 tris[3*tri+2] = 15; //5 tri++; tris[3*tri+0] = 15; //5 tris[3*tri+1] = 22; //7 tris[3*tri+2] = 19; //6 tri++; tris[3*tri+0] = 1; //0 tris[3*tri+1] = 18; //6 tris[3*tri+2] = 21; //7 tri++; tris[3*tri+0] = 21;//7 tris[3*tri+1] = 4; //1 tris[3*tri+2] = 1; //0 tri++; tris[3*tri+0] = 20; //6 tris[3*tri+1] = 2; //0 tris[3*tri+2] = 8; //2 tri++; tris[3*tri+0] = 8; //2 tris[3*tri+1] = 14; //4 tris[3*tri+2] = 20;//6 tri++; tris[3*tri+0] = 11; //3 tris[3*tri+1] = 5; //1 tris[3*tri+2] = 23; //7 tri++; tris[3*tri+0] = 23; //7 tris[3*tri+1] = 17; //5 tris[3*tri+2] = 11; //3 int tci = 0; //Hard coded in the texture as 2* vert +0|1 tcs[2*0] = 0.0f; tcs[2*0+1] = 0.0f; tcs[2*3] = tile; tcs[2*3+1] = 0.0f; tcs[2*7] = 0.0f; tcs[2*7+1] = tile; tcs[2*10] = tile; tcs[2*10+1] = tile; tcs[2*6] = 0.0f; tcs[2*6+1] = 0.0f; tcs[2*9] = tile; tcs[2*9+1] = 0.0f; tcs[2*13] = 0.0f; tcs[2*13+1] = tile; tcs[2*16] = tile; tcs[2*16+1] = tile; tcs[2*12] = 0.0f; tcs[2*12+1] = 0.0f; tcs[2*15] = tile; tcs[2*15+1] = 0.0f; tcs[2*19] = 0.0f; tcs[2*19+1] = tile; tcs[2*22] = tile; tcs[2*22+1] = tile; tcs[2*18] = 0.0f; tcs[2*18+1] = 0.0f; tcs[2*21] = tile; tcs[2*21+1] = 0.0f; tcs[2*1] = 0.0f; tcs[2*1+1] = tile; tcs[2*4] = tile; tcs[2*4+1] = tile; tcs[2*20] = 0.0f; tcs[2*20+1] = 0.0f; tcs[2*2] = tile; tcs[2*2+1] = 0.0f; tcs[2*14] = 0.0f; tcs[2*14+1] = tile; tcs[2*8] = tile; tcs[2*8+1] = tile; tcs[2*11] = 0.0f; tcs[2*11+1] = 0.0f; tcs[2*17] = tile; tcs[2*17+1] = 0.0f; tcs[2*5] = 0.0f; tcs[2*5+1] = tile; tcs[2*23] = tile; tcs[2*23+1] = tile; SetAABB(); RenderMode = MCI; if(texN == -1) return; texIndex = texN; RenderMode = TM; }
void TMesh::LoadBin(char *fname) { ifstream ifs(fname, ios::binary); if (ifs.fail()) { cerr << "INFO: cannot open file: " << fname << endl; return; } ifs.read((char*)&vertsN, sizeof(int)); char yn; ifs.read(&yn, 1); // always xyz if (yn != 'y') { cerr << "INTERNAL ERROR: there should always be vertex xyz data" << endl; return; } if (verts) delete verts; verts = new vector[vertsN]; ifs.read(&yn, 1); // cols 3 floats if (cols) delete cols; cols = 0; if (yn == 'y') { cols = new vector[vertsN]; } ifs.read(&yn, 1); // normals 3 floats if (normals) delete normals; normals = 0; if (yn == 'y') { normals = new vector[vertsN]; } ifs.read(&yn, 1); // texture coordinates 2 floats if (tcs) delete tcs; tcs = 0; if (yn == 'y') { tcs = new float[vertsN*2]; } ifs.read((char*)verts, vertsN*3*sizeof(float)); // load verts if (cols) { ifs.read((char*)cols, vertsN*3*sizeof(float)); // load cols } if (normals) ifs.read((char*)normals, vertsN*3*sizeof(float)); // load normals if (tcs) { ifs.read((char*)tcs, vertsN*2*sizeof(float)); // load texture coordinates } ifs.read((char*)&trisN, sizeof(int)); if (tris) delete tris; tris = new unsigned int[trisN*3]; ifs.read((char*)tris, trisN*3*sizeof(unsigned int)); // read tiangles ifs.close(); cerr << "INFO: loaded " << vertsN << " verts, " << trisN << " tris from " << endl << " " << fname << endl; cerr << " xyz " << ((cols) ? "rgb " : "") << ((normals) ? "nxnynz " : "") << ((tcs) ? "tcstct " : "") << endl; SetAABB(); enabled = true; }