diff --git a/examples/common/opengl-framework/src/shaders/phong.frag b/examples/common/opengl-framework/src/shaders/phong.frag index 6f38b4b4..3102de06 100644 --- a/examples/common/opengl-framework/src/shaders/phong.frag +++ b/examples/common/opengl-framework/src/shaders/phong.frag @@ -6,7 +6,7 @@ * This software is provided 'as-is', without any express or implied warranty. * * In no event will the authors be held liable for any damages arising from the * * use of this software. * -* * +* * * Permission is granted to anyone to use this software for any purpose, * * including commercial applications, and to alter it and redistribute it * * freely, subject to the following restrictions: * @@ -24,10 +24,10 @@ ********************************************************************************/ // Uniform variables -uniform vec3 lightPosCameraSpace; // Camera-space position of the light uniform vec3 lightAmbientColor; // Lights ambient color -uniform vec3 lightDiffuseColor; // Light diffuse color -uniform vec3 lightSpecularColor; // Light specular color +uniform vec3 light0PosCameraSpace; // Camera-space position of the light +uniform vec3 light0DiffuseColor; // Light 0 diffuse color +uniform vec3 light0SpecularColor; // Light 0 specular color uniform float shininess; // Shininess uniform sampler2D texture; // Texture uniform bool isTexture; // True if we need to use the texture @@ -46,18 +46,20 @@ void main() { vec3 textureColor = vec3(1); if (isTexture) textureColor = texture2D(texture, texCoords).rgb; - // Compute the diffuse term - vec3 L = normalize(lightPosCameraSpace - vertexPosCameraSpace); + // Compute the surface normal vector vec3 N = normalize(vertexNormalCameraSpace); - float diffuseFactor = max(dot(N, L), 0.0); - vec3 diffuse = lightDiffuseColor * diffuseFactor * textureColor; - // Compute the specular term + // Compute the diffuse term of light 0 + vec3 L0 = normalize(light0PosCameraSpace - vertexPosCameraSpace); + float diffuseFactor = max(dot(N, L0), 0.0); + vec3 diffuse = light0DiffuseColor * diffuseFactor * textureColor; + + // Compute the specular term of light 0 vec3 V = normalize(-vertexPosCameraSpace); - vec3 H = normalize(V + L); - float specularFactor = pow(max(dot(N, H), 0), shininess); + vec3 H0 = normalize(V + L0); + float specularFactor = pow(max(dot(N, H0), 0), shininess); if (diffuseFactor < 0) specularFactor = 0.0; - vec3 specular = lightSpecularColor * specularFactor; + vec3 specular = light0SpecularColor * specularFactor; // Compute the final color gl_FragColor = vec4(ambient + diffuse + specular, 1.0); diff --git a/examples/fallingcubes/Scene.cpp b/examples/fallingcubes/Scene.cpp index 4e596bb5..fbc80ddb 100644 --- a/examples/fallingcubes/Scene.cpp +++ b/examples/fallingcubes/Scene.cpp @@ -59,7 +59,7 @@ Scene::Scene(GlutViewer* viewer) : mViewer(viewer), mLight0(0), float radius = 2.0f; // Create all the cubes of the scene - for (int i=0; igetRigidBody()->setIsMotionEnabled(true); @@ -160,12 +160,12 @@ void Scene::render() { // Set the variables of the shader mPhongShader.setMatrix4x4Uniform("projectionMatrix", camera.getProjectionMatrix()); - mPhongShader.setVector3Uniform("lightPosCameraSpace",worldToCameraMatrix * mLight0.getOrigin()); + mPhongShader.setVector3Uniform("light0PosCameraSpace",worldToCameraMatrix * mLight0.getOrigin()); mPhongShader.setVector3Uniform("lightAmbientColor", Vector3(0.3f, 0.3f, 0.3f)); Color& diffCol = mLight0.getDiffuseColor(); Color& specCol = mLight0.getSpecularColor(); - mPhongShader.setVector3Uniform("lightDiffuseColor", Vector3(diffCol.r, diffCol.g, diffCol.b)); - mPhongShader.setVector3Uniform("lightSpecularColor", Vector3(specCol.r, specCol.g, specCol.b)); + mPhongShader.setVector3Uniform("light0DiffuseColor", Vector3(diffCol.r, diffCol.g, diffCol.b)); + mPhongShader.setVector3Uniform("light0SpecularColor", Vector3(specCol.r, specCol.g, specCol.b)); mPhongShader.setFloatUniform("shininess", 60.0f); // Render all the cubes of the scene diff --git a/examples/fallingcubes/Scene.h b/examples/fallingcubes/Scene.h index d76e8c49..ae4c14d2 100644 --- a/examples/fallingcubes/Scene.h +++ b/examples/fallingcubes/Scene.h @@ -32,10 +32,10 @@ #include "Box.h" // Constants -const int NB_SPHERES = 20; // Number of boxes in the scene +const int NB_CUBES = 20; // Number of boxes in the scene const openglframework::Vector3 BOX_SIZE(2, 2, 2); // Box dimensions in meters const openglframework::Vector3 FLOOR_SIZE(20, 0.5f, 20); // Floor dimensions in meters -const float SPHERE_MASS = 1.0f; // Box mass in kilograms +const float CUBE_MASS = 1.0f; // Box mass in kilograms const float FLOOR_MASS = 100.0f; // Floor mass in kilograms // Class Scene diff --git a/examples/joints/Scene.cpp b/examples/joints/Scene.cpp index 1adceb36..a66b8f30 100644 --- a/examples/joints/Scene.cpp +++ b/examples/joints/Scene.cpp @@ -164,14 +164,13 @@ void Scene::render() { mPhongShader.bind(); // Set the variables of the shader - mPhongShader.setVector3Uniform("lightPosCameraSpace",worldToCameraMatrix * mLight0.getOrigin()); + mPhongShader.setVector3Uniform("light0PosCameraSpace",worldToCameraMatrix * mLight0.getOrigin()); mPhongShader.setMatrix4x4Uniform("projectionMatrix", camera.getProjectionMatrix()); - mPhongShader.setVector3Uniform("lightWorldPosition", mLight0.getOrigin()); mPhongShader.setVector3Uniform("lightAmbientColor", Vector3(0.3f, 0.3f, 0.3f)); Color& diffCol = mLight0.getDiffuseColor(); Color& specCol = mLight0.getSpecularColor(); - mPhongShader.setVector3Uniform("lightDiffuseColor", Vector3(diffCol.r, diffCol.g, diffCol.b)); - mPhongShader.setVector3Uniform("lightSpecularColor", Vector3(specCol.r, specCol.g, specCol.b)); + mPhongShader.setVector3Uniform("light0DiffuseColor", Vector3(diffCol.r, diffCol.g, diffCol.b)); + mPhongShader.setVector3Uniform("light0SpecularColor", Vector3(specCol.r, specCol.g, specCol.b)); mPhongShader.setFloatUniform("shininess", 60.0f); // Render all the boxes @@ -244,7 +243,7 @@ void Scene::createSliderJoint() { // Create a box and a corresponding rigid in the dynamics world openglframework::Vector3 box1Dimension(2, 4, 2); - mSliderJointBottomBox = new Box(box1Dimension, positionBox1 , SPHERE_MASS, mDynamicsWorld); + mSliderJointBottomBox = new Box(box1Dimension, positionBox1 , CUBE_MASS, mDynamicsWorld); // The fist box cannot move mSliderJointBottomBox->getRigidBody()->setIsMotionEnabled(false); @@ -259,7 +258,7 @@ void Scene::createSliderJoint() { // Create a box and a corresponding rigid in the dynamics world openglframework::Vector3 box2Dimension(1.5, 4, 1.5); - mSliderJointTopBox = new Box(box2Dimension, positionBox2 , SPHERE_MASS, mDynamicsWorld); + mSliderJointTopBox = new Box(box2Dimension, positionBox2 , CUBE_MASS, mDynamicsWorld); // The second box is allowed to move mSliderJointTopBox->getRigidBody()->setIsMotionEnabled(true); @@ -297,7 +296,7 @@ void Scene::createPropellerHingeJoint() { // Create a box and a corresponding rigid in the dynamics world openglframework::Vector3 boxDimension(10, 1, 1); - mPropellerBox = new Box(boxDimension, positionBox1 , SPHERE_MASS, mDynamicsWorld); + mPropellerBox = new Box(boxDimension, positionBox1 , CUBE_MASS, mDynamicsWorld); // The fist box cannot move mPropellerBox->getRigidBody()->setIsMotionEnabled(true); @@ -334,7 +333,7 @@ void Scene::createFixedJoints() { // Create a box and a corresponding rigid in the dynamics world openglframework::Vector3 boxDimension(1.5, 1.5, 1.5); - mFixedJointBox1 = new Box(boxDimension, positionBox1 , SPHERE_MASS, mDynamicsWorld); + mFixedJointBox1 = new Box(boxDimension, positionBox1 , CUBE_MASS, mDynamicsWorld); // The fist box cannot move mFixedJointBox1->getRigidBody()->setIsMotionEnabled(true); @@ -348,7 +347,7 @@ void Scene::createFixedJoints() { openglframework::Vector3 positionBox2(-5, 7, 0); // Create a box and a corresponding rigid in the dynamics world - mFixedJointBox2 = new Box(boxDimension, positionBox2 , SPHERE_MASS, mDynamicsWorld); + mFixedJointBox2 = new Box(boxDimension, positionBox2 , CUBE_MASS, mDynamicsWorld); // The second box is allowed to move mFixedJointBox2->getRigidBody()->setIsMotionEnabled(true); @@ -363,6 +362,7 @@ void Scene::createFixedJoints() { rp3d::RigidBody* propellerBody = mPropellerBox->getRigidBody(); const rp3d::Vector3 anchorPointWorldSpace1(5, 7, 0); rp3d::FixedJointInfo jointInfo1(body1, propellerBody, anchorPointWorldSpace1); + jointInfo1.isCollisionEnabled = false; // Create the joint in the dynamics world mFixedJoint1 = dynamic_cast(mDynamicsWorld->createJoint(jointInfo1)); @@ -373,6 +373,7 @@ void Scene::createFixedJoints() { rp3d::RigidBody* body2 = mFixedJointBox2->getRigidBody(); const rp3d::Vector3 anchorPointWorldSpace2(-5, 7, 0); rp3d::FixedJointInfo jointInfo2(body2, propellerBody, anchorPointWorldSpace2); + jointInfo2.isCollisionEnabled = false; // Create the joint in the dynamics world mFixedJoint2 = dynamic_cast(mDynamicsWorld->createJoint(jointInfo2)); diff --git a/examples/joints/Scene.h b/examples/joints/Scene.h index d65f3ba8..1c3f72d5 100644 --- a/examples/joints/Scene.h +++ b/examples/joints/Scene.h @@ -34,7 +34,7 @@ // Constants const openglframework::Vector3 BOX_SIZE(2, 2, 2); // Box dimensions in meters const openglframework::Vector3 FLOOR_SIZE(20, 0.5f, 20); // Floor dimensions in meters -const float SPHERE_MASS = 1.0f; // Box mass in kilograms +const float CUBE_MASS = 1.0f; // Box mass in kilograms const float FLOOR_MASS = 100.0f; // Floor mass in kilograms const int NB_BALLSOCKETJOINT_BOXES = 7; // Number of Ball-And-Socket chain boxes const int NB_HINGE_BOXES = 7; // Number of Hinge chain boxes diff --git a/src/collision/shapes/ConeShape.cpp b/src/collision/shapes/ConeShape.cpp index 58439866..b0be3dd3 100644 --- a/src/collision/shapes/ConeShape.cpp +++ b/src/collision/shapes/ConeShape.cpp @@ -45,12 +45,12 @@ using namespace reactphysics3d; // Constructor ConeShape::ConeShape(decimal radius, decimal height) - : CollisionShape(CONE), mRadius(radius), mHalfHeight(height / decimal(2.0)) { - assert(radius > 0.0); + : CollisionShape(CONE), mRadius(radius), mHalfHeight(height * decimal(0.5)) { + assert(mRadius > 0.0); assert(mHalfHeight > 0.0); // Compute the sine of the semi-angle at the apex point - mSinTheta = radius / (sqrt(radius * radius + height * height)); + mSinTheta = mRadius / (sqrt(mRadius * mRadius + height * height)); } // Private copy-constructor @@ -88,7 +88,7 @@ inline Vector3 ConeShape::getLocalSupportPointWithoutMargin(const Vector3& direc decimal sinThetaTimesLengthV = mSinTheta * v.length(); Vector3 supportPoint; - if (v.y >= sinThetaTimesLengthV) { + if (v.y > sinThetaTimesLengthV) { supportPoint = Vector3(0.0, mHalfHeight, 0.0); } else { @@ -98,7 +98,7 @@ inline Vector3 ConeShape::getLocalSupportPointWithoutMargin(const Vector3& direc supportPoint = Vector3(v.x * d, -mHalfHeight, v.z * d); } else { - supportPoint = Vector3(mRadius, -mHalfHeight, 0.0); + supportPoint = Vector3(0.0, -mHalfHeight, 0.0); } }