diff options
Diffstat (limited to 'source/gameengine/BlenderRoutines')
10 files changed, 185 insertions, 137 deletions
diff --git a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp index d89d2d80ab4..d8de24c610c 100644 --- a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp +++ b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp @@ -70,9 +70,10 @@ #include "DNA_view3d_types.h" #include "DNA_screen_types.h" #include "BKE_global.h" +#include "BKE_report.h" #include "BKE_utildefines.h" -#include "BIF_screen.h" -#include "BIF_scrarea.h" +//XXX #include "BIF_screen.h" +//XXX #include "BIF_scrarea.h" #include "BKE_main.h" #include "BLI_blenlib.h" @@ -86,29 +87,39 @@ #ifdef __cplusplus extern "C" { #endif -#include "BSE_headerbuttons.h" +//XXX #include "BSE_headerbuttons.h" void update_for_newframe(); #ifdef __cplusplus } #endif -static BlendFileData *load_game_data(char *filename) { - BlendReadError error; - BlendFileData *bfd= BLO_read_from_file(filename, &error); +static BlendFileData *load_game_data(char *filename) +{ + ReportList reports; + BlendFileData *bfd; + + BKE_reports_init(&reports, RPT_STORE); + bfd= BLO_read_from_file(filename, &reports); + if (!bfd) { - printf("Loading %s failed: %s\n", filename, BLO_bre_as_string(error)); + printf("Loading %s failed: ", filename); + BKE_reports_print(&reports, RPT_ERROR); } + + BKE_reports_clear(&reports); + return bfd; } extern "C" void StartKetsjiShell(struct ScrArea *area, + struct ARegion *ar, char* scenename, struct Main* maggie1, struct SpaceIpo *sipo, int always_use_expand_framing) { int exitrequested = KX_EXIT_REQUEST_NO_REQUEST; - + Scene *scene= NULL; // XXX give as arg Main* blenderdata = maggie1; char* startscenename = scenename; @@ -131,6 +142,7 @@ extern "C" void StartKetsjiShell(struct ScrArea *area, do { View3D *v3d= (View3D*) area->spacedata.first; + RegionView3D *rv3d= (RegionView3D*) ar->regiondata; // get some preferences SYS_SystemHandle syshandle = SYS_GetSystem(); @@ -201,12 +213,12 @@ extern "C" void StartKetsjiShell(struct ScrArea *area, //lock frame and camera enabled - storing global values - int tmp_lay= G.scene->lay; - Object *tmp_camera = G.scene->camera; + int tmp_lay= scene->lay; + Object *tmp_camera = scene->camera; - if (G.vd->scenelock==0){ - G.scene->lay= v3d->lay; - G.scene->camera= v3d->camera; + if (v3d->scenelock==0){ + scene->lay= v3d->lay; + scene->camera= v3d->camera; } @@ -218,17 +230,17 @@ extern "C" void StartKetsjiShell(struct ScrArea *area, for (i = 0; i < 16; i++) { - float *viewmat_linear= (float*) v3d->viewmat; + float *viewmat_linear= (float*) rv3d->viewmat; viewmat.setElem(i, viewmat_linear[i]); } for (i = 0; i < 16; i++) { - float *projmat_linear = (float*) area->winmat; + float *projmat_linear; //XXX = (float*) area->winmat; projmat.setElem(i, projmat_linear[i]); } if(v3d->persp==V3D_CAMOB) { - camzoom = (1.41421 + (v3d->camzoom / 50.0)); + camzoom = (1.41421 + (rv3d->camzoom / 50.0)); camzoom *= camzoom; } else @@ -357,7 +369,7 @@ extern "C" void StartKetsjiShell(struct ScrArea *area, blscene); // some python things - PyObject* dictionaryobject = initGamePythonScripting("Ketsji", psl_Lowest); + PyObject* dictionaryobject = initGamePythonScripting("Ketsji", psl_Lowest, blenderdata); ketsjiengine->SetPythonDictionary(dictionaryobject); initRasterizer(rasterizer, canvas); PyObject *gameLogic = initGameLogic(ketsjiengine, startscene); @@ -368,10 +380,15 @@ extern "C" void StartKetsjiShell(struct ScrArea *area, initGameKeys(); initPythonConstraintBinding(); initMathutils(); + initBGL(); #ifdef WITH_FFMPEG initVideoTexture(); #endif + //initialize Dome Settings + if(blscene->r.stereomode == RAS_IRasterizer::RAS_STEREO_DOME) + ketsjiengine->InitDome(blscene->r.domesize, blscene->r.domeres, blscene->r.domemode, blscene->r.domeangle, blscene->r.domeresbuf, blscene->r.dometext); + if (sceneconverter) { // convert and add scene @@ -413,10 +430,10 @@ extern "C" void StartKetsjiShell(struct ScrArea *area, } // test for the ESC key - while (qtest()) + while (0) //XXX while (qtest()) { short val; - unsigned short event = extern_qread(&val); + unsigned short event = 0; //XXX extern_qread(&val); if (keyboarddevice->ConvertBlenderEvent(event,val)) exitrequested = KX_EXIT_REQUEST_BLENDER_ESC; @@ -425,9 +442,9 @@ extern "C" void StartKetsjiShell(struct ScrArea *area, * should this really be? */ if (event==MOUSEX) { - val = val - scrarea_get_win_x(area); + val = 0;//XXX val - scrarea_get_win_x(area); } else if (event==MOUSEY) { - val = scrarea_get_win_height(area) - (val - scrarea_get_win_y(area)) - 1; + val = 0;//XXX scrarea_get_win_height(area) - (val - scrarea_get_win_y(area)) - 1; } mousedevice->ConvertBlenderEvent(event,val); @@ -473,9 +490,9 @@ extern "C" void StartKetsjiShell(struct ScrArea *area, gameLogic_keys = NULL; } //lock frame and camera enabled - restoring global values - if (G.vd->scenelock==0){ - G.scene->lay= tmp_lay; - G.scene->camera= tmp_camera; + if (v3d->scenelock==0){ + scene->lay= tmp_lay; + scene->camera= tmp_camera; } // set the cursor back to normal @@ -527,7 +544,9 @@ extern "C" void StartKetsjiShell(struct ScrArea *area, SND_DeviceManager::Unsubscribe(); } while (exitrequested == KX_EXIT_REQUEST_RESTART_GAME || exitrequested == KX_EXIT_REQUEST_START_OTHER_GAME); - + + Py_DECREF(pyGlobalDict); + if (bfd) BLO_blendfiledata_free(bfd); BLI_strncpy(G.sce, oldsce, sizeof(G.sce)); @@ -537,6 +556,7 @@ extern "C" void StartKetsjiShell(struct ScrArea *area, } extern "C" void StartKetsjiShellSimulation(struct ScrArea *area, + struct ARegion *ar, char* scenename, struct Main* maggie, struct SpaceIpo *sipo, @@ -656,7 +676,7 @@ extern "C" void StartKetsjiShellSimulation(struct ScrArea *area, blscene); // some python things - PyObject* dictionaryobject = initGamePythonScripting("Ketsji", psl_Lowest); + PyObject* dictionaryobject = initGamePythonScripting("Ketsji", psl_Lowest, blenderdata); ketsjiengine->SetPythonDictionary(dictionaryobject); initRasterizer(rasterizer, canvas); PyObject *gameLogic = initGameLogic(ketsjiengine, startscene); @@ -664,6 +684,7 @@ extern "C" void StartKetsjiShellSimulation(struct ScrArea *area, initGameKeys(); initPythonConstraintBinding(); initMathutils(); + initBGL(); #ifdef WITH_FFMPEG initVideoTexture(); #endif diff --git a/source/gameengine/BlenderRoutines/CMakeLists.txt b/source/gameengine/BlenderRoutines/CMakeLists.txt index d65e6a012df..e090a4b9c56 100644 --- a/source/gameengine/BlenderRoutines/CMakeLists.txt +++ b/source/gameengine/BlenderRoutines/CMakeLists.txt @@ -15,6 +15,8 @@ SET(INC ../../../source/gameengine/Ketsji ../../../source/blender/blenlib ../../../source/blender/blenkernel + ../../../source/blender/editors/include + ../../../source/blender/windowmanager ../../../source/blender ../../../source/blender/include ../../../source/blender/makesdna diff --git a/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp b/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp index 1604dfe5cce..750a1ef3f93 100644 --- a/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp +++ b/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp @@ -26,7 +26,7 @@ * ***** END GPL LICENSE BLOCK ***** */ -#include "BIF_scrarea.h" +//XXX #include "BIF_scrarea.h" #include "KX_BlenderCanvas.h" #ifdef HAVE_CONFIG_H @@ -93,12 +93,12 @@ void KX_BlenderCanvas::ClearBuffer(int type) int KX_BlenderCanvas::GetWidth( ) const { - return scrarea_get_win_width(m_area); + return 0; //XXX scrarea_get_win_width(m_area); } int KX_BlenderCanvas::GetHeight( ) const { - return scrarea_get_win_height(m_area); + return 0; //XXX scrarea_get_win_height(m_area); } RAS_Rect & @@ -116,8 +116,8 @@ SetViewPort( ){ int vp_width = (x2 - x1) + 1; int vp_height = (y2 - y1) + 1; - int minx = scrarea_get_win_x(m_area); - int miny = scrarea_get_win_y(m_area); + int minx = 0;//XXX scrarea_get_win_x(m_area); + int miny = 0;//XXX scrarea_get_win_y(m_area); m_area_rect.SetLeft(minx + x1); m_area_rect.SetBottom(miny + y1); @@ -159,9 +159,9 @@ void KX_BlenderCanvas::SetMouseState(RAS_MouseState mousestate) // (0,0) is top left, (width,height) is bottom right void KX_BlenderCanvas::SetMousePosition(int x,int y) { - int winX = scrarea_get_win_x(m_area); - int winY = scrarea_get_win_y(m_area); - int winH = scrarea_get_win_height(m_area); + int winX = 0;//XXX scrarea_get_win_x(m_area); + int winY = 0;//XXX scrarea_get_win_y(m_area); + int winH = 0;//XXX scrarea_get_win_height(m_area); BL_warp_pointer(winX + x, winY + (winH-y-1)); } diff --git a/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp b/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp index 54d1eb7e011..648ad79210e 100644 --- a/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp +++ b/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp @@ -44,7 +44,7 @@ #include "BMF_Api.h" -#include "BIF_gl.h" +#include "GL/glew.h" #include "BL_Material.h" // MAXTEX @@ -65,10 +65,10 @@ #include "BKE_image.h" extern "C" { -#include "BDR_drawmesh.h" -#include "BIF_mywindow.h" -#include "BIF_toolbox.h" -#include "BIF_graphics.h" /* For CURSOR_NONE CURSOR_WAIT CURSOR_STD */ +//XXX #include "BDR_drawmesh.h" +//XXX #include "BIF_mywindow.h" +//XXX #include "BIF_toolbox.h" +//XXX #include "BIF_graphics.h" /* For CURSOR_NONE CURSOR_WAIT CURSOR_STD */ } @@ -84,12 +84,12 @@ void spack(unsigned int ucol) void BL_warp_pointer(int x,int y) { - warp_pointer(x,y); + //XXX warp_pointer(x,y); } void BL_SwapBuffers() { - myswapbuffers(); + //XXX myswapbuffers(); } void DisableForText() @@ -201,19 +201,19 @@ void BL_print_gamedebug_line_padded(char* text, int xco, int yco, int width, int void BL_HideMouse() { - set_cursor(CURSOR_NONE); + //XXX set_cursor(CURSOR_NONE); } void BL_WaitMouse() { - set_cursor(CURSOR_WAIT); + //XXX set_cursor(CURSOR_WAIT); } void BL_NormalMouse() { - set_cursor(CURSOR_STD); + //XXX set_cursor(CURSOR_STD); } #define MAX_FILE_LENGTH 512 @@ -226,9 +226,9 @@ void BL_MakeScreenShot(struct ScrArea *area, const char* filename) // filename read - only /* XXX will need to change at some point */ - BIF_screendump(0); + //XXX BIF_screendump(0); // write+read filename - write_screendump((char*) copyfilename); + //XXX write_screendump((char*) copyfilename); } diff --git a/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.h b/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.h index 8e5d508f8cb..7da4b9efb68 100644 --- a/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.h +++ b/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.h @@ -35,14 +35,11 @@ #include <map> -/* need to be here for conversion purposes */ -#ifdef FREE_WINDOWS -#undef HKEY -#endif - -#include "mydevice.h" +#include "wm_event_types.h" #include "SCA_IInputDevice.h" + + /** Base Class for Blender specific inputdevices. Blender specific inputdevices are used when the gameengine is running in embedded mode instead of standalone mode. */ @@ -69,10 +66,10 @@ public: m_reverseKeyTranslateTable[TIMER0 ] = KX_TIMER0 ; m_reverseKeyTranslateTable[TIMER1 ] = KX_TIMER1 ; m_reverseKeyTranslateTable[TIMER2 ] = KX_TIMER2 ; - m_reverseKeyTranslateTable[TIMER3 ] = KX_TIMER3 ; - - // SYSTEM + // SYSTEM +#if 0 + /* **** XXX **** */ m_reverseKeyTranslateTable[KEYBD ] = KX_KEYBD ; m_reverseKeyTranslateTable[RAWKEYBD ] = KX_RAWKEYBD ; m_reverseKeyTranslateTable[REDRAW ] = KX_REDRAW ; @@ -83,7 +80,8 @@ public: m_reverseKeyTranslateTable[WINCLOSE ] = KX_WINCLOSE ; m_reverseKeyTranslateTable[WINQUIT ] = KX_WINQUIT ; m_reverseKeyTranslateTable[Q_FIRSTTIME ] = KX_Q_FIRSTTIME ; - + /* **** XXX **** */ +#endif // standard keyboard m_reverseKeyTranslateTable[AKEY ] = KX_AKEY ; @@ -93,7 +91,15 @@ public: m_reverseKeyTranslateTable[EKEY ] = KX_EKEY ; m_reverseKeyTranslateTable[FKEY ] = KX_FKEY ; m_reverseKeyTranslateTable[GKEY ] = KX_GKEY ; +//XXX clean up +#ifdef WIN32 +#define HKEY 'h' +#endif m_reverseKeyTranslateTable[HKEY ] = KX_HKEY ; +//XXX clean up +#ifdef WIN32 +#undef HKEY +#endif m_reverseKeyTranslateTable[IKEY ] = KX_IKEY ; m_reverseKeyTranslateTable[JKEY ] = KX_JKEY ; m_reverseKeyTranslateTable[KKEY ] = KX_KKEY ; diff --git a/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.cpp b/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.cpp index 4b794380610..877a0d39acf 100644 --- a/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.cpp +++ b/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.cpp @@ -74,7 +74,7 @@ void KX_BlenderKeyboardDevice::NextFrame() // now convert justpressed keyevents into regular (active) keyevents int previousTable = 1-m_currentTable; - for (int keyevent= KX_BEGINKEY; keyevent< KX_ENDKEY;keyevent++) + for (int keyevent= KX_BEGINKEY; keyevent<= KX_ENDKEY;keyevent++) { SCA_InputEvent& oldevent = m_eventStatusTables[previousTable][keyevent]; if (oldevent.m_status == SCA_InputEvent::KX_JUSTACTIVATED || @@ -100,7 +100,7 @@ bool KX_BlenderKeyboardDevice::ConvertBlenderEvent(unsigned short incode,short v KX_EnumInputs kxevent = this->ToNative(incode); // only process it, if it's a key - if (kxevent >= KX_BEGINKEY && kxevent < KX_ENDKEY) + if (kxevent >= KX_BEGINKEY && kxevent <= KX_ENDKEY) { int previousTable = 1-m_currentTable; diff --git a/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp b/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp index 42ad7769cbd..9dbda3f195b 100644 --- a/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp +++ b/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp @@ -28,6 +28,8 @@ #include "GL/glew.h" +#include "DNA_scene_types.h" + #include "RAS_IRenderTools.h" #include "RAS_IRasterizer.h" #include "RAS_LightObject.h" @@ -67,6 +69,7 @@ void KX_BlenderRenderTools::BeginFrame(RAS_IRasterizer* rasty) m_clientobject = NULL; m_lastlightlayer = -1; m_lastlighting = false; + m_lastauxinfo = NULL; DisableOpenGLLights(); } @@ -80,25 +83,27 @@ void KX_BlenderRenderTools::EndFrame(RAS_IRasterizer* rasty) * has a maximum of 8 lights (simultaneous), so 20 * 8 lights are possible in * a scene. */ -void KX_BlenderRenderTools::ProcessLighting(RAS_IRasterizer *rasty, int layer, const MT_Transform& viewmat) +void KX_BlenderRenderTools::ProcessLighting(RAS_IRasterizer *rasty, bool uselights, const MT_Transform& viewmat) { - if(m_lastlightlayer == layer) - return; + bool enable = false; + int layer= -1; - m_lastlightlayer = layer; + /* find the layer */ + if(uselights) { + if(m_clientobject) + layer = static_cast<KX_GameObject*>(m_clientobject)->GetLayer(); + } - bool enable = false; + /* avoid state switching */ + if(m_lastlightlayer == layer && m_lastauxinfo == m_auxilaryClientInfo) + return; - if (layer >= 0) - { - if (m_clientobject) - { - if (layer == RAS_LIGHT_OBJECT_LAYER) - layer = static_cast<KX_GameObject*>(m_clientobject)->GetLayer(); + m_lastlightlayer = layer; + m_lastauxinfo = m_auxilaryClientInfo; - enable = applyLights(layer, viewmat); - } - } + /* enable/disable lights as needed */ + if(layer >= 0) + enable = applyLights(layer, viewmat); if(enable) EnableOpenGLLights(rasty); @@ -324,11 +329,16 @@ void KX_BlenderRenderTools::PopMatrix() int KX_BlenderRenderTools::applyLights(int objectlayer, const MT_Transform& viewmat) { // taken from blender source, incompatibility between Blender Object / GameObject + KX_Scene* kxscene = (KX_Scene*)m_auxilaryClientInfo; + int scenelayer = ~0; float glviewmat[16]; unsigned int count; float vec[4]; vec[3]= 1.0; + + if(kxscene && kxscene->GetBlenderScene()) + scenelayer = kxscene->GetBlenderScene()->lay; for(count=0; count<m_numgllights; count++) glDisable((GLenum)(GL_LIGHT0+count)); @@ -343,71 +353,77 @@ int KX_BlenderRenderTools::applyLights(int objectlayer, const MT_Transform& view for (lit = m_lights.begin(), count = 0; !(lit==m_lights.end()) && count < m_numgllights; ++lit) { RAS_LightObject* lightdata = (*lit); - if (lightdata->m_layer & objectlayer) - { - vec[0] = (*(lightdata->m_worldmatrix))(0,3); - vec[1] = (*(lightdata->m_worldmatrix))(1,3); - vec[2] = (*(lightdata->m_worldmatrix))(2,3); - vec[3] = 1; + KX_Scene* lightscene = (KX_Scene*)lightdata->m_scene; - if(lightdata->m_type==RAS_LightObject::LIGHT_SUN) { - - vec[0] = (*(lightdata->m_worldmatrix))(0,2); - vec[1] = (*(lightdata->m_worldmatrix))(1,2); - vec[2] = (*(lightdata->m_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+count), GL_POSITION, vec); - } - else { - //vec[3]= 1.0; - glLightfv((GLenum)(GL_LIGHT0+count), GL_POSITION, vec); - glLightf((GLenum)(GL_LIGHT0+count), GL_CONSTANT_ATTENUATION, 1.0); - glLightf((GLenum)(GL_LIGHT0+count), GL_LINEAR_ATTENUATION, lightdata->m_att1/lightdata->m_distance); - // without this next line it looks backward compatible. - //attennuation still is acceptable - glLightf((GLenum)(GL_LIGHT0+count), GL_QUADRATIC_ATTENUATION, lightdata->m_att2/(lightdata->m_distance*lightdata->m_distance)); - - if(lightdata->m_type==RAS_LightObject::LIGHT_SPOT) { - vec[0] = -(*(lightdata->m_worldmatrix))(0,2); - vec[1] = -(*(lightdata->m_worldmatrix))(1,2); - vec[2] = -(*(lightdata->m_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+count), GL_SPOT_DIRECTION, vec); - glLightf((GLenum)(GL_LIGHT0+count), GL_SPOT_CUTOFF, lightdata->m_spotsize/2.0); - glLightf((GLenum)(GL_LIGHT0+count), GL_SPOT_EXPONENT, 128.0*lightdata->m_spotblend); - } - else glLightf((GLenum)(GL_LIGHT0+count), GL_SPOT_CUTOFF, 180.0); - } + /* only use lights in the same layer as the object */ + if(!(lightdata->m_layer & objectlayer)) + continue; + /* only use lights in the same scene, and in a visible layer */ + if(kxscene != lightscene || !(lightdata->m_layer & scenelayer)) + continue; + + vec[0] = (*(lightdata->m_worldmatrix))(0,3); + vec[1] = (*(lightdata->m_worldmatrix))(1,3); + vec[2] = (*(lightdata->m_worldmatrix))(2,3); + vec[3] = 1; + + if(lightdata->m_type==RAS_LightObject::LIGHT_SUN) { - if (lightdata->m_nodiffuse) - { - vec[0] = vec[1] = vec[2] = vec[3] = 0.0; - } else { - vec[0]= lightdata->m_energy*lightdata->m_red; - vec[1]= lightdata->m_energy*lightdata->m_green; - vec[2]= lightdata->m_energy*lightdata->m_blue; - vec[3]= 1.0; - } - glLightfv((GLenum)(GL_LIGHT0+count), GL_DIFFUSE, vec); - if (lightdata->m_nospecular) - { - vec[0] = vec[1] = vec[2] = vec[3] = 0.0; - } else if (lightdata->m_nodiffuse) { - vec[0]= lightdata->m_energy*lightdata->m_red; - vec[1]= lightdata->m_energy*lightdata->m_green; - vec[2]= lightdata->m_energy*lightdata->m_blue; - vec[3]= 1.0; + vec[0] = (*(lightdata->m_worldmatrix))(0,2); + vec[1] = (*(lightdata->m_worldmatrix))(1,2); + vec[2] = (*(lightdata->m_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+count), GL_POSITION, vec); + } + else { + //vec[3]= 1.0; + glLightfv((GLenum)(GL_LIGHT0+count), GL_POSITION, vec); + glLightf((GLenum)(GL_LIGHT0+count), GL_CONSTANT_ATTENUATION, 1.0); + glLightf((GLenum)(GL_LIGHT0+count), GL_LINEAR_ATTENUATION, lightdata->m_att1/lightdata->m_distance); + // without this next line it looks backward compatible. + //attennuation still is acceptable + glLightf((GLenum)(GL_LIGHT0+count), GL_QUADRATIC_ATTENUATION, lightdata->m_att2/(lightdata->m_distance*lightdata->m_distance)); + + if(lightdata->m_type==RAS_LightObject::LIGHT_SPOT) { + vec[0] = -(*(lightdata->m_worldmatrix))(0,2); + vec[1] = -(*(lightdata->m_worldmatrix))(1,2); + vec[2] = -(*(lightdata->m_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+count), GL_SPOT_DIRECTION, vec); + glLightf((GLenum)(GL_LIGHT0+count), GL_SPOT_CUTOFF, lightdata->m_spotsize/2.0); + glLightf((GLenum)(GL_LIGHT0+count), GL_SPOT_EXPONENT, 128.0*lightdata->m_spotblend); } - glLightfv((GLenum)(GL_LIGHT0+count), GL_SPECULAR, vec); - glEnable((GLenum)(GL_LIGHT0+count)); - - count++; + else glLightf((GLenum)(GL_LIGHT0+count), GL_SPOT_CUTOFF, 180.0); + } + + if (lightdata->m_nodiffuse) + { + vec[0] = vec[1] = vec[2] = vec[3] = 0.0; + } else { + vec[0]= lightdata->m_energy*lightdata->m_red; + vec[1]= lightdata->m_energy*lightdata->m_green; + vec[2]= lightdata->m_energy*lightdata->m_blue; + vec[3]= 1.0; + } + glLightfv((GLenum)(GL_LIGHT0+count), GL_DIFFUSE, vec); + if (lightdata->m_nospecular) + { + vec[0] = vec[1] = vec[2] = vec[3] = 0.0; + } else if (lightdata->m_nodiffuse) { + vec[0]= lightdata->m_energy*lightdata->m_red; + vec[1]= lightdata->m_energy*lightdata->m_green; + vec[2]= lightdata->m_energy*lightdata->m_blue; + vec[3]= 1.0; } + glLightfv((GLenum)(GL_LIGHT0+count), GL_SPECULAR, vec); + glEnable((GLenum)(GL_LIGHT0+count)); + + count++; } glPopMatrix(); diff --git a/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h b/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h index ebf7562503f..60130e6bfc9 100644 --- a/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h +++ b/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h @@ -51,6 +51,7 @@ class KX_BlenderRenderTools : public RAS_IRenderTools { int m_lastlightlayer; bool m_lastlighting; + void *m_lastauxinfo; static unsigned int m_numgllights; public: @@ -62,7 +63,7 @@ public: void EnableOpenGLLights(RAS_IRasterizer *rasty); void DisableOpenGLLights(); - void ProcessLighting(RAS_IRasterizer *rasty, int layer, const MT_Transform& viewmat); + void ProcessLighting(RAS_IRasterizer *rasty, bool uselights, const MT_Transform& viewmat); void RenderText2D(RAS_TEXT_RENDER_MODE mode, const char* text, diff --git a/source/gameengine/BlenderRoutines/Makefile b/source/gameengine/BlenderRoutines/Makefile index e77d8e8380e..03a7a247727 100644 --- a/source/gameengine/BlenderRoutines/Makefile +++ b/source/gameengine/BlenderRoutines/Makefile @@ -47,8 +47,9 @@ CPPFLAGS += -I$(NAN_GLEW)/include CPPFLAGS += -I$(OPENGL_HEADERS) # because of kernel dependency on makesdna CPPFLAGS += -I../../blender/makesdna -CPPFLAGS += -I../../blender/include +CPPFLAGS += -I../../blender/editors/include # because of kernel dependency on imbuf +CPPFLAGS += -I../../blender/windowmanager CPPFLAGS += -I../../blender/imbuf CPPFLAGS += -I../../blender/blenlib CPPFLAGS += -I../../blender/blenkernel diff --git a/source/gameengine/BlenderRoutines/SConscript b/source/gameengine/BlenderRoutines/SConscript index 4a9c0e1286b..020402e9bcd 100644 --- a/source/gameengine/BlenderRoutines/SConscript +++ b/source/gameengine/BlenderRoutines/SConscript @@ -9,7 +9,7 @@ incs += ' #source/gameengine/Rasterizer/RAS_OpenGLRasterizer #intern/bmfont' incs += ' #source/gameengine/Converter #source/blender/imbuf' incs += ' #intern/ghost/include' incs += ' #intern/moto/include #source/gameengine/Ketsji #source/blender/blenlib' -incs += ' #source/blender/blenkernel #source/blender #source/blender/include' +incs += ' #source/blender/blenkernel #source/blender #source/blender/editors/include' incs += ' #source/blender/makesdna #source/gameengine/Rasterizer #source/gameengine/GameLogic' incs += ' #source/gameengine/Expressions #source/gameengine/Network' incs += ' #source/gameengine/SceneGraph #source/gameengine/Physics/common' @@ -17,6 +17,7 @@ incs += ' #source/gameengine/Physics/Bullet' incs += ' #source/gameengine/Network/LoopBackNetwork' incs += ' #intern/SoundSystem #source/blender/misc #source/blender/blenloader' incs += ' #extern/glew/include #source/blender/gpu' +incs += ' #source/blender/windowmanager' if env['WITH_BF_SOLID']: incs += ' #source/gameengine/Physics/Sumo #source/gameengine/Physics/Sumo/Fuzzics/include' @@ -35,4 +36,4 @@ if env['OURPLATFORM']=='win32-vc': cxxflags.append ('/GR') cxxflags.append ('/O2') -env.BlenderLib ( 'bf_bloutines', sources, Split(incs), defs, libtype=['game', 'game2', 'player'], priority=[0, 0, 55] , cxx_compileflags=cxxflags) +env.BlenderLib ( 'bf_bloutines', sources, Split(incs), defs, libtype=['core', 'player'], priority=[300, 45] , cxx_compileflags=cxxflags) |