//---------------------------------------- void ofLight::onPositionChanged() { if(data->glIndex==-1) return; // if we are a positional light and not directional, update light position if(getIsSpotlight() || getIsPointLight() || getIsAreaLight()) { data->position = ofVec4f(getGlobalPosition().x,getGlobalPosition().y,getGlobalPosition().z,1); ofGetGLRenderer()->setLightPosition(data->glIndex,data->position); } }
//---------------------------------------- void ofLight::onOrientationChanged() { if(data->glIndex==-1) return; if(getIsDirectional()) { // if we are a directional light and not positional, update light position (direction) auto lookAtDir = glm::normalize(getGlobalOrientation() * glm::vec4(0,0,-1, 1)).xyz(); data->position = {lookAtDir.x,lookAtDir.y,lookAtDir.z,0.f}; ofGetGLRenderer()->setLightPosition(data->glIndex,data->position); }else if(getIsSpotlight() || getIsAreaLight()) { // determines the axis of the cone light auto lookAtDir = glm::normalize(getGlobalOrientation() * glm::vec4(0,0,-1, 1)).xyz(); data->direction = lookAtDir; ofGetGLRenderer()->setLightSpotDirection(data->glIndex, glm::vec4(data->direction, 0.0f)); } if(getIsAreaLight()){ data->up = getUpDir(); data->right = getXAxis(); } }
//---------------------------------------- void ofLight::onOrientationChanged() { if(data->glIndex==-1) return; // if we are a directional light and not positional, update light position (direction) if(getIsDirectional()) { // (tig) takes into account global orientation should node be parented. ofVec3f lookAtDir = ( getGlobalTransformMatrix().getInverse() * ofVec4f(0,0,-1, 1) ).getNormalized(); data->position = ofVec4f(lookAtDir.x,lookAtDir.y,lookAtDir.z,0); ofGetGLRenderer()->setLightPosition(data->glIndex,data->position); }else if(getIsSpotlight() || getIsAreaLight()) { // determines the axis of the cone light // // (tig) takes into account global orientation should node be parented. ofVec3f lookAtDir = ( getGlobalTransformMatrix().getInverse() * ofVec4f(0,0,-1, 1) ).getNormalized(); data->direction = ofVec3f(lookAtDir.x,lookAtDir.y,lookAtDir.z); ofGetGLRenderer()->setLightSpotDirection(data->glIndex,data->direction); } if(getIsAreaLight()){ data->up = getUpDir(); data->right = getXAxis(); } }
//---------------------------------------- void ofLight::customDraw(const ofBaseRenderer * renderer) const{; if(getIsPointLight()) { renderer->drawSphere( 0,0,0, 10); } else if (getIsSpotlight()) { float coneHeight = (sin(data->spotCutOff*DEG_TO_RAD) * 30.f) + 1; float coneRadius = (cos(data->spotCutOff*DEG_TO_RAD) * 30.f) + 8; const_cast<ofBaseRenderer*>(renderer)->rotate(-90,1,0,0); renderer->drawCone(0, -(coneHeight*.5), 0, coneHeight, coneRadius); } else if (getIsAreaLight()) { const_cast<ofBaseRenderer*>(renderer)->pushMatrix(); renderer->drawPlane(data->width,data->height); const_cast<ofBaseRenderer*>(renderer)->popMatrix(); }else{ renderer->drawBox(10); } ofDrawAxis(20); }