void ofApp::updateNormalMatrix(ofShader& shader) { updateNormalMatrix(); shader.setUniform3f("firstRow", normalMatrix.a, normalMatrix.b, normalMatrix.c); shader.setUniform3f("secondRow", normalMatrix.d, normalMatrix.e, normalMatrix.f); shader.setUniform3f("thirdRow", normalMatrix.g, normalMatrix.h, normalMatrix.i); }
//--------------------------------------------------------------- ACTIONS void CloudsRGBDVideoPlayer::begin(ofShader& shader){ if(playingVO){ return; } if(!getPlayer().isLoaded() ){ return; } if(!getTextureReference().isAllocated()){ return; } getPlayer().bind(); shader.setUniformTexture("rgbdTexture", getTextureReference(), 1); shader.setUniform2f("textureSize", getPlayer().getWidth(), getPlayer().getHeight()); shader.setUniform4f("colorRect", colorRect.x, colorRect.y, colorRect.width, colorRect.height); shader.setUniform2f("colorScale", colorScale.x, colorScale.y); shader.setUniform2f("colorFOV", colorFOV.x, colorFOV.y ); shader.setUniform2f("colorPP", colorPrincipalPoint.x, colorPrincipalPoint.y); shader.setUniform3f("dK", distortionK.x, distortionK.y, distortionK.z); shader.setUniform2f("dP", distortionP.x, distortionP.y); ofMatrix4x4 adjustmentMatrix; adjustmentMatrix.rotate(adjustRotate.x, 0, 1, 0); adjustmentMatrix.rotate(adjustRotate.y, 1, 0, 0); adjustmentMatrix.translate(adjustTranslate.x, adjustTranslate.y, adjustTranslate.z); shader.setUniformMatrix4f("extrinsics", extrinsics * adjustmentMatrix ); shader.setUniform4f("depthRect", depthRect.x, depthRect.y, depthRect.width, depthRect.height); shader.setUniform2f("depthPP", depthPrincipalPoint.x, depthPrincipalPoint.y); shader.setUniform2f("depthFOV", depthFOV.x, depthFOV.y); shader.setUniform4f("normalRect", normalRect.x, normalRect.y, normalRect.width, normalRect.height); shader.setUniform4f("faceFeatureRect", faceFeatureRect.x, faceFeatureRect.y, faceFeatureRect.width, faceFeatureRect.height); shader.setUniform4f("deltaChangeRect", deltaChangeRect.x, deltaChangeRect.y, deltaChangeRect.width, deltaChangeRect.height); shader.setUniform1f("farClip", farClip); shader.setUniform1f("nearClip", nearClip); shader.setUniform1f("edgeClip", edgeClip); shader.setUniform1f("minDepth", minDepth); shader.setUniform1f("maxDepth", maxDepth); shader.setUniform3f("skinSampleColor",skinSampleColor.r,skinSampleColor.g,skinSampleColor.b); shader.setUniform3f("skinWeights", skinWeights.x,skinWeights.y,skinWeights.z); shader.setUniform2f("skinThreshold", skinThreshold.min, skinThreshold.max); shader.setUniform3f("headPosition",headPosition.x,-headPosition.y,headPosition.z); shader.setUniform1f("flowPosition", flowPosition); }
void ofMaterial::updateLights(const ofShader & shader,ofGLProgrammableRenderer & renderer) const{ for(size_t i=0;i<ofLightsData().size();i++){ string idx = ofToString(i); shared_ptr<ofLight::Data> light = ofLightsData()[i].lock(); if(!light || !light->isEnabled){ shader.setUniform1f("lights["+idx+"].enabled",0); continue; } auto lightEyePosition = renderer.getCurrentViewMatrix() * light->position; shader.setUniform1f("lights["+idx+"].enabled",1); shader.setUniform1f("lights["+idx+"].type", light->lightType); shader.setUniform4f("lights["+idx+"].position", lightEyePosition); shader.setUniform4f("lights["+idx+"].ambient", light->ambientColor); shader.setUniform4f("lights["+idx+"].specular", light->specularColor); shader.setUniform4f("lights["+idx+"].diffuse", light->diffuseColor); if(light->lightType!=OF_LIGHT_DIRECTIONAL){ shader.setUniform1f("lights["+idx+"].constantAttenuation", light->attenuation_constant); shader.setUniform1f("lights["+idx+"].linearAttenuation", light->attenuation_linear); shader.setUniform1f("lights["+idx+"].quadraticAttenuation", light->attenuation_quadratic); } if(light->lightType==OF_LIGHT_SPOT){ auto direction = toGlm(light->position).xyz() + light->direction; auto direction4 = renderer.getCurrentViewMatrix() * glm::vec4(direction,1.0); direction = direction4.xyz() / direction4.w; direction = direction - lightEyePosition.xyz(); shader.setUniform3f("lights["+idx+"].spotDirection", glm::normalize(direction)); shader.setUniform1f("lights["+idx+"].spotExponent", light->exponent); shader.setUniform1f("lights["+idx+"].spotCutoff", light->spotCutOff); shader.setUniform1f("lights["+idx+"].spotCosCutoff", cos(ofDegToRad(light->spotCutOff))); }else if(light->lightType==OF_LIGHT_DIRECTIONAL){ auto halfVector = glm::normalize(glm::vec4(0.f, 0.f, 1.f, 0.f) + lightEyePosition); shader.setUniform3f("lights["+idx+"].halfVector", halfVector.xyz()); }else if(light->lightType==OF_LIGHT_AREA){ shader.setUniform1f("lights["+idx+"].width", light->width); shader.setUniform1f("lights["+idx+"].height", light->height); auto direction = light->position.xyz() + light->direction; auto direction4 = renderer.getCurrentViewMatrix() * glm::vec4(direction, 1.0); direction = direction4.xyz() / direction4.w; direction = direction - lightEyePosition.xyz(); shader.setUniform3f("lights["+idx+"].spotDirection", glm::normalize(direction)); auto right = toGlm(light->position).xyz() + light->right; auto right4 = renderer.getCurrentViewMatrix() * glm::vec4(right, 1.0); right = right4.xyz() / right4.w; right = right - lightEyePosition.xyz(); auto up = glm::cross(toGlm(right), direction); shader.setUniform3f("lights["+idx+"].right", glm::normalize(toGlm(right))); shader.setUniform3f("lights["+idx+"].up", glm::normalize(up)); } } }
void draw() { ofBackgroundGradient(64, 0); if(reflect || sreflect) env.draw(0,0,env.getWidth()/8,env.getHeight()/8); if(sreflect) env1.draw(env.getWidth()/8,0,env1.getWidth()/8,env1.getHeight()/8); ofEnableDepthTest(); cam.begin(); shader.begin(); if(sreflect){ // shader.setUniform3f("CameraPos",cam.getGlobalPosition().x, cam.getGlobalPosition().y, cam.getGlobalPosition().z); // shader.setUniformMatrix4f("ModelWorld4x4",cam.getGlobalTransformMatrix()); shader.setUniform3f("CameraPos",cam.getPosition().x, cam.getPosition().y, cam.getPosition().z); shader.setUniformMatrix4f("ModelWorld4x4",cam.getModelViewMatrix());//getLocalTransformMatrix()); shader.setUniformTexture("frontMap", env,1); shader.setUniformTexture("backMap", env1,2); } if(reflect){ shader.setUniformTexture("colorMap",env1,1); shader.setUniformTexture("envMap", env,2); }else if(sreflect==false){ shader.setUniformTexture("texture", img, 1); shader.setUniform1f("time", ofGetElapsedTimef()); } if(cube) ofDrawBox(200); else { ofTranslate(0,-150,0); ofRotateX(-90); ofRotateY(-90); ofRotateZ(45); model.drawFaces(); } shader.end(); cam.end(); ofDisableDepthTest(); ofDrawBitmapString(ofToString((int) ofGetFrameRate()), 10, 20); }
//--------------------------------------------------------------- ACTIONS void CloudsRGBDVideoPlayer::setupProjectionUniforms(ofShader& shader){ if(!getPlayer().isLoaded()){ ofLogWarning() << " CloudsRGBDVideoPlayer::setupProjectionUniforms -- player is not ready"; return; } shader.setUniformTexture("rgbdTexture", getPlayer().getTextureReference(), 0); shader.setUniform2f("textureSize", getPlayer().getWidth(), getPlayer().getHeight()); shader.setUniform4f("colorRect", colorRect.x, colorRect.y, colorRect.width, colorRect.height); shader.setUniform2f("colorScale", colorScale.x, colorScale.y); shader.setUniform2f("colorFOV", colorFOV.x, colorFOV.y ); shader.setUniform2f("colorPP", colorPrincipalPoint.x, colorPrincipalPoint.y); shader.setUniform3f("dK", distortionK.x, distortionK.y, distortionK.z); shader.setUniform2f("dP", distortionP.x, distortionP.y); ofMatrix4x4 adjustmentMatrix; adjustmentMatrix.rotate(adjustRotate.x, 0, 1, 0); adjustmentMatrix.rotate(adjustRotate.y, 1, 0, 0); adjustmentMatrix.translate(adjustTranslate.x, adjustTranslate.y, adjustTranslate.z); shader.setUniformMatrix4f("extrinsics", extrinsics * adjustmentMatrix ); shader.setUniform4f("depthRect", depthRect.x, depthRect.y, depthRect.width, depthRect.height); shader.setUniform2f("depthPP", depthPrincipalPoint.x, depthPrincipalPoint.y); shader.setUniform2f("depthFOV", depthFOV.x, depthFOV.y); shader.setUniform4f("normalRect", normalRect.x, normalRect.y, normalRect.width, normalRect.height); shader.setUniform4f("faceFeatureRect", faceFeatureRect.x, faceFeatureRect.y, faceFeatureRect.width, faceFeatureRect.height); shader.setUniform4f("deltaChangeRect", deltaChangeRect.x, deltaChangeRect.y, deltaChangeRect.width, deltaChangeRect.height); shader.setUniform1i("useFaces", useFaces ? 1 : 0); shader.setUniform1f("flowPosition", flowPosition); shader.setUniform1f("farClip", farClip); shader.setUniform1f("nearClip", nearClip); shader.setUniform1f("edgeClip", edgeClip); shader.setUniform1f("minDepth", minDepth); shader.setUniform1f("maxDepth", maxDepth); }
void ofMaterial::updateMaterial(const ofShader & shader,ofGLProgrammableRenderer & renderer) const{ shader.setUniform4fv("mat_ambient", &data.ambient.r); shader.setUniform4fv("mat_diffuse", &data.diffuse.r); shader.setUniform4fv("mat_specular", &data.specular.r); shader.setUniform4fv("mat_emissive", &data.emissive.r); shader.setUniform4fv("global_ambient", &ofGetGlobalAmbientColor().r); shader.setUniform1f("mat_shininess",data.shininess); for(auto & uniform: uniforms1f){ shader.setUniform1f(uniform.first, uniform.second); } for (auto & uniform : uniforms2f) { shader.setUniform2f(uniform.first, uniform.second); } for (auto & uniform : uniforms3f) { shader.setUniform3f(uniform.first, uniform.second); } for (auto & uniform : uniforms4f) { shader.setUniform4f(uniform.first, uniform.second); } for (auto & uniform : uniforms1i) { shader.setUniform1i(uniform.first, uniform.second); } for (auto & uniform : uniforms2i) { shader.setUniform2i(uniform.first, uniform.second.x, uniform.second.y); } for (auto & uniform : uniforms3i) { shader.setUniform3i(uniform.first, uniform.second.x, uniform.second.y, uniform.second.z); } for (auto & uniform : uniforms4i) { shader.setUniform4i(uniform.first, uniform.second.x, uniform.second.y, uniform.second.z, uniform.second.w); } for (auto & uniform : uniforms4m) { shader.setUniformMatrix4f(uniform.first, uniform.second); } for (auto & uniform : uniforms3m) { shader.setUniformMatrix3f(uniform.first, uniform.second); } for (auto & uniform : uniformstex) { shader.setUniformTexture(uniform.first, uniform.second.textureTarget, uniform.second.textureID, uniform.second.textureLocation); } }