improvement of 2d-filter custom shader,
[blender.git] / source / gameengine / BlenderRoutines / KX_BlenderRenderTools.cpp
index 8f93ad1a0aa318efcfcb896ebc7b0e41213ae6e9..220d174d464c00966be6991a3a28a749cf6a3374 100644 (file)
@@ -1,14 +1,11 @@
 /**
  * $Id$
- * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
+ * ***** BEGIN GPL LICENSE BLOCK *****
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
  * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version. The Blender
- * Foundation also sells licenses for use in proprietary software under
- * the Blender License.  See http://www.blender.org/BL/ for information
- * about this.
+ * of the License, or (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  *
  * Contributor(s): none yet.
  *
- * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ * ***** END GPL LICENSE BLOCK *****
  */
 
 #include "KX_BlenderRenderTools.h"
 
-#ifdef WIN32
-// OpenGL gl.h needs 'windows.h' on windows platforms 
-#include <windows.h>
-#endif //WIN32
-#ifdef __APPLE__
-#define GL_GLEXT_LEGACY 1
-#include <OpenGL/gl.h>
-#else
-#include <GL/gl.h>
-#endif
+#include "GL/glew.h"
 
 #include "RAS_IRenderTools.h"
 #include "RAS_IRasterizer.h"
@@ -94,8 +82,10 @@ int  KX_BlenderRenderTools::ProcessLighting(int layer)
        {
                if (m_clientobject)
                {
-
-                       
+                       if (layer == RAS_LIGHT_OBJECT_LAYER)
+                       {
+                               layer = static_cast<KX_GameObject*>(m_clientobject)->GetLayer();
+                       }
                        if (applyLights(layer))
                        {
                                EnableOpenGLLights();
@@ -104,9 +94,7 @@ int  KX_BlenderRenderTools::ProcessLighting(int layer)
                        {
                                DisableOpenGLLights();
                                result = false;
-                       }
-
-                       
+                       }                       
                }
        }
        return result;
@@ -128,6 +116,22 @@ void KX_BlenderRenderTools::BeginFrame(RAS_IRasterizer* rasty)
 
 }
 
+void KX_BlenderRenderTools::SetClientObject(void* obj)
+{
+       if (m_clientobject != obj)
+       {
+               if (obj == NULL || !((KX_GameObject*)obj)->IsNegativeScaling())
+               {
+                       glFrontFace(GL_CCW);
+               } else 
+               {
+                       glFrontFace(GL_CW);
+               }
+               m_clientobject = obj;
+               m_modified = true;
+       }
+}
+
 bool KX_BlenderRenderTools::RayHit(KX_ClientObjectInfo* client, MT_Point3& hit_point, MT_Vector3& hit_normal, void * const data)
 {
        double* const oglmatrix = (double* const) data;
@@ -260,17 +264,20 @@ void      KX_BlenderRenderTools::RenderText(int mode,RAS_IPolyMaterial* polymat,float
        STR_String mytext = ((CValue*)m_clientobject)->GetPropertyText("Text");
        
        const unsigned int flag = polymat->GetFlag();
-       struct TFace* tface = 0;
+       struct MTFace* tface = 0;
+       unsigned int *col = 0;
 
        if(flag & RAS_BLENDERMAT) {
                KX_BlenderMaterial *bl_mat = static_cast<KX_BlenderMaterial*>(polymat);
-               tface = bl_mat->GetTFace();
+               tface = bl_mat->GetMTFace();
+               col = bl_mat->GetMCol();
        } else {
                KX_PolygonMaterial* blenderpoly = static_cast<KX_PolygonMaterial*>(polymat);
-               tface = blenderpoly->GetTFace();
+               tface = blenderpoly->GetMTFace();
+               col = blenderpoly->GetMCol();
        }
        
-       BL_RenderText( mode,mytext,mytext.Length(),tface,v1,v2,v3,v4);
+       BL_RenderText( mode,mytext,mytext.Length(),tface,col,v1,v2,v3,v4);
        
 }
 
@@ -301,7 +308,7 @@ void KX_BlenderRenderTools::EnableOpenGLLights()
        glEnable(GL_COLOR_MATERIAL);
        glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
        glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, true);
-       if (bgl::QueryExtension(bgl::_GL_EXT_separate_specular_color) || bgl::QueryVersion(1, 2))
+       if (GLEW_EXT_separate_specular_color || GLEW_VERSION_1_2)
                glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);
 
 }
@@ -449,8 +456,41 @@ RAS_IPolyMaterial* KX_BlenderRenderTools::CreateBlenderPolyMaterial(
 
                texname,
                ba,matname,tile,tilexrep,tileyrep,mode,transparant,zsort, lightlayer
-               ,bIsTriangle,clientobject,(struct TFace*)tface);*/
+               ,bIsTriangle,clientobject,(struct MTFace*)tface);*/
        return NULL;
 }
 
+void KX_BlenderRenderTools::MotionBlur(RAS_IRasterizer* rasterizer)
+{
+       int state = rasterizer->GetMotionBlurState();
+       float motionblurvalue;
+       if(state)
+       {
+               motionblurvalue = rasterizer->GetMotionBlurValue();
+               if(state==1)
+               {
+                       //bugfix:load color buffer into accum buffer for the first time(state=1)
+                       glAccum(GL_LOAD, 1.0);
+                       rasterizer->SetMotionBlurState(2);
+               }
+               else if(motionblurvalue>=0.0 && motionblurvalue<=1.0)
+               {
+                       glAccum(GL_MULT, motionblurvalue);
+                       glAccum(GL_ACCUM, 1-motionblurvalue);
+                       glAccum(GL_RETURN, 1.0);
+                       glFlush();
+               }
+       }
+}
+
+void KX_BlenderRenderTools::Update2DFilter(vector<STR_String>& propNames, void* gameObj, RAS_2DFilterManager::RAS_2DFILTER_MODE filtermode, int pass, STR_String& text)
+{
+       m_filtermanager.EnableFilter(propNames, gameObj, filtermode, pass, text);
+}
+
+void KX_BlenderRenderTools::Render2DFilters(RAS_ICanvas* canvas)
+{
+       m_filtermanager.RenderFilters(canvas);
+}
+
 unsigned int KX_BlenderRenderTools::m_numgllights;