diff --git a/data/kitchens/1.sdf b/data/kitchens/1.sdf
index 0bf6112e9..33e914375 100644
--- a/data/kitchens/1.sdf
+++ b/data/kitchens/1.sdf
@@ -4291,45 +4291,7 @@
-
- 1
- -12.0 -13.9 0 0 0 0
-
-
- 0
-
- 0.166667
- 0
- 0
- 0.166667
- 0
- 0.166667
-
-
-
-
-
- .1 .1 .1
- fatihrmutfak/part110.obj
-
-
-
-
-
-
- .1 .1 .1
- fatihrmutfak/part110.obj
-
-
-
- 1 0 0 1
- 1.000000 1.000000 1.000000 1
- 0.1 0.1 0.1 1
- 0 0 0 0
-
-
-
-
+
1
-12.0 -13.9 0 0 0 0
diff --git a/data/kuka_iiwa/model.urdf b/data/kuka_iiwa/model.urdf
index a6e53d3ab..98e54cb37 100644
--- a/data/kuka_iiwa/model.urdf
+++ b/data/kuka_iiwa/model.urdf
@@ -70,7 +70,7 @@
-
+
@@ -99,7 +99,7 @@
-
+
@@ -128,7 +128,7 @@
-
+
@@ -157,7 +157,7 @@
-
+
@@ -186,7 +186,7 @@
-
+
@@ -215,7 +215,7 @@
-
+
@@ -244,7 +244,7 @@
-
+
@@ -273,7 +273,7 @@
-
+
diff --git a/examples/OpenGLWindow/GLInstancingRenderer.cpp b/examples/OpenGLWindow/GLInstancingRenderer.cpp
index 3d6c4d793..296f53a72 100644
--- a/examples/OpenGLWindow/GLInstancingRenderer.cpp
+++ b/examples/OpenGLWindow/GLInstancingRenderer.cpp
@@ -129,6 +129,8 @@ struct b3GraphicsInstance
int m_instanceOffset;
int m_vertexArrayOffset;
int m_primitiveType;
+ float m_materialShinyNess;
+ b3Vector3 m_materialSpecularColor;
b3GraphicsInstance()
:m_cube_vao(-1),
@@ -139,7 +141,9 @@ struct b3GraphicsInstance
m_numGraphicsInstances(0),
m_instanceOffset(0),
m_vertexArrayOffset(0),
- m_primitiveType(B3_GL_TRIANGLES)
+ m_primitiveType(B3_GL_TRIANGLES),
+ m_materialShinyNess(81),
+ m_materialSpecularColor(b3MakeVector3(1,1,1))
{
}
@@ -204,8 +208,10 @@ struct InternalDataRenderer : public GLInstanceRendererInternalData
GLfloat m_projectionMatrix[16];
GLfloat m_viewMatrix[16];
+ GLfloat m_viewMatrixInverse[16];
b3Vector3 m_lightPos;
+ b3Vector3 m_lightSpecularIntensity;
GLuint m_defaultTexturehandle;
b3AlignedObjectArray m_textureHandles;
@@ -226,12 +232,14 @@ struct InternalDataRenderer : public GLInstanceRendererInternalData
m_renderFrameBuffer(0)
{
m_lightPos=b3MakeVector3(-50,30,40);
+ m_lightSpecularIntensity.setValue(1,1,1);
//clear to zero to make it obvious if the matrix is used uninitialized
for (int i=0;i<16;i++)
{
m_projectionMatrix[i]=0;
m_viewMatrix[i]=0;
+ m_viewMatrixInverse[i]=0;
}
}
@@ -280,9 +288,14 @@ GLuint linesVertexArrayObject=0;
GLuint linesIndexVbo = 0;
+static GLint useShadow_ViewMatrixInverse=0;
static GLint useShadow_ModelViewMatrix=0;
+static GLint useShadow_lightSpecularIntensity = 0;
+static GLint useShadow_materialSpecularColor = 0;
static GLint useShadow_MVP=0;
-static GLint useShadow_lightDirIn=0;
+static GLint useShadow_lightPosIn=0;
+static GLint useShadow_cameraPositionIn = 0;
+static GLint useShadow_materialShininessIn = 0;
static GLint useShadow_ProjectionMatrix=0;
static GLint useShadow_DepthBiasModelViewMatrix=0;
@@ -296,7 +309,7 @@ static GLint ProjectionMatrix=0;
static GLint regularLightDirIn=0;
-static GLint uniform_texture_diffuse = 0;
+static GLint uniform_texture_diffuse = 0;
static GLint screenWidthPointSprite=0;
static GLint ModelViewMatrixPointSprite=0;
@@ -1103,13 +1116,18 @@ void GLInstancingRenderer::InitShaders()
glLinkProgram(useShadowMapInstancingShader);
glUseProgram(useShadowMapInstancingShader);
+ useShadow_ViewMatrixInverse = glGetUniformLocation(useShadowMapInstancingShader, "ViewMatrixInverse");
useShadow_ModelViewMatrix = glGetUniformLocation(useShadowMapInstancingShader, "ModelViewMatrix");
+ useShadow_lightSpecularIntensity = glGetUniformLocation(useShadowMapInstancingShader, "lightSpecularIntensityIn");
+ useShadow_materialSpecularColor = glGetUniformLocation(useShadowMapInstancingShader, "materialSpecularColorIn");
useShadow_MVP = glGetUniformLocation(useShadowMapInstancingShader, "MVP");
useShadow_ProjectionMatrix = glGetUniformLocation(useShadowMapInstancingShader, "ProjectionMatrix");
useShadow_DepthBiasModelViewMatrix = glGetUniformLocation(useShadowMapInstancingShader, "DepthBiasModelViewProjectionMatrix");
useShadow_uniform_texture_diffuse = glGetUniformLocation(useShadowMapInstancingShader, "Diffuse");
useShadow_shadowMap = glGetUniformLocation(useShadowMapInstancingShader,"shadowMap");
- useShadow_lightDirIn = glGetUniformLocation(useShadowMapInstancingShader,"lightDirIn");
+ useShadow_lightPosIn = glGetUniformLocation(useShadowMapInstancingShader,"lightPosIn");
+ useShadow_cameraPositionIn = glGetUniformLocation(useShadowMapInstancingShader,"cameraPositionIn");
+ useShadow_materialShininessIn = glGetUniformLocation(useShadowMapInstancingShader,"materialShininessIn");
createShadowMapInstancingShader = gltLoadShaderPair(createShadowMapInstancingVertexShader,createShadowMapInstancingFragmentShader);
glLinkProgram(createShadowMapInstancingShader);
@@ -1276,6 +1294,15 @@ void GLInstancingRenderer::setActiveCamera(CommonCameraInterface* cam)
m_data->m_activeCamera = cam;
}
+void GLInstancingRenderer::setLightSpecularIntensity(const float lightSpecularIntensity[3])
+{
+ m_data->m_lightSpecularIntensity[0] = lightSpecularIntensity[0];
+ m_data->m_lightSpecularIntensity[1] = lightSpecularIntensity[1];
+ m_data->m_lightSpecularIntensity[2] = lightSpecularIntensity[2];
+}
+
+
+
void GLInstancingRenderer::setLightPosition(const float lightPos[3])
{
m_data->m_lightPos[0] = lightPos[0];
@@ -1302,6 +1329,21 @@ void GLInstancingRenderer::updateCamera(int upAxis)
m_data->m_defaultCamera1.update();
m_data->m_activeCamera->getCameraProjectionMatrix(m_data->m_projectionMatrix);
m_data->m_activeCamera->getCameraViewMatrix(m_data->m_viewMatrix);
+ b3Scalar viewMat[16];
+ b3Scalar viewMatInverse[16];
+
+ for (int i=0;i<16;i++)
+ {
+ viewMat[i] = m_data->m_viewMatrix[i];
+ }
+ b3Transform tr;
+ tr.setFromOpenGLMatrix(viewMat);
+ tr = tr.inverse();
+ tr.getOpenGLMatrix(viewMatInverse);
+ for (int i=0;i<16;i++)
+ {
+ m_data->m_viewMatrixInverse[i]=viewMatInverse[i];
+ }
}
@@ -2131,12 +2173,24 @@ b3Assert(glGetError() ==GL_NO_ERROR);
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]);
- b3Vector3 gLightDir = m_data->m_lightPos;
- gLightDir.normalize();
- glUniform3f(useShadow_lightDirIn,gLightDir[0],gLightDir[1],gLightDir[2]);
+ //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);
diff --git a/examples/OpenGLWindow/GLInstancingRenderer.h b/examples/OpenGLWindow/GLInstancingRenderer.h
index 62ca92dcf..7f1526ece 100644
--- a/examples/OpenGLWindow/GLInstancingRenderer.h
+++ b/examples/OpenGLWindow/GLInstancingRenderer.h
@@ -124,6 +124,7 @@ public:
virtual void setLightPosition(const float lightPos[3]);
virtual void setLightPosition(const double lightPos[3]);
+ void setLightSpecularIntensity(const float lightSpecularIntensity[3]);
virtual void resize(int width, int height);
virtual int getScreenWidth()
diff --git a/examples/OpenGLWindow/Shaders/useShadowMapInstancingPS.glsl b/examples/OpenGLWindow/Shaders/useShadowMapInstancingPS.glsl
index ad12e3b0c..809494902 100644
--- a/examples/OpenGLWindow/Shaders/useShadowMapInstancingPS.glsl
+++ b/examples/OpenGLWindow/Shaders/useShadowMapInstancingPS.glsl
@@ -13,9 +13,14 @@ in Vert
uniform sampler2D Diffuse;
uniform sampler2DShadow shadowMap;
+uniform mat4 ViewMatrixInverse;
-in vec3 lightDir,normal,ambient;
+in vec3 lightPos,cameraPosition, normal,ambient;
in vec4 ShadowCoord;
+in vec4 vertexPos;
+in float materialShininess;
+in vec3 lightSpecularIntensity;
+in vec3 materialSpecularColor;
out vec4 color;
@@ -28,8 +33,11 @@ void main(void)
float intensity,at,af;
if (fragment.color.w==0)
discard;
-
- intensity = 0.5+0.5*clamp( dot( normalize(normal),lightDir ), -1,1 );
+ vec3 lightDir = normalize(lightPos);
+
+ vec3 normalDir = normalize(normal);
+
+ intensity = 0.5+0.5*clamp( dot( normalDir,lightDir ), -1,1 );
af = 1.0;
@@ -38,7 +46,24 @@ void main(void)
//float bias = 0.005f;
+ vec3 specularReflection;
+ if (dot(normalDir, lightDir) < 0.0)
+ {
+ specularReflection = vec3(0.0, 0.0, 0.0);
+ }
+ else // light source on the right side
+ {
+ vec3 surfaceToLight = normalize(lightPos - vertexPos.xyz);
+ vec3 surfaceToCamera = normalize(cameraPosition - vertexPos.xyz);
+
+
+ float specularCoefficient = 0.0;
+ specularCoefficient = pow(max(0.0, dot(surfaceToCamera, reflect(-surfaceToLight, normalDir))), materialShininess);
+ specularReflection = specularCoefficient * materialSpecularColor * lightSpecularIntensity;
+
+ }
+
float visibility = texture(shadowMap, vec3(ShadowCoord.xy,(ShadowCoord.z)/ShadowCoord.w));
if (intensity<0.5)
@@ -46,6 +71,6 @@ void main(void)
intensity = 0.7*intensity + 0.3*intensity*visibility;
- cf = intensity*(vec3(1.0,1.0,1.0)-ambient)+ambient;
+ cf = intensity*(vec3(1.0,1.0,1.0)-ambient)+ambient+specularReflection*visibility;
color = vec4(ct * cf, fragment.color.w);
}
diff --git a/examples/OpenGLWindow/Shaders/useShadowMapInstancingPS.h b/examples/OpenGLWindow/Shaders/useShadowMapInstancingPS.h
index c2a6a306f..e34883d85 100644
--- a/examples/OpenGLWindow/Shaders/useShadowMapInstancingPS.h
+++ b/examples/OpenGLWindow/Shaders/useShadowMapInstancingPS.h
@@ -12,8 +12,13 @@ static const char* useShadowMapInstancingFragmentShader= \
"} vert;\n"
"uniform sampler2D Diffuse;\n"
"uniform sampler2DShadow shadowMap;\n"
-"in vec3 lightDir,normal,ambient;\n"
+"uniform mat4 ViewMatrixInverse;\n"
+"in vec3 lightPos,cameraPosition, normal,ambient;\n"
"in vec4 ShadowCoord;\n"
+"in vec4 vertexPos;\n"
+"in float materialShininess;\n"
+"in vec3 lightSpecularIntensity;\n"
+"in vec3 materialSpecularColor;\n"
"out vec4 color;\n"
"void main(void)\n"
"{\n"
@@ -22,7 +27,11 @@ static const char* useShadowMapInstancingFragmentShader= \
" float intensity,at,af;\n"
" if (fragment.color.w==0)\n"
" discard;\n"
-" intensity = 0.5+0.5*clamp( dot( normalize(normal),lightDir ), -1,1 );\n"
+" vec3 lightDir = normalize(lightPos);\n"
+" \n"
+" vec3 normalDir = normalize(normal);\n"
+" \n"
+" intensity = 0.5+0.5*clamp( dot( normalDir,lightDir ), -1,1 );\n"
" \n"
" af = 1.0;\n"
" \n"
@@ -31,13 +40,30 @@ static const char* useShadowMapInstancingFragmentShader= \
" \n"
" //float bias = 0.005f;\n"
" \n"
+" vec3 specularReflection;\n"
" \n"
+" if (dot(normalDir, lightDir) < 0.0) \n"
+" {\n"
+" specularReflection = vec3(0.0, 0.0, 0.0);\n"
+" }\n"
+" else // light source on the right side\n"
+" {\n"
+" vec3 surfaceToLight = normalize(lightPos - vertexPos.xyz);\n"
+" vec3 surfaceToCamera = normalize(cameraPosition - vertexPos.xyz);\n"
+" \n"
+" \n"
+" float specularCoefficient = 0.0;\n"
+" specularCoefficient = pow(max(0.0, dot(surfaceToCamera, reflect(-surfaceToLight, normalDir))), materialShininess);\n"
+" specularReflection = specularCoefficient * materialSpecularColor * lightSpecularIntensity;\n"
+" \n"
+" }\n"
+" \n"
" float visibility = texture(shadowMap, vec3(ShadowCoord.xy,(ShadowCoord.z)/ShadowCoord.w));\n"
" if (intensity<0.5)\n"
" visibility = 0;\n"
" intensity = 0.7*intensity + 0.3*intensity*visibility;\n"
" \n"
-" cf = intensity*(vec3(1.0,1.0,1.0)-ambient)+ambient;\n"
+" cf = intensity*(vec3(1.0,1.0,1.0)-ambient)+ambient+specularReflection*visibility;\n"
" color = vec4(ct * cf, fragment.color.w);\n"
"}\n"
;
diff --git a/examples/OpenGLWindow/Shaders/useShadowMapInstancingVS.glsl b/examples/OpenGLWindow/Shaders/useShadowMapInstancingVS.glsl
index 222e73cfd..3f9601f44 100644
--- a/examples/OpenGLWindow/Shaders/useShadowMapInstancingVS.glsl
+++ b/examples/OpenGLWindow/Shaders/useShadowMapInstancingVS.glsl
@@ -15,7 +15,12 @@ uniform mat4 ModelViewMatrix;
uniform mat4 ProjectionMatrix;
uniform mat4 DepthBiasModelViewProjectionMatrix;
uniform mat4 MVP;
-uniform vec3 lightDirIn;
+uniform vec3 lightPosIn;
+uniform vec3 cameraPositionIn;
+uniform mat4 ViewMatrixInverse;
+uniform float materialShininessIn;
+uniform vec3 lightSpecularIntensityIn;
+uniform vec3 materialSpecularColorIn;
out vec4 ShadowCoord;
@@ -60,7 +65,13 @@ vec4 quatRotate ( in vec4 p, in vec4 q )
return quatMul ( temp, vec4 ( -q.x, -q.y, -q.z, q.w ) );
}
-out vec3 lightDir,normal,ambient;
+out vec3 lightPos,normal,ambient;
+out vec4 vertexPos;
+out vec3 cameraPosition;
+out float materialShininess;
+out vec3 lightSpecularIntensity;
+out vec3 materialSpecularColor;
+
void main(void)
{
@@ -69,15 +80,19 @@ void main(void)
vec4 worldNormal = (quatRotate3( vertexnormal,q));
- normal = normalize(worldNormal).xyz;
+ normal = worldNormal.xyz;
- lightDir = lightDirIn;
-
+ lightPos = lightPosIn;
+ cameraPosition = cameraPositionIn;
+ materialShininess = materialShininessIn;
+ lightSpecularIntensity = lightSpecularIntensityIn;
+ materialSpecularColor = materialSpecularColorIn;
vec4 localcoord = quatRotate3( position.xyz*instance_scale,q);
- vec4 vertexPos = MVP* vec4((instance_position+localcoord).xyz,1);
-
- gl_Position = vertexPos;
+ vertexPos = vec4((instance_position+localcoord).xyz,1);
+
+ vec4 vertexLoc = MVP* vec4((instance_position+localcoord).xyz,1);
+ gl_Position = vertexLoc;
ShadowCoord = DepthBiasModelViewProjectionMatrix * vec4((instance_position+localcoord).xyz,1);
fragment.color = instance_color;
diff --git a/examples/OpenGLWindow/Shaders/useShadowMapInstancingVS.h b/examples/OpenGLWindow/Shaders/useShadowMapInstancingVS.h
index a98e44f82..0800c2cd0 100644
--- a/examples/OpenGLWindow/Shaders/useShadowMapInstancingVS.h
+++ b/examples/OpenGLWindow/Shaders/useShadowMapInstancingVS.h
@@ -13,7 +13,12 @@ static const char* useShadowMapInstancingVertexShader= \
"uniform mat4 ProjectionMatrix;\n"
"uniform mat4 DepthBiasModelViewProjectionMatrix;\n"
"uniform mat4 MVP;\n"
-"uniform vec3 lightDirIn;\n"
+"uniform vec3 lightPosIn;\n"
+"uniform vec3 cameraPositionIn;\n"
+"uniform mat4 ViewMatrixInverse;\n"
+"uniform float materialShininessIn;\n"
+"uniform vec3 lightSpecularIntensityIn;\n"
+"uniform vec3 materialSpecularColorIn;\n"
"out vec4 ShadowCoord;\n"
"out Fragment\n"
"{\n"
@@ -51,7 +56,12 @@ static const char* useShadowMapInstancingVertexShader= \
" vec4 temp = quatMul ( q, p );\n"
" return quatMul ( temp, vec4 ( -q.x, -q.y, -q.z, q.w ) );\n"
"}\n"
-"out vec3 lightDir,normal,ambient;\n"
+"out vec3 lightPos,normal,ambient;\n"
+"out vec4 vertexPos;\n"
+"out vec3 cameraPosition;\n"
+"out float materialShininess;\n"
+"out vec3 lightSpecularIntensity;\n"
+"out vec3 materialSpecularColor;\n"
"void main(void)\n"
"{\n"
" vec4 q = instance_quaternion;\n"
@@ -59,13 +69,18 @@ static const char* useShadowMapInstancingVertexShader= \
" \n"
" vec4 worldNormal = (quatRotate3( vertexnormal,q));\n"
" \n"
-" normal = normalize(worldNormal).xyz;\n"
-" lightDir = lightDirIn;\n"
-" \n"
+" normal = worldNormal.xyz;\n"
+" lightPos = lightPosIn;\n"
+" cameraPosition = cameraPositionIn;\n"
+" materialShininess = materialShininessIn;\n"
+" lightSpecularIntensity = lightSpecularIntensityIn;\n"
+" materialSpecularColor = materialSpecularColorIn;\n"
" \n"
" vec4 localcoord = quatRotate3( position.xyz*instance_scale,q);\n"
-" vec4 vertexPos = MVP* vec4((instance_position+localcoord).xyz,1);\n"
-" gl_Position = vertexPos;\n"
+" vertexPos = vec4((instance_position+localcoord).xyz,1);\n"
+" \n"
+" vec4 vertexLoc = MVP* vec4((instance_position+localcoord).xyz,1);\n"
+" gl_Position = vertexLoc;\n"
" ShadowCoord = DepthBiasModelViewProjectionMatrix * vec4((instance_position+localcoord).xyz,1);\n"
" fragment.color = instance_color;\n"
" vert.texcoord = uvcoords;\n"