diff --git a/data/sphere_transparent.urdf b/data/sphere_transparent.urdf
new file mode 100644
index 000000000..d856b5a26
--- /dev/null
+++ b/data/sphere_transparent.urdf
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/Collision/CollisionTutorialBullet2.cpp b/examples/Collision/CollisionTutorialBullet2.cpp
index 8159f89ee..6e65ac0cd 100644
--- a/examples/Collision/CollisionTutorialBullet2.cpp
+++ b/examples/Collision/CollisionTutorialBullet2.cpp
@@ -79,7 +79,6 @@ public:
gTotalPoints = 0;
m_app->setUpAxis(1);
- m_app->m_renderer->enableBlend(true);
switch (m_tutorialIndex)
{
@@ -250,7 +249,6 @@ public:
m_timeSeriesCanvas0 = 0;
- m_app->m_renderer->enableBlend(false);
}
diff --git a/examples/OpenGLWindow/GLInstancingRenderer.cpp b/examples/OpenGLWindow/GLInstancingRenderer.cpp
index a1eb298e0..3796bf371 100644
--- a/examples/OpenGLWindow/GLInstancingRenderer.cpp
+++ b/examples/OpenGLWindow/GLInstancingRenderer.cpp
@@ -2046,9 +2046,9 @@ void GLInstancingRenderer::renderSceneInternal(int renderMode)
b3Vector3 center = b3MakeVector3(0,0,0);
//float upf[3];
//m_data->m_activeCamera->getCameraUpVector(upf);
- b3Vector3 up, fwd;
+ b3Vector3 up, lightFwd;
b3Vector3 lightDir = m_data->m_lightPos.normalized();
- b3PlaneSpace1(lightDir,up,fwd);
+ b3PlaneSpace1(lightDir,up,lightFwd);
// b3Vector3 up = b3MakeVector3(upf[0],upf[1],upf[2]);
b3CreateLookAt(m_data->m_lightPos,center,up,&depthViewMatrix[0][0]);
//b3CreateLookAt(lightPos,m_data->m_cameraTargetPosition,b3Vector3(0,1,0),(float*)depthModelViewMatrix2);
@@ -2108,207 +2108,194 @@ b3Assert(glGetError() ==GL_NO_ERROR);
{
totalNumInstances+=m_graphicsInstances[i]->m_numGraphicsInstances;
}
-
- int curOffset = 0;
- //GLuint lastBindTexture = 0;
-
- for (int i=0;i transparentInstances;
+
{
+ int curOffset = 0;
+ //GLuint lastBindTexture = 0;
- b3GraphicsInstance* gfxObj = m_graphicsInstances[i];
- if (gfxObj->m_numGraphicsInstances)
+ transparentInstances.reserve(totalNumInstances);
+
+ for (int obj=0;objm_texturehandle)
- curBindTexture = gfxObj->m_texturehandle;
- else
- curBindTexture = m_data->m_defaultTexturehandle;
-
-//disable lazy evaluation, it just leads to bugs
- //if (lastBindTexture != curBindTexture)
+ b3GraphicsInstance* gfxObj = m_graphicsInstances[obj];
+ if (gfxObj->m_numGraphicsInstances)
{
- glBindTexture(GL_TEXTURE_2D,curBindTexture);
- }
- //lastBindTexture = curBindTexture;
-
-b3Assert(glGetError() ==GL_NO_ERROR);
- // int myOffset = gfxObj->m_instanceOffset*4*sizeof(float);
-
- int POSITION_BUFFER_SIZE = (totalNumInstances*sizeof(float)*4);
- int ORIENTATION_BUFFER_SIZE = (totalNumInstances*sizeof(float)*4);
- int COLOR_BUFFER_SIZE = (totalNumInstances*sizeof(float)*4);
-// int SCALE_BUFFER_SIZE = (totalNumInstances*sizeof(float)*3);
-
- glBindVertexArray(gfxObj->m_cube_vao);
-
-
- int vertexStride = 9*sizeof(float);
- PointerCaster vertex;
- vertex.m_baseIndex = gfxObj->m_vertexArrayOffset*vertexStride;
-
-
- glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 9*sizeof(float), vertex.m_pointer);
- glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, (GLvoid *)(curOffset*4*sizeof(float)+m_data->m_maxShapeCapacityInBytes));
- glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, 0, (GLvoid *)(curOffset*4*sizeof(float)+m_data->m_maxShapeCapacityInBytes+POSITION_BUFFER_SIZE));
-
- PointerCaster uv;
- uv.m_baseIndex = 7*sizeof(float)+vertex.m_baseIndex;
-
- PointerCaster normal;
- normal.m_baseIndex = 4*sizeof(float)+vertex.m_baseIndex;
-
- glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, 9*sizeof(float), uv.m_pointer);
- glVertexAttribPointer(4, 3, GL_FLOAT, GL_FALSE, 9*sizeof(float), normal.m_pointer);
- glVertexAttribPointer(5, 4, GL_FLOAT, GL_FALSE, 0, (GLvoid *)(curOffset*4*sizeof(float)+m_data->m_maxShapeCapacityInBytes+POSITION_BUFFER_SIZE+ORIENTATION_BUFFER_SIZE));
- glVertexAttribPointer(6, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid *)(curOffset*3*sizeof(float)+m_data->m_maxShapeCapacityInBytes+POSITION_BUFFER_SIZE+ORIENTATION_BUFFER_SIZE+COLOR_BUFFER_SIZE));
-
- glEnableVertexAttribArray(0);
- glEnableVertexAttribArray(1);
- glEnableVertexAttribArray(2);
- glEnableVertexAttribArray(3);
- glEnableVertexAttribArray(4);
- glEnableVertexAttribArray(5);
- glEnableVertexAttribArray(6);
- glVertexAttribDivisor(0, 0);
- glVertexAttribDivisor(1, 1);
- glVertexAttribDivisor(2, 1);
- glVertexAttribDivisor(3, 0);
- glVertexAttribDivisor(4, 0);
- glVertexAttribDivisor(5, 1);
- glVertexAttribDivisor(6, 1);
-
-
-
-
-
-
- int indexCount = gfxObj->m_numIndices;
- GLvoid* indexOffset = 0;
-
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, gfxObj->m_index_vbo);
- {
- B3_PROFILE("glDrawElementsInstanced");
-
- if (gfxObj->m_primitiveType==B3_GL_POINTS)
+ SortableTransparentInstance inst;
+
+ inst.m_shapeIndex = obj;
+
+
+ if ((gfxObj->m_flags&eGfxTransparency)==0)
{
- glUseProgram(instancingShaderPointSprite);
- glUniformMatrix4fv(ProjectionMatrixPointSprite, 1, false, &m_data->m_projectionMatrix[0]);
- glUniformMatrix4fv(ModelViewMatrixPointSprite, 1, false, &m_data->m_viewMatrix[0]);
- glUniform1f(screenWidthPointSprite,float(m_screenWidth));
-
- //glUniform1i(uniform_texture_diffusePointSprite, 0);
- b3Assert(glGetError() ==GL_NO_ERROR);
- glPointSize(20);
-
-#ifndef __APPLE__
- glEnable(GL_POINT_SPRITE_ARB);
-// glTexEnvi(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE);
-#endif
-
- glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
- glDrawElementsInstanced(GL_POINTS, indexCount, GL_UNSIGNED_INT, indexOffset, gfxObj->m_numGraphicsInstances);
+ inst.m_instanceId = curOffset;
+ inst.m_centerPosition.setValue(m_data->m_instance_positions_ptr[inst.m_instanceId*4+0],
+ m_data->m_instance_positions_ptr[inst.m_instanceId*4+1],
+ m_data->m_instance_positions_ptr[inst.m_instanceId*4+2]);
+ inst.m_centerPosition *= -1;//reverse sort opaque instances
+ transparentInstances.push_back(inst);
} else
{
- switch (renderMode)
+ for (int i=0;im_numGraphicsInstances;i++)
{
-
- case B3_DEFAULT_RENDERMODE:
- {
- glUseProgram(instancingShader);
- glUniformMatrix4fv(ProjectionMatrix, 1, false, &m_data->m_projectionMatrix[0]);
- glUniformMatrix4fv(ModelViewMatrix, 1, false, &m_data->m_viewMatrix[0]);
-
- b3Vector3 gLightDir = m_data->m_lightPos;
- gLightDir.normalize();
- glUniform3f(regularLightDirIn,gLightDir[0],gLightDir[1],gLightDir[2]);
-
- glUniform1i(uniform_texture_diffuse, 0);
- glDrawElementsInstanced(GL_TRIANGLES, indexCount, GL_UNSIGNED_INT, indexOffset, gfxObj->m_numGraphicsInstances);
- break;
- }
- case B3_CREATE_SHADOWMAP_RENDERMODE:
- {
- /*printf("createShadowMapInstancingShader=%d\n",createShadowMapInstancingShader);
- printf("createShadow_depthMVP=%d\n",createShadow_depthMVP);
- printf("indexOffset=%d\n",indexOffset);
- printf("gfxObj->m_numGraphicsInstances=%d\n",gfxObj->m_numGraphicsInstances);
- printf("indexCount=%d\n",indexCount);
- */
-
- glUseProgram(createShadowMapInstancingShader);
- glUniformMatrix4fv(createShadow_depthMVP, 1, false, &depthMVP[0][0]);
- glDrawElementsInstanced(GL_TRIANGLES, indexCount, GL_UNSIGNED_INT, indexOffset, gfxObj->m_numGraphicsInstances);
- break;
- }
-
- case B3_USE_SHADOWMAP_RENDERMODE:
- {
- if ( gfxObj->m_flags&eGfxTransparency)
- {
- glDepthMask(false);
- glEnable (GL_BLEND);
- glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- }
-
- glUseProgram(useShadowMapInstancingShader);
- glUniformMatrix4fv(useShadow_ProjectionMatrix, 1, false, &m_data->m_projectionMatrix[0]);
- glUniformMatrix4fv(useShadow_ModelViewMatrix, 1, false, &m_data->m_viewMatrix[0]);
- glUniformMatrix4fv(useShadow_ViewMatrixInverse, 1, false, &m_data->m_viewMatrixInverse[0]);
- glUniformMatrix4fv(useShadow_ModelViewMatrix, 1, false, &m_data->m_viewMatrix[0]);
-
- glUniform3f(useShadow_lightSpecularIntensity, m_data->m_lightSpecularIntensity[0],m_data->m_lightSpecularIntensity[1],m_data->m_lightSpecularIntensity[2]);
- glUniform3f(useShadow_materialSpecularColor, gfxObj->m_materialSpecularColor[0],gfxObj->m_materialSpecularColor[1],gfxObj->m_materialSpecularColor[2]);
-
-
-
- float MVP[16];
- b3Matrix4x4Mul16(m_data->m_projectionMatrix,m_data->m_viewMatrix,MVP);
- glUniformMatrix4fv(useShadow_MVP, 1, false, &MVP[0]);
- //gLightDir.normalize();
- glUniform3f(useShadow_lightPosIn,m_data->m_lightPos[0],m_data->m_lightPos[1],m_data->m_lightPos[2]);
- float camPos[3];
- m_data->m_activeCamera->getCameraPosition(camPos);
- glUniform3f(useShadow_cameraPositionIn,camPos[0],camPos[1],camPos[2]);
- glUniform1f(useShadow_materialShininessIn,gfxObj->m_materialShinyNess);
-
- glUniformMatrix4fv(useShadow_DepthBiasModelViewMatrix, 1, false, &depthBiasMVP[0][0]);
- glActiveTexture(GL_TEXTURE1);
- glBindTexture(GL_TEXTURE_2D, m_data->m_shadowTexture);
- glUniform1i(useShadow_shadowMap,1);
-
- //sort transparent objects
-
- //gfxObj->m_instanceOffset
-
- if ( gfxObj->m_flags&eGfxTransparency)
- {
- b3AlignedObjectArray transparentInstances;
- transparentInstances.reserve(gfxObj->m_numGraphicsInstances);
-
- for (int i=0;im_numGraphicsInstances;i++)
- {
- SortableTransparentInstance inst;
-
- inst.m_shapeIndex = -1;
-
- inst.m_instanceId = curOffset+i;
- inst.m_centerPosition.setValue(m_data->m_instance_positions_ptr[inst.m_instanceId*4+0],
+ inst.m_instanceId = curOffset+i;
+ inst.m_centerPosition.setValue(m_data->m_instance_positions_ptr[inst.m_instanceId*4+0],
m_data->m_instance_positions_ptr[inst.m_instanceId*4+1],
m_data->m_instance_positions_ptr[inst.m_instanceId*4+2]);
- transparentInstances.push_back(inst);
+ transparentInstances.push_back(inst);
+ }
+ }
+ curOffset+=gfxObj->m_numGraphicsInstances;
+ }
+ }
+ TransparentDistanceSortPredicate sorter;
+ float fwd[3];
+ m_data->m_activeCamera->getCameraForwardVector(fwd);
+ sorter.m_camForwardVec.setValue(fwd[0],fwd[1],fwd[2]);
+ transparentInstances.quickSort(sorter);
+ }
- }
- TransparentDistanceSortPredicate sorter;
- float fwd[3];
- m_data->m_activeCamera->getCameraForwardVector(fwd);
- sorter.m_camForwardVec.setValue(fwd[0],fwd[1],fwd[2]);
- transparentInstances.quickSort(sorter);
+
+ //two passes: first for opaque instances, second for transparent ones.
+ for (int pass = 0; pass<2;pass++)
+ {
+ for (int i=0;im_flags&eGfxTransparency)==0);
+
+ //transparent objects don't cast shadows (to simplify things)
+ if (gfxObj->m_flags&eGfxTransparency)
+ {
+ if (renderMode==B3_CREATE_SHADOWMAP_RENDERMODE)
+ drawThisPass = 0;
+ }
+
+ if (drawThisPass && gfxObj->m_numGraphicsInstances)
+ {
+ glActiveTexture(GL_TEXTURE0);
+ GLuint curBindTexture = 0;
+ if (gfxObj->m_texturehandle)
+ curBindTexture = gfxObj->m_texturehandle;
+ else
+ curBindTexture = m_data->m_defaultTexturehandle;
+
+ //disable lazy evaluation, it just leads to bugs
+ //if (lastBindTexture != curBindTexture)
+ {
+ glBindTexture(GL_TEXTURE_2D,curBindTexture);
+ }
+ //lastBindTexture = curBindTexture;
+
+ b3Assert(glGetError() ==GL_NO_ERROR);
+ // int myOffset = gfxObj->m_instanceOffset*4*sizeof(float);
+
+ int POSITION_BUFFER_SIZE = (totalNumInstances*sizeof(float)*4);
+ int ORIENTATION_BUFFER_SIZE = (totalNumInstances*sizeof(float)*4);
+ int COLOR_BUFFER_SIZE = (totalNumInstances*sizeof(float)*4);
+ // int SCALE_BUFFER_SIZE = (totalNumInstances*sizeof(float)*3);
+
+ glBindVertexArray(gfxObj->m_cube_vao);
- for (int i=0;im_vertexArrayOffset*vertexStride;
+
+
+ glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 9*sizeof(float), vertex.m_pointer);
+ glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, (GLvoid *)(transparentInstances[i].m_instanceId*4*sizeof(float)+m_data->m_maxShapeCapacityInBytes));
+ glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, 0, (GLvoid *)(transparentInstances[i].m_instanceId*4*sizeof(float)+m_data->m_maxShapeCapacityInBytes+POSITION_BUFFER_SIZE));
+
+ PointerCaster uv;
+ uv.m_baseIndex = 7*sizeof(float)+vertex.m_baseIndex;
+
+ PointerCaster normal;
+ normal.m_baseIndex = 4*sizeof(float)+vertex.m_baseIndex;
+
+ glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, 9*sizeof(float), uv.m_pointer);
+ glVertexAttribPointer(4, 3, GL_FLOAT, GL_FALSE, 9*sizeof(float), normal.m_pointer);
+ glVertexAttribPointer(5, 4, GL_FLOAT, GL_FALSE, 0, (GLvoid *)(transparentInstances[i].m_instanceId*4*sizeof(float)+m_data->m_maxShapeCapacityInBytes+POSITION_BUFFER_SIZE+ORIENTATION_BUFFER_SIZE));
+ glVertexAttribPointer(6, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid *)(transparentInstances[i].m_instanceId*3*sizeof(float)+m_data->m_maxShapeCapacityInBytes+POSITION_BUFFER_SIZE+ORIENTATION_BUFFER_SIZE+COLOR_BUFFER_SIZE));
+
+ glEnableVertexAttribArray(0);
+ glEnableVertexAttribArray(1);
+ glEnableVertexAttribArray(2);
+ glEnableVertexAttribArray(3);
+ glEnableVertexAttribArray(4);
+ glEnableVertexAttribArray(5);
+ glEnableVertexAttribArray(6);
+ glVertexAttribDivisor(0, 0);
+ glVertexAttribDivisor(1, 1);
+ glVertexAttribDivisor(2, 1);
+ glVertexAttribDivisor(3, 0);
+ glVertexAttribDivisor(4, 0);
+ glVertexAttribDivisor(5, 1);
+ glVertexAttribDivisor(6, 1);
+
+
+
+
+
+
+ int indexCount = gfxObj->m_numIndices;
+ GLvoid* indexOffset = 0;
+
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, gfxObj->m_index_vbo);
+ {
+ B3_PROFILE("glDrawElementsInstanced");
+
+ if (gfxObj->m_primitiveType==B3_GL_POINTS)
+ {
+ glUseProgram(instancingShaderPointSprite);
+ glUniformMatrix4fv(ProjectionMatrixPointSprite, 1, false, &m_data->m_projectionMatrix[0]);
+ glUniformMatrix4fv(ModelViewMatrixPointSprite, 1, false, &m_data->m_viewMatrix[0]);
+ glUniform1f(screenWidthPointSprite,float(m_screenWidth));
+
+ //glUniform1i(uniform_texture_diffusePointSprite, 0);
+ b3Assert(glGetError() ==GL_NO_ERROR);
+ glPointSize(20);
+
+ #ifndef __APPLE__
+ glEnable(GL_POINT_SPRITE_ARB);
+ // glTexEnvi(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE);
+ #endif
+
+ glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
+ glDrawElementsInstanced(GL_POINTS, indexCount, GL_UNSIGNED_INT, indexOffset, gfxObj->m_numGraphicsInstances);
+ } else
+ {
+ switch (renderMode)
+ {
+
+ case B3_DEFAULT_RENDERMODE:
+ {
+ if ( gfxObj->m_flags&eGfxTransparency)
{
+ glDepthMask(false);
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+ glUseProgram(instancingShader);
+ glUniformMatrix4fv(ProjectionMatrix, 1, false, &m_data->m_projectionMatrix[0]);
+ glUniformMatrix4fv(ModelViewMatrix, 1, false, &m_data->m_viewMatrix[0]);
+
+ b3Vector3 gLightDir = m_data->m_lightPos;
+ gLightDir.normalize();
+ glUniform3f(regularLightDirIn,gLightDir[0],gLightDir[1],gLightDir[2]);
+
+ glUniform1i(uniform_texture_diffuse, 0);
+
+ if ( gfxObj->m_flags&eGfxTransparency)
+ {
+
int instanceId = transparentInstances[i].m_instanceId;
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, (GLvoid *)((instanceId)*4*sizeof(float)+m_data->m_maxShapeCapacityInBytes));
glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, 0, (GLvoid *)((instanceId)*4*sizeof(float)+m_data->m_maxShapeCapacityInBytes+POSITION_BUFFER_SIZE));
@@ -2316,36 +2303,104 @@ b3Assert(glGetError() ==GL_NO_ERROR);
glVertexAttribPointer(6, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid *)((instanceId)*3*sizeof(float)+m_data->m_maxShapeCapacityInBytes+POSITION_BUFFER_SIZE+ORIENTATION_BUFFER_SIZE+COLOR_BUFFER_SIZE));
glDrawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_INT, 0);
+
+ } else
+ {
+ glDrawElementsInstanced(GL_TRIANGLES, indexCount, GL_UNSIGNED_INT, indexOffset, gfxObj->m_numGraphicsInstances);
}
- } else
- {
- glDrawElementsInstanced(GL_TRIANGLES, indexCount, GL_UNSIGNED_INT, indexOffset, gfxObj->m_numGraphicsInstances);
- }
- if ( gfxObj->m_flags&eGfxTransparency)
- {
- glDisable (GL_BLEND);
- glDepthMask(true);
- }
- glActiveTexture(GL_TEXTURE1);
- glBindTexture(GL_TEXTURE_2D,0);
+ if ( gfxObj->m_flags&eGfxTransparency)
+ {
+ glDisable (GL_BLEND);
+ glDepthMask(true);
+ }
+
+ break;
+ }
+ case B3_CREATE_SHADOWMAP_RENDERMODE:
+ {
+ glUseProgram(createShadowMapInstancingShader);
+ glUniformMatrix4fv(createShadow_depthMVP, 1, false, &depthMVP[0][0]);
+ glDrawElementsInstanced(GL_TRIANGLES, indexCount, GL_UNSIGNED_INT, indexOffset, gfxObj->m_numGraphicsInstances);
+ break;
+ }
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D,0);
- break;
- }
- default:
- {
- // b3Assert(0);
- }
- };
+ case B3_USE_SHADOWMAP_RENDERMODE:
+ {
+ if ( gfxObj->m_flags&eGfxTransparency)
+ {
+ glDepthMask(false);
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+ glUseProgram(useShadowMapInstancingShader);
+ glUniformMatrix4fv(useShadow_ProjectionMatrix, 1, false, &m_data->m_projectionMatrix[0]);
+ glUniformMatrix4fv(useShadow_ModelViewMatrix, 1, false, &m_data->m_viewMatrix[0]);
+ glUniformMatrix4fv(useShadow_ViewMatrixInverse, 1, false, &m_data->m_viewMatrixInverse[0]);
+ glUniformMatrix4fv(useShadow_ModelViewMatrix, 1, false, &m_data->m_viewMatrix[0]);
+
+ glUniform3f(useShadow_lightSpecularIntensity, m_data->m_lightSpecularIntensity[0],m_data->m_lightSpecularIntensity[1],m_data->m_lightSpecularIntensity[2]);
+ glUniform3f(useShadow_materialSpecularColor, gfxObj->m_materialSpecularColor[0],gfxObj->m_materialSpecularColor[1],gfxObj->m_materialSpecularColor[2]);
+
+
+
+ float MVP[16];
+ b3Matrix4x4Mul16(m_data->m_projectionMatrix,m_data->m_viewMatrix,MVP);
+ glUniformMatrix4fv(useShadow_MVP, 1, false, &MVP[0]);
+ //gLightDir.normalize();
+ glUniform3f(useShadow_lightPosIn,m_data->m_lightPos[0],m_data->m_lightPos[1],m_data->m_lightPos[2]);
+ float camPos[3];
+ m_data->m_activeCamera->getCameraPosition(camPos);
+ glUniform3f(useShadow_cameraPositionIn,camPos[0],camPos[1],camPos[2]);
+ glUniform1f(useShadow_materialShininessIn,gfxObj->m_materialShinyNess);
+
+ glUniformMatrix4fv(useShadow_DepthBiasModelViewMatrix, 1, false, &depthBiasMVP[0][0]);
+ glActiveTexture(GL_TEXTURE1);
+ glBindTexture(GL_TEXTURE_2D, m_data->m_shadowTexture);
+ glUniform1i(useShadow_shadowMap,1);
+
+ //sort transparent objects
+
+ //gfxObj->m_instanceOffset
+
+ if ( gfxObj->m_flags&eGfxTransparency)
+ {
+ int instanceId = transparentInstances[i].m_instanceId;
+ glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, (GLvoid *)((instanceId)*4*sizeof(float)+m_data->m_maxShapeCapacityInBytes));
+ glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, 0, (GLvoid *)((instanceId)*4*sizeof(float)+m_data->m_maxShapeCapacityInBytes+POSITION_BUFFER_SIZE));
+ glVertexAttribPointer(5, 4, GL_FLOAT, GL_FALSE, 0, (GLvoid *)((instanceId)*4*sizeof(float)+m_data->m_maxShapeCapacityInBytes+POSITION_BUFFER_SIZE+ORIENTATION_BUFFER_SIZE));
+ glVertexAttribPointer(6, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid *)((instanceId)*3*sizeof(float)+m_data->m_maxShapeCapacityInBytes+POSITION_BUFFER_SIZE+ORIENTATION_BUFFER_SIZE+COLOR_BUFFER_SIZE));
+ glDrawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_INT, 0);
+ } else
+ {
+ glDrawElementsInstanced(GL_TRIANGLES, indexCount, GL_UNSIGNED_INT, indexOffset, gfxObj->m_numGraphicsInstances);
+ }
+
+ if ( gfxObj->m_flags&eGfxTransparency)
+ {
+ glDisable (GL_BLEND);
+ glDepthMask(true);
+ }
+ glActiveTexture(GL_TEXTURE1);
+ glBindTexture(GL_TEXTURE_2D,0);
+
+ glActiveTexture(GL_TEXTURE0);
+ glBindTexture(GL_TEXTURE_2D,0);
+ break;
+ }
+ default:
+ {
+ // b3Assert(0);
+ }
+ };
+ }
+
+
+ //glDrawElementsInstanced(GL_LINE_LOOP, indexCount, GL_UNSIGNED_INT, (void*)indexOffset, gfxObj->m_numGraphicsInstances);
}
-
-
- //glDrawElementsInstanced(GL_LINE_LOOP, indexCount, GL_UNSIGNED_INT, (void*)indexOffset, gfxObj->m_numGraphicsInstances);
}
}
- curOffset+= gfxObj->m_numGraphicsInstances;
}
{
diff --git a/examples/Tutorial/Tutorial.cpp b/examples/Tutorial/Tutorial.cpp
index 18a9f34eb..8d43daac2 100644
--- a/examples/Tutorial/Tutorial.cpp
+++ b/examples/Tutorial/Tutorial.cpp
@@ -425,21 +425,23 @@ public:
}
// int boxId = m_app->registerCubeShape(1,1,1,textureIndex);
- int boxId = m_app->registerGraphicsUnitSphereShape(SPHERE_LOD_HIGH, textureIndex);
-
+ int sphereTransparent = m_app->registerGraphicsUnitSphereShape(SPHERE_LOD_HIGH, textureIndex);
+ int sphereOpaque= m_app->registerGraphicsUnitSphereShape(SPHERE_LOD_HIGH, textureIndex);
b3Vector3 scaling = b3MakeVector3(SPHERE_RADIUS,SPHERE_RADIUS,SPHERE_RADIUS);
for (int i=0;im_collisionShape.m_sphere.m_radius = SPHERE_RADIUS;
m_bodies[i]->m_collisionShape.m_type = LW_SPHERE_TYPE;
- m_bodies[i]->m_graphicsIndex = m_app->m_renderer->registerGraphicsInstance(boxId,m_bodies[i]->m_worldPose.m_position, m_bodies[i]->m_worldPose.m_orientation,color,scaling);
+ m_bodies[i]->m_graphicsIndex = m_app->m_renderer->registerGraphicsInstance(gfxShape,m_bodies[i]->m_worldPose.m_position, m_bodies[i]->m_worldPose.m_orientation,color,scaling);
m_app->m_renderer->writeSingleInstanceTransformToCPU(m_bodies[i]->m_worldPose.m_position, m_bodies[i]->m_worldPose.m_orientation, m_bodies[i]->m_graphicsIndex);
}
}
diff --git a/examples/pybullet/examples/transparent.py b/examples/pybullet/examples/transparent.py
new file mode 100644
index 000000000..5c6cc09c6
--- /dev/null
+++ b/examples/pybullet/examples/transparent.py
@@ -0,0 +1,18 @@
+import pybullet as p
+import time
+p.connect(p.GUI)
+p.loadURDF("plane.urdf")
+sphereUid = p.loadURDF("sphere_transparent.urdf",[0,0,2])
+
+redSlider = p.addUserDebugParameter("red",0,1,1)
+greenSlider = p.addUserDebugParameter("green",0,1,0)
+blueSlider = p.addUserDebugParameter("blue",0,1,0)
+alphaSlider = p.addUserDebugParameter("alpha",0,1,0.5)
+
+while (1):
+ red = p.readUserDebugParameter(redSlider)
+ green = p.readUserDebugParameter(greenSlider)
+ blue = p.readUserDebugParameter(blueSlider)
+ alpha = p.readUserDebugParameter(alphaSlider)
+ p.changeVisualShape(sphereUid,-1,rgbaColor=[red,green,blue,alpha])
+ time.sleep(0.01)
\ No newline at end of file