Commit: df9d6737b912b71fb91579b43ea6c7786d88f803 Author: Mitchell Stokes Date: Thu Mar 27 22:32:06 2014 -0700 https://developer.blender.org/rBdf9d6737b912b71fb91579b43ea6c7786d88f803
BGE code cleanup: Removing OpenGL and bf_gpu code from KX_LightObject The ultimate goal is to only allow the rasterizer to handle OpenGL and bf_gpu calls. This commit creates a RAS_ILightObject interface and a RAS_OpenGLLight implementation. =================================================================== M source/gameengine/Converter/BL_BlenderDataConversion.cpp M source/gameengine/Ketsji/KX_KetsjiEngine.cpp M source/gameengine/Ketsji/KX_Light.cpp M source/gameengine/Ketsji/KX_Light.h M source/gameengine/Ketsji/KX_LightIpoSGController.cpp M source/gameengine/Ketsji/KX_LightIpoSGController.h M source/gameengine/Ketsji/KX_Scene.cpp M source/gameengine/Rasterizer/CMakeLists.txt A source/gameengine/Rasterizer/RAS_ILightObject.h M source/gameengine/Rasterizer/RAS_IRasterizer.h D source/gameengine/Rasterizer/RAS_LightObject.h M source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt A source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLLight.cpp A source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLLight.h M source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp M source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h M source/gameengine/VideoTexture/Texture.cpp =================================================================== diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp index 8779cdd..e604b7b 100644 --- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp +++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp @@ -68,6 +68,8 @@ #include "KX_GameObject.h" #include "RAS_FramingManager.h" #include "RAS_MeshObject.h" +#include "RAS_IRasterizer.h" +#include "RAS_ILightObject.h" #include "KX_ConvertActuators.h" #include "KX_ConvertControllers.h" @@ -1767,22 +1769,22 @@ static void BL_CreatePhysicsObjectNew(KX_GameObject* gameobj, static KX_LightObject *gamelight_from_blamp(Object *ob, Lamp *la, unsigned int layerflag, KX_Scene *kxscene, RAS_IRasterizer *rasterizer, KX_BlenderSceneConverter *converter) { - RAS_LightObject lightobj; + RAS_ILightObject *lightobj = rasterizer->CreateLight(); KX_LightObject *gamelight; - lightobj.m_att1 = la->att1; - lightobj.m_att2 = (la->mode & LA_QUAD) ? la->att2 : 0.0f; - lightobj.m_red = la->r; - lightobj.m_green = la->g; - lightobj.m_blue = la->b; - lightobj.m_distance = la->dist; - lightobj.m_energy = la->energy; - lightobj.m_layer = layerflag; - lightobj.m_spotblend = la->spotblend; - lightobj.m_spotsize = la->spotsize; + lightobj->m_att1 = la->att1; + lightobj->m_att2 = (la->mode & LA_QUAD) ? la->att2 : 0.0f; + lightobj->m_color[0] = la->r; + lightobj->m_color[1] = la->g; + lightobj->m_color[2] = la->b; + lightobj->m_distance = la->dist; + lightobj->m_energy = la->energy; + lightobj->m_layer = layerflag; + lightobj->m_spotblend = la->spotblend; + lightobj->m_spotsize = la->spotsize; - lightobj.m_nodiffuse = (la->mode & LA_NO_DIFF) != 0; - lightobj.m_nospecular = (la->mode & LA_NO_SPEC) != 0; + lightobj->m_nodiffuse = (la->mode & LA_NO_DIFF) != 0; + lightobj->m_nospecular = (la->mode & LA_NO_SPEC) != 0; bool glslmat = converter->GetGLSLMaterials(); @@ -1790,18 +1792,18 @@ static KX_LightObject *gamelight_from_blamp(Object *ob, Lamp *la, unsigned int l if (glslmat==0) { if (la->mode & LA_NEG) { - lightobj.m_red = -lightobj.m_red; - lightobj.m_green = -lightobj.m_green; - lightobj.m_blue = -lightobj.m_blue; + lightobj->m_color[0] = -lightobj->m_color[0]; + lightobj->m_color[1] = -lightobj->m_color[1]; + lightobj->m_color[2] = -lightobj->m_color[2]; } } if (la->type==LA_SUN) { - lightobj.m_type = RAS_LightObject::LIGHT_SUN; + lightobj->m_type = RAS_ILightObject::LIGHT_SUN; } else if (la->type==LA_SPOT) { - lightobj.m_type = RAS_LightObject::LIGHT_SPOT; + lightobj->m_type = RAS_ILightObject::LIGHT_SPOT; } else { - lightobj.m_type = RAS_LightObject::LIGHT_NORMAL; + lightobj->m_type = RAS_ILightObject::LIGHT_NORMAL; } gamelight = new KX_LightObject(kxscene, KX_Scene::m_callbacks, rasterizer, diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp index 1bcfc4c..231590c 100644 --- a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp +++ b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp @@ -49,6 +49,7 @@ #include "RAS_Rect.h" #include "RAS_IRasterizer.h" #include "RAS_ICanvas.h" +#include "RAS_ILightObject.h" #include "MT_Vector3.h" #include "MT_Transform.h" #include "SCA_IInputDevice.h" @@ -1156,10 +1157,11 @@ void KX_KetsjiEngine::RenderShadowBuffers(KX_Scene *scene) KX_GameObject *gameobj = (KX_GameObject*)lightlist->GetValue(i); KX_LightObject *light = (KX_LightObject*)gameobj; + RAS_ILightObject *raslight = light->GetLightData(); - light->Update(); + raslight->Update(); - if (m_rasterizer->GetDrawingMode() == RAS_IRasterizer::KX_TEXTURED && light->HasShadowBuffer()) { + if (m_rasterizer->GetDrawingMode() == RAS_IRasterizer::KX_TEXTURED && raslight->HasShadowBuffer()) { /* make temporary camera */ RAS_CameraData camdata = RAS_CameraData(); KX_Camera *cam = new KX_Camera(scene, scene->m_callbacks, camdata, true, true); @@ -1172,10 +1174,10 @@ void KX_KetsjiEngine::RenderShadowBuffers(KX_Scene *scene) m_rasterizer->SetDrawingMode(RAS_IRasterizer::KX_SHADOW); /* binds framebuffer object, sets up camera .. */ - light->BindShadowBuffer(m_rasterizer, m_canvas, cam, camtrans); + raslight->BindShadowBuffer(m_canvas, cam, camtrans); /* update scene */ - scene->CalculateVisibleMeshes(m_rasterizer, cam, light->GetShadowLayer()); + scene->CalculateVisibleMeshes(m_rasterizer, cam, raslight->GetShadowLayer()); /* render */ m_rasterizer->ClearDepthBuffer(); @@ -1183,7 +1185,7 @@ void KX_KetsjiEngine::RenderShadowBuffers(KX_Scene *scene) scene->RenderBuckets(camtrans, m_rasterizer); /* unbind framebuffer object, restore drawmode, free camera */ - light->UnbindShadowBuffer(m_rasterizer); + raslight->UnbindShadowBuffer(); m_rasterizer->SetDrawingMode(drawmode); cam->Release(); } diff --git a/source/gameengine/Ketsji/KX_Light.cpp b/source/gameengine/Ketsji/KX_Light.cpp index 20db6d2..8813831 100644 --- a/source/gameengine/Ketsji/KX_Light.cpp +++ b/source/gameengine/Ketsji/KX_Light.cpp @@ -35,12 +35,11 @@ #include <stdio.h> -#include "GL/glew.h" - #include "KX_Light.h" #include "KX_Camera.h" #include "RAS_IRasterizer.h" #include "RAS_ICanvas.h" +#include "RAS_ILightObject.h" #include "KX_PyMath.h" @@ -56,16 +55,16 @@ KX_LightObject::KX_LightObject(void* sgReplicationInfo,SG_Callbacks callbacks, RAS_IRasterizer* rasterizer, - const RAS_LightObject& lightobj, + RAS_ILightObject* lightobj, bool glsl) : KX_GameObject(sgReplicationInfo,callbacks), m_rasterizer(rasterizer) { m_lightobj = lightobj; - m_lightobj.m_scene = sgReplicationInfo; - m_lightobj.m_light = this; - m_rasterizer->AddLight(&m_lightobj); - m_glsl = glsl; + m_lightobj->m_scene = sgReplicationInfo; + m_lightobj->m_light = this; + m_rasterizer->AddLight(m_lightobj); + m_lightobj->m_glsl = glsl; m_blenderscene = ((KX_Scene*)sgReplicationInfo)->GetBlenderScene(); m_base = NULL; }; @@ -73,18 +72,11 @@ KX_LightObject::KX_LightObject(void* sgReplicationInfo,SG_Callbacks callbacks, KX_LightObject::~KX_LightObject() { - GPULamp *lamp; - Lamp *la = (Lamp*)GetBlenderObject()->data; - - if ((lamp = GetGPULamp())) { - float obmat[4][4] = {{0}}; - GPU_lamp_update(lamp, 0, 0, obmat); - GPU_lamp_update_distance(lamp, la->dist, la->att1, la->att2); - GPU_lamp_update_spot(lamp, la->spotsize, la->spotblend); + if (m_lightobj) { + m_rasterizer->RemoveLight(m_lightobj); + delete(m_lightobj); } - m_rasterizer->RemoveLight(&m_lightobj); - if (m_base) { BKE_scene_base_unlink(m_blenderscene, m_base); MEM_freeN(m_base); @@ -99,225 +91,25 @@ CValue* KX_LightObject::GetReplica() replica->ProcessReplica(); - replica->m_lightobj.m_light = replica; - m_rasterizer->AddLight(&replica->m_lightobj); + replica->m_lightobj = m_lightobj->Clone(); + replica->m_lightobj->m_light = replica; + m_rasterizer->AddLight(replica->m_lightobj); if (m_base) m_base = NULL; return replica; } -bool KX_LightObject::ApplyLight(KX_Scene *kxscene, int oblayer, int slot) -{ - KX_Scene* lightscene = (KX_Scene*)m_lightobj.m_scene; - float vec[4]; - int scenelayer = ~0; - - if (kxscene && kxscene->GetBlenderScene()) - scenelayer = kxscene->GetBlenderScene()->lay; - - /* only use lights in the same layer as the object */ - if (!(m_lightobj.m_layer & oblayer)) - return false; - /* only use lights in the same scene, and in a visible layer */ - if (kxscene != lightscene || !(m_lightobj.m_layer & scenelayer)) - return false; - - // lights don't get their openGL matrix updated, do it now - if (GetSGNode()->IsDirty()) - GetOpenGLMatrix(); - - MT_CmMatrix4x4& worldmatrix= *GetOpenGLMatrixPtr(); - - vec[0] = worldmatrix(0,3); - vec[1] = worldmatrix(1,3); - vec[2] = worldmatrix(2,3); - vec[3] = 1.0f; - - if (m_lightobj.m_type==RAS_LightObject::LIGHT_SUN) { - - vec[0] = worldmatrix(0,2); - vec[1] = worldmatrix(1,2); - vec[2] = worldmatrix(2,2); - //vec[0] = base->object->obmat[2][0]; - //vec[1] = base->object->obmat[2][1]; - //vec[2] = base->object->obmat[2][2]; - vec[3] = 0.0; - glLightfv((GLenum)(GL_LIGHT0+slot), GL_POSITION, vec); - } - else { - //vec[3] = 1.0; - glLightfv((GLenum)(GL_LIGHT0+slot), GL_POSITION, vec); - glLightf((GLenum)(GL_LIGHT0+slot), GL_CONSTANT_ATTENUATION, 1.0); - glLightf((GLenum)(GL_LIGHT0+slot), GL_LINEAR_ATTENUATION, m_lightobj.m_att1/m_lightobj.m_distance); - // without this next line it looks backward compatible. - //attennuation still is acceptable - glLightf((GLenum)(GL_LIGHT0+slot), GL_QUADRATIC_ATTENUATION, m_lightobj.m_att2/(m_lightobj.m_distance*m_lightobj.m_distance)); - - if (m_lightobj.m_type==RAS_LightObject::LIGHT_SPOT) { - vec[0] = -worldmatrix(0,2); - vec[1] = -worldmatrix(1,2); - vec[2] = -worldmatrix(2,2); - //vec[0] = -base->object->obmat[2][0]; - //vec[1] = -base->object->obmat[2][1]; - //vec[2] = -base->object->obmat[2][2]; - glLightfv((GLenum)(GL_LIGHT0+slot), GL_SPOT_DIRECTION, vec); - glLightf((GLenum)(GL_LIGHT0+slot), GL_SPOT_CUTOFF, RAD2DEGF(m_lightobj.m_spotsize * 0.5f)); - glLightf((GLenum)(GL_LIGHT0+slot), GL_SPOT_EXPONENT, 128.0f * m_lightobj.m_spotblend); - } - else { - glLightf((GLenum)(GL_LIGHT0+slot), GL_SPOT_CUTOFF, 180.0); - } - } - - if (m_lightobj.m_nodiffuse) { - vec[0] = vec[1] = vec[2] = vec[3] = 0.0; - } - else { - vec[0] = m_lightobj.m_energy*m_lightobj.m_red; - vec[1] = m_lightobj.m_energy*m_lightobj.m_green; - vec[2] = m_lightobj.m_energy*m_lightobj.m_blue; - vec[3] = 1.0; - } - - glLightfv((GLenum)(GL_LIGHT0+slot), GL_DIFFUSE, vec); - if (m_lightobj.m_nospecular) - { - vec[0] = vec[1] = vec[2] = vec[3] = 0.0; - } - else if (m_lightobj.m_nodiffuse) { - vec[0] = m_lightobj.m_energy*m_lightobj.m_red; - vec[1] = m_lightobj.m_energy*m_lightobj.m_green; - vec[2] = m_lightobj.m_energy*m_lightobj.m_blue; - vec[3] = 1.0; - } - - glLightfv((GLenum)(GL_LIGHT0+slot), GL_SPECULAR, vec); - glEnable((GLenum)(GL_LIGHT0+slot)); - - return true; -} - -GPULamp *KX_LightObject::GetGPULamp() -{ - if (m_glsl) - return GPU_lamp_from_blender(m_blenderscene, GetBlend @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs