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]); }
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); }
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); }