Esempio n. 1
0
void GenerateTriangleMesh(Ogre::Mesh* mesh, btTriangleMesh* ptr)
{
    std::vector<float3> triangles;
    GetTrianglesFromMesh(mesh, triangles);
    
    for(uint i = 0; i < triangles.size(); i += 3)
        ptr->addTriangle(triangles[i], triangles[i+1], triangles[i+2]);
}
Esempio n. 2
0
void GenerateConvexHullSet(Ogre::Mesh* mesh, ConvexHullSet* ptr)
{
    std::vector<float3> vertices;
    GetTrianglesFromMesh(mesh, vertices);
    if (!vertices.size())
    {
        LogError("Mesh had no triangles; aborting convex hull generation");
        return;
    }
    
    StanHull::HullDesc desc;
    desc.SetHullFlag(StanHull::QF_TRIANGLES);
    desc.mVcount = (uint)vertices.size();
    desc.mVertices = &vertices[0].x;
    desc.mVertexStride = sizeof(float3);
    desc.mSkinWidth = 0.01f; // Hardcoded skin width
    
    StanHull::HullLibrary lib;
    StanHull::HullResult result;
    lib.CreateConvexHull(desc, result);

    if (!result.mNumOutputVertices)
    {
        LogError("No vertices were generated; aborting convex hull generation");
        return;
    }
    
    ConvexHull hull;
    hull.position_ = float3(0,0,0);
    /// \todo StanHull always produces only 1 hull. Therefore using a hull set is unnecessary and could be optimized away
#include "DisableMemoryLeakCheck.h"
    hull.hull_ = shared_ptr<btConvexHullShape>(new btConvexHullShape((const btScalar*)&result.mOutputVertices[0], result.mNumOutputVertices, 3 * sizeof(float)));
#include "EnableMemoryLeakCheck.h"
    ptr->hulls_.push_back(hull);
    
    lib.ReleaseResult(result);
}
Esempio n. 3
0
void Render(int width, int height, char *fileName, Vector3 cam)
{
	Vector3 o; o.x = 0.f; o.y = 0.f; o.z = 0.f;
	Transform or = MakeTranslation(&o);

    //Initializemesh
	TriangleMesh mesh;
	Material mat; mat.red = 255.f; mat.green = 0.f; mat.blue = 0.f;
	FormTriangleMesh(fileName, &mesh, &or, &mat);
	printf("TriangleMesh Formed correctly\n");
	Triangle * tris = malloc(sizeof(Triangle)*mesh.numTris);
	GetTrianglesFromMesh(&mesh, tris);
	printf("Triangles Harvested correctly\n");

	InitializePixels(width, height);
	MakeWindow(width, height);

	Triangle *rasterTris; TriangleMesh *rasterMesh;
	PrepareRasterizedDataBuffers(tris, &mesh, &rasterTris, &rasterMesh);
	printf("Finished Prepping Secondary Buffer\n");


	Vector3 move;move.x=0.f; move.z=0.f; Transform moveT, rasterTrans; //Preallocations
	float yaxis = 130.f;
	struct timespec timeobj;
	clock_gettime(CLOCK_MONOTONIC, &timeobj);
	double startTime = timeobj.tv_sec*1000.0 + timeobj.tv_nsec/1000000.0;
	float prevTime = timeobj.tv_sec + timeobj.tv_nsec/1000000000.0;
	float currTime = 0.0f;
	float dt = 0.001f;
	printf("\n");
	long i; for (i=0;i<300;++i) 
	{
		clock_gettime(CLOCK_MONOTONIC, &timeobj);
		currTime = timeobj.tv_sec + timeobj.tv_nsec/1000000000.0;
		
		dt = Maximum(currTime-prevTime, 0.00001f); 
		
		//Make him move
		yaxis += 60.f*dt;
		Transform meshRotY = RotateY(yaxis);//130
		Transform meshRotX = RotateX(270.f);//270
	    TransformTrans(&meshRotY, &meshRotX, &rasterTrans);
		move.x = 0.2f*dt+move.x; move.y = 0.f; move.z = 0.f;
		moveT = MakeTranslation(&move);
	    TransformTrans(&moveT, &rasterTrans, &rasterTrans);
	    BuildRasterTransform(&rasterTrans, width, height);
	    TransformTrianglesAndMesh(tris, &rasterTrans, rasterTris, rasterMesh);

		//Render Mesh to buffer
		RenderMesh(width, height, rasterTris);

		//Display Pixels
		UpdateWindow(Pixels, width, height);

		//Reset to Gray
		ResetBuffer(width, height);

		//currTime is the prevtTime
		prevTime = currTime;
	}
	clock_gettime(CLOCK_MONOTONIC, &timeobj);
	double endTime = timeobj.tv_sec*1000.0 + timeobj.tv_nsec/1000000.0;
	double finalTime = (endTime-startTime)/300.0;
	printf("Rendering at %fms per frame on avg\n", finalTime);


	//Release Pixels
	ReleasePixels(width, height);
	ReleaseTriangleDataOnly(tris);
}