diff --git a/Demos3/FiniteElementMethod/FiniteElementDemo.cpp b/Demos3/FiniteElementMethod/FiniteElementDemo.cpp index b445e20c9..04b5b7602 100644 --- a/Demos3/FiniteElementMethod/FiniteElementDemo.cpp +++ b/Demos3/FiniteElementMethod/FiniteElementDemo.cpp @@ -20,6 +20,7 @@ subject to the following restrictions: #include "FiniteElementDemo.h" #include "OpenGLWindow/CommonRenderInterface.h" #include "LinearMath/btQuaternion.h" +//#include "OpenGLWindow/ShapeData.h" #include "MyFemMesh.h" #include @@ -58,7 +59,8 @@ struct FiniteElementDemoInternalData real_type m_c_creep;// = .20; //--- controls how fast the plasticity effect occurs (it is a rate-like control). real_type m_c_max;// = 0.2; //--- This is maximum allowed plasticity strain (works as a maximum). double m_damp; - + int m_tetrahedralMeshRenderIndex; + FiniteElementDemoInternalData() { m_stiffness_warp_on= true; @@ -75,6 +77,7 @@ struct FiniteElementDemoInternalData m_c_creep = 0;//0.20;//.20; //--- controls how fast the plasticity effect occurs (it is a rate-like control). m_c_max = 1e30f;//0.2; //--- This is maximum allowed plasticity strain (works as a maximum). m_damp=0.2f; + m_tetrahedralMeshRenderIndex=-1; } }; @@ -87,13 +90,23 @@ m_z(0) { m_app->setUpAxis(2); m_data = new FiniteElementDemoInternalData; + + } FiniteElementDemo::~FiniteElementDemo() { delete m_data; m_app->m_renderer->enableBlend(false); + m_app->m_renderer->removeAllInstances(); } - + +struct MyTetVertex +{ + float x,y,z,w; + float nx,ny,nz; + float u,v; +}; + void FiniteElementDemo::initPhysics() { { @@ -130,9 +143,68 @@ void FiniteElementDemo::initPhysics() m_app->m_parameterInterface->registerSliderFloatParameter(slider); } + { + + + + + int strideInBytes = 9*sizeof(float); + int numVertices =m_data->m_mesh1.m_nodes.size(); + + btAlignedObjectArray verts; + verts.resize(numVertices); + for (int n=0;nm_mesh1.m_nodes.size();n++) + { + verts[n].x = m_data->m_mesh1.m_nodes[n].m_coord(0); + verts[n].y = m_data->m_mesh1.m_nodes[n].m_coord(1); + verts[n].z = m_data->m_mesh1.m_nodes[n].m_coord(2); + verts[n].w = 1; + verts[n].nx = 0; + verts[n].ny = 1; + verts[n].nz = 0; + verts[n].u = 0.5; + verts[n].v = 0.4; + + } + btAlignedObjectArray indices; + for (int t=0;tm_mesh1.m_tetrahedra.size();t++) + { + int index0 =m_data->m_mesh1.m_tetrahedra[t].m_nodes[0]; + int index1 =m_data->m_mesh1.m_tetrahedra[t].m_nodes[1]; + int index2 =m_data->m_mesh1.m_tetrahedra[t].m_nodes[2]; + int index3 =m_data->m_mesh1.m_tetrahedra[t].m_nodes[3]; + indices.push_back(index0); indices.push_back(index1); indices.push_back(index2); + indices.push_back(index2); indices.push_back(index1); indices.push_back(index3); + indices.push_back(index1); indices.push_back(index0); indices.push_back(index3); + indices.push_back(index0); indices.push_back(index2); indices.push_back(index3); + + } + + m_data->m_tetrahedralMeshRenderIndex = m_app->m_renderer->registerShape(&verts[0].x,verts.size(),&indices[0],indices.size()); + + float pos[4] = {0,0,0,1}; + float orn[4] = {0,0,0,1}; + float color[4] = {0,1,1,1}; + float scaling[4] = {1,1,1,1}; + m_app->m_renderer->registerGraphicsInstance(m_data->m_tetrahedralMeshRenderIndex,pos,orn,color,scaling); + } - - + { + //ground shape + btVector3 cubeHalfExtents(10,10,10); + cubeHalfExtents[m_app->getUpAxis()] = 0.01; + int cubeIn = m_app->registerCubeShape(cubeHalfExtents[0],cubeHalfExtents[1],cubeHalfExtents[2]); + + float pos[4] = {0,0,0,1}; + pos[m_app->getUpAxis()]=-0.02; + float orn[4] = {0,0,0,1}; + float color[4] = {0,1,1,1}; + float scaling[4] = {1,1,1,1}; + m_app->m_renderer->registerGraphicsInstance(cubeIn,pos,orn,color,scaling); + + + } + m_app->m_renderer->writeTransforms(); } void FiniteElementDemo::exitPhysics() { @@ -206,45 +278,48 @@ void FiniteElementDemo::stepSimulation(float deltaTime) } void FiniteElementDemo::renderScene() { + { + int strideInBytes = 9*sizeof(float); + int numVertices =m_data->m_mesh1.m_nodes.size(); + + btAlignedObjectArray verts; + verts.resize(numVertices); + for (int n=0;nm_mesh1.m_nodes.size();n++) + { + verts[n].x = m_data->m_mesh1.m_nodes[n].m_coord(0); + verts[n].y = m_data->m_mesh1.m_nodes[n].m_coord(1); + verts[n].z = m_data->m_mesh1.m_nodes[n].m_coord(2); + verts[n].w = 1; + verts[n].nx = 0; + verts[n].ny = 1; + verts[n].nz = 0; + verts[n].u = 0.5; + verts[n].v = 0.4; + + } + btAlignedObjectArray indices; + for (int t=0;tm_mesh1.m_tetrahedra.size();t++) + { + int index0 =m_data->m_mesh1.m_tetrahedra[t].m_nodes[0]; + int index1 =m_data->m_mesh1.m_tetrahedra[t].m_nodes[1]; + int index2 =m_data->m_mesh1.m_tetrahedra[t].m_nodes[2]; + int index3 =m_data->m_mesh1.m_tetrahedra[t].m_nodes[3]; + indices.push_back(index0); indices.push_back(index1); indices.push_back(index2); + indices.push_back(index2); indices.push_back(index1); indices.push_back(index3); + indices.push_back(index1); indices.push_back(index0); indices.push_back(index3); + indices.push_back(index0); indices.push_back(index2); indices.push_back(index3); + + } + + m_app->m_renderer->updateShape(m_data->m_tetrahedralMeshRenderIndex,&verts[0].x); + + } m_app->m_renderer->renderScene(); } void FiniteElementDemo::physicsDebugDraw() { -#if 0 - btVector3 xUnit(1,0,0); - btVector3 yUnit(0,1,0); - btVector3 zUnit(0,0,1); - - btScalar lineWidth=3; - - btQuaternion rotAroundX(xUnit,m_x); - btQuaternion rotAroundY(yUnit,m_y); - btQuaternion rotAroundZ(zUnit,m_z); - - btScalar radius=0.5; - btVector3 toX=radius*quatRotate(rotAroundX,yUnit); - btVector3 toY=radius*quatRotate(rotAroundY,xUnit); - btVector3 toZ=radius*quatRotate(rotAroundZ,xUnit); - - m_app->m_renderer->drawLine(xUnit+toX+quatRotate(rotAroundX,btVector3(0,0.1,-0.2)),xUnit+toX,xUnit,lineWidth); - m_app->m_renderer->drawLine(xUnit+toX+quatRotate(rotAroundX,btVector3(0,-0.2,-0.2)),xUnit+toX,xUnit,lineWidth); - //draw the letter 'x' on the x-axis - //m_app->m_renderer->drawLine(xUnit-0.1*zUnit+0.1*yUnit,xUnit+0.1*zUnit-0.1*yUnit,xUnit,lineWidth); - //m_app->m_renderer->drawLine(xUnit+0.1*zUnit+0.1*yUnit,xUnit-0.1*zUnit-0.1*yUnit,xUnit,lineWidth); - - m_app->m_renderer->drawLine(xUnit+toX+quatRotate(rotAroundX,btVector3(0,-0.2,-0.2)),xUnit+toX,xUnit,lineWidth); - - m_app->m_renderer->drawLine(yUnit+toY+quatRotate(rotAroundY,btVector3(-0.2,0,0.2)),yUnit+toY,yUnit,lineWidth); - m_app->m_renderer->drawLine(yUnit+toY+quatRotate(rotAroundY,btVector3(0.1,0,0.2)),yUnit+toY,yUnit,lineWidth); - m_app->m_renderer->drawLine(zUnit+toZ+quatRotate(rotAroundZ,btVector3(0.1,-0.2,0)),zUnit+toZ,zUnit,lineWidth); - m_app->m_renderer->drawLine(zUnit+toZ+quatRotate(rotAroundZ,btVector3(-0.2,-0.2,0)),zUnit+toZ,zUnit,lineWidth); -#endif - - //template - //inline void DrawPointsT4Mesh( point_container const& points, t4mesh const& mesh, double const& scale = 0.95, bool wireframe = false) { - //geometry::Tetrahedron T; // From OpenTissue/core/geometry/geometry_tetrahederon.h btAlignedObjectArray m_linePoints; btAlignedObjectArray m_lineIndices; diff --git a/btgui/OpenGLWindow/CommonRenderInterface.h b/btgui/OpenGLWindow/CommonRenderInterface.h index c0d915b92..013239ef3 100644 --- a/btgui/OpenGLWindow/CommonRenderInterface.h +++ b/btgui/OpenGLWindow/CommonRenderInterface.h @@ -43,7 +43,8 @@ struct CommonRenderInterface virtual void drawLine(const float from[4], const float to[4], const float color[4], float lineWidth) = 0; virtual void drawLine(const double from[4], const double to[4], const double color[4], double lineWidth) = 0; virtual int registerShape(const float* vertices, int numvertices, const int* indices, int numIndices,int primitiveType=B3_GL_TRIANGLES, int textureIndex=-1)=0; - + virtual void updateShape(int shapeIndex, const float* vertices)=0; + virtual void writeSingleInstanceTransformToCPU(const float* position, const float* orientation, int srcIndex)=0; virtual void writeSingleInstanceTransformToCPU(const double* position, const double* orientation, int srcIndex)=0; virtual void writeTransforms()=0; diff --git a/btgui/OpenGLWindow/GLInstancingRenderer.cpp b/btgui/OpenGLWindow/GLInstancingRenderer.cpp index 6751c4ea1..6eb62a5cf 100644 --- a/btgui/OpenGLWindow/GLInstancingRenderer.cpp +++ b/btgui/OpenGLWindow/GLInstancingRenderer.cpp @@ -690,6 +690,8 @@ void GLInstancingRenderer::updateShape(int shapeIndex, const float* vertices) glUnmapBuffer( GL_ARRAY_BUFFER); } + + int GLInstancingRenderer::registerShape(const float* vertices, int numvertices, const int* indices, int numIndices,int primitiveType, int textureId) { b3GraphicsInstance* gfxObj = new b3GraphicsInstance; diff --git a/btgui/OpenGLWindow/GLInstancingRenderer.h b/btgui/OpenGLWindow/GLInstancingRenderer.h index 1479b75a8..27e26faf8 100644 --- a/btgui/OpenGLWindow/GLInstancingRenderer.h +++ b/btgui/OpenGLWindow/GLInstancingRenderer.h @@ -64,7 +64,8 @@ public: ///vertices must be in the format x,y,z, nx,ny,nz, u,v virtual int registerShape(const float* vertices, int numvertices, const int* indices, int numIndices, int primitiveType=B3_GL_TRIANGLES, int textureIndex=-1); - + + virtual int registerTexture(const unsigned char* texels, int width, int height); ///position x,y,z, quaternion x,y,z,w, color r,g,b,a, scaling x,y,z