Exemple #1
0
	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();
			}
		}
	}
Exemple #2
0
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;
    }
}
Exemple #4
0
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();
}
Exemple #6
0
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();
}
Exemple #7
0
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();
}
Exemple #8
0
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();

}
Exemple #9
0
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();
}
Exemple #10
0
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();
}
Exemple #11
0
void TMesh::Position(V3 newCenter) {

    V3 oldCenter = GetCenter();
    Translate(newCenter-oldCenter);
    SetAABB();
}
Exemple #12
0
void TMesh::Translate(V3 tv) {

    for (int vi = 0; vi < vertsN; vi++)
        verts[vi] = verts[vi] + tv;
    SetAABB();
}
Exemple #13
0
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;
}
Exemple #14
0
//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;
}
Exemple #15
0
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;

}