diff options
author | Dalai Felinto <dfelinto@gmail.com> | 2018-04-16 15:07:42 +0300 |
---|---|---|
committer | Dalai Felinto <dfelinto@gmail.com> | 2018-04-17 18:51:28 +0300 |
commit | 159806140fd33e6ddab951c0f6f180cfbf927d38 (patch) | |
tree | da076be3baa4d987fb5935e220a3d901c926e0e7 /source/gameengine/Rasterizer/RAS_OpenGLRasterizer | |
parent | 28b996a9d2090efdd74115a653629ef9d7d871f7 (diff) |
Removing Blender Game Engine from Blender 2.8
Folders removed entirely:
* //extern/recastnavigation
* //intern/decklink
* //intern/moto
* //source/blender/editors/space_logic
* //source/blenderplayer
* //source/gameengine
This includes DNA data and any reference to the BGE code in Blender itself.
We are bumping the subversion.
Pending tasks:
* Tile/clamp code in image editor draw code.
* Viewport drawing code (so much of this will go away because of BI removal
that we can wait until then to remove this.
Diffstat (limited to 'source/gameengine/Rasterizer/RAS_OpenGLRasterizer')
16 files changed, 0 insertions, 4084 deletions
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt deleted file mode 100644 index 89e31b62b41..00000000000 --- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt +++ /dev/null @@ -1,72 +0,0 @@ -# ***** 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. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# The Original Code is Copyright (C) 2006, Blender Foundation -# All rights reserved. -# -# The Original Code is: all of this file. -# -# Contributor(s): Jacques Beaurain. -# -# ***** END GPL LICENSE BLOCK ***** - -set(INC - .. - # XXX Remove these <<< - ../../BlenderRoutines - ../../Expressions - ../../GameLogic - ../../Ketsji - ../../Physics/common - # >>> - ../../SceneGraph - ../../../blender/blenfont - ../../../blender/blenkernel - ../../../blender/blenlib - ../../../blender/gpu - ../../../blender/makesdna - ../../../../intern/container - ../../../../intern/glew-mx - ../../../../intern/string -) - -set(INC_SYS - ../../../../intern/moto/include - ${GLEW_INCLUDE_PATH} -) - -set(SRC - RAS_ListRasterizer.cpp - RAS_OpenGLLight.cpp - RAS_OpenGLOffScreen.cpp - RAS_OpenGLSync.cpp - RAS_OpenGLRasterizer.cpp - RAS_StorageVA.cpp - RAS_StorageVBO.cpp - - RAS_IStorage.h - RAS_ListRasterizer.h - RAS_OpenGLLight.h - RAS_OpenGLOffScreen.h - RAS_OpenGLSync.h - RAS_OpenGLRasterizer.h - RAS_StorageVA.h - RAS_StorageVBO.h -) - -add_definitions(${GL_DEFINITIONS}) - -blender_add_lib(ge_oglrasterizer "${SRC}" "${INC}" "${INC_SYS}") diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_IStorage.h b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_IStorage.h deleted file mode 100644 index ae0cdcd84af..00000000000 --- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_IStorage.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * ***** 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. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - */ - -#ifndef __KX_STORAGE -#define __KX_STORAGE - -#ifdef WITH_CXX_GUARDEDALLOC - #include "MEM_guardedalloc.h" -#endif - -class RAS_MeshSlot; - -class RAS_IStorage -{ - -public: - virtual ~RAS_IStorage() {}; - - virtual bool Init()=0; - virtual void Exit()=0; - - virtual void IndexPrimitives(RAS_MeshSlot& ms)=0; - - virtual void SetDrawingMode(int drawingmode)=0; - - -#ifdef WITH_CXX_GUARDEDALLOC - MEM_CXX_CLASS_ALLOC_FUNCS("GE:RAS_IStorage") -#endif -}; - -#endif //__KX_STORAGE diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp deleted file mode 100644 index 71c8cfe745f..00000000000 --- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp +++ /dev/null @@ -1,278 +0,0 @@ -/* - * ***** 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. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * ***** END GPL LICENSE BLOCK ***** - */ - -/** \file gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp - * \ingroup bgerastogl - */ - -#include <iostream> - -#include "RAS_ListRasterizer.h" - -#ifdef WIN32 -#include <windows.h> -#endif // WIN32 - -#include "GPU_glew.h" - -#include "RAS_MaterialBucket.h" -#include "RAS_TexVert.h" -#include "MT_assert.h" - -//#if defined(DEBUG) -//#ifdef WIN32 -//#define spit(x) std::cout << x << std::endl; -//#endif //WIN32 -//#else -#define spit(x) -//#endif - -RAS_ListSlot::RAS_ListSlot(RAS_ListRasterizer* rasty) -: KX_ListSlot(), - m_list(0), - m_flag(LIST_MODIFY|LIST_CREATE), - m_matnr(0), - m_rasty(rasty) -{ -} - -int RAS_ListSlot::Release() -{ - if (--m_refcount > 0) - return m_refcount; - m_rasty->RemoveListSlot(this); - delete this; - return 0; -} - -RAS_ListSlot::~RAS_ListSlot() -{ - RemoveList(); -} - - -void RAS_ListSlot::RemoveList() -{ - if (m_list != 0) { - spit("Releasing display list (" << m_list << ")"); - glDeleteLists((GLuint)m_list, 1); - m_list =0; - } -} - -void RAS_ListSlot::DrawList() -{ - if (m_flag &LIST_MODIFY) { - if (m_flag &LIST_CREATE) { - if (m_list == 0) { - m_list = (unsigned int)glGenLists(1); - m_flag = m_flag &~ LIST_CREATE; - spit("Created display list (" << m_list << ")"); - } - } - if (m_list != 0) - glNewList((GLuint)m_list, GL_COMPILE); - - m_flag |= LIST_BEGIN; - return; - } - glCallList(m_list); -} - -void RAS_ListSlot::EndList() -{ - if (m_flag & LIST_BEGIN) { - glEndList(); - m_flag = m_flag &~(LIST_BEGIN|LIST_MODIFY); - m_flag |= LIST_END; - glCallList(m_list); - } -} - -void RAS_ListSlot::SetModified(bool mod) -{ - if (mod && !(m_flag & LIST_MODIFY)) { - spit("Modifying list (" << m_list << ")"); - m_flag = m_flag &~ LIST_END; - m_flag |= LIST_MODIFY; - } -} - -bool RAS_ListSlot::End() -{ - return (m_flag &LIST_END)!=0; -} - - - -RAS_ListRasterizer::RAS_ListRasterizer(RAS_ICanvas* canvas, bool lock, RAS_STORAGE_TYPE storage) -: RAS_OpenGLRasterizer(canvas, storage) -{ -} - -RAS_ListRasterizer::~RAS_ListRasterizer() -{ - ReleaseAlloc(); -} - -void RAS_ListRasterizer::RemoveListSlot(RAS_ListSlot* list) -{ - if (list->m_flag & LIST_DERIVEDMESH) { - RAS_DerivedMeshLists::iterator it = mDerivedMeshLists.begin(); - while (it != mDerivedMeshLists.end()) { - RAS_ListSlots *slots = it->second; - if (slots->size() > list->m_matnr && slots->at(list->m_matnr) == list) { - (*slots)[list->m_matnr] = NULL; - // check if all slots are NULL and if yes, delete the entry - int i; - for (i=slots->size(); i-- > 0; ) { - if (slots->at(i) != NULL) - break; - } - if (i < 0) { - slots->clear(); - delete slots; - mDerivedMeshLists.erase(it); - } - break; - } - ++it; - } - } else { - RAS_ArrayLists::iterator it = mArrayLists.begin(); - while (it != mArrayLists.end()) { - if (it->second == list) { - mArrayLists.erase(it); - break; - } - it++; - } - } -} - -RAS_ListSlot* RAS_ListRasterizer::FindOrAdd(RAS_MeshSlot& ms) -{ - /* - * Keep a copy of constant lists submitted for rendering, - * this guards against (replicated)new...delete every frame, - * and we can reuse lists! - * :: sorted by mesh slot - */ - RAS_ListSlot* localSlot = (RAS_ListSlot*)ms.m_DisplayList; - if (!localSlot) { - if (ms.m_pDerivedMesh) { - // that means that we draw based on derived mesh, a display list is possible - // Note that we come here only for static derived mesh - int matnr = ms.m_bucket->GetPolyMaterial()->GetMaterialIndex(); - RAS_ListSlot* nullSlot = NULL; - RAS_ListSlots *listVector; - RAS_DerivedMeshLists::iterator it = mDerivedMeshLists.find(ms.m_pDerivedMesh); - if (it == mDerivedMeshLists.end()) { - listVector = new RAS_ListSlots(matnr+4, nullSlot); - localSlot = new RAS_ListSlot(this); - localSlot->m_flag |= LIST_DERIVEDMESH; - localSlot->m_matnr = matnr; - listVector->at(matnr) = localSlot; - mDerivedMeshLists.insert(std::pair<DerivedMesh*, RAS_ListSlots*>(ms.m_pDerivedMesh, listVector)); - } else { - listVector = it->second; - if (listVector->size() <= matnr) - listVector->resize(matnr+4, nullSlot); - if ((localSlot = listVector->at(matnr)) == NULL) { - localSlot = new RAS_ListSlot(this); - localSlot->m_flag |= LIST_DERIVEDMESH; - localSlot->m_matnr = matnr; - listVector->at(matnr) = localSlot; - } else { - localSlot->AddRef(); - } - } - } else { - RAS_ArrayLists::iterator it = mArrayLists.find(ms.m_displayArrays); - if (it == mArrayLists.end()) { - localSlot = new RAS_ListSlot(this); - mArrayLists.insert(std::pair<RAS_DisplayArrayList, RAS_ListSlot*>(ms.m_displayArrays, localSlot)); - } else { - localSlot = static_cast<RAS_ListSlot*>(it->second->AddRef()); - } - } - } - MT_assert(localSlot); - return localSlot; -} - -void RAS_ListRasterizer::ReleaseAlloc() -{ - for (RAS_ArrayLists::iterator it = mArrayLists.begin();it != mArrayLists.end();++it) - delete it->second; - mArrayLists.clear(); - for (RAS_DerivedMeshLists::iterator it = mDerivedMeshLists.begin();it != mDerivedMeshLists.end();++it) { - RAS_ListSlots* slots = it->second; - for (int i=slots->size(); i-- > 0; ) { - RAS_ListSlot* slot = slots->at(i); - if (slot) - delete slot; - } - slots->clear(); - delete slots; - } - mDerivedMeshLists.clear(); -} - -void RAS_ListRasterizer::IndexPrimitives(RAS_MeshSlot& ms) -{ - RAS_ListSlot* localSlot =0; - - if (ms.m_bDisplayList) { - localSlot = FindOrAdd(ms); - localSlot->DrawList(); - - if (localSlot->End()) { - // save slot here too, needed for replicas and object using same mesh - // => they have the same vertexarray but different mesh slot - ms.m_DisplayList = localSlot; - return; - } - } - - RAS_OpenGLRasterizer::IndexPrimitives(ms); - - if (ms.m_bDisplayList) { - localSlot->EndList(); - ms.m_DisplayList = localSlot; - } -} - -bool RAS_ListRasterizer::Init(void) -{ - return RAS_OpenGLRasterizer::Init(); -} - -void RAS_ListRasterizer::SetDrawingMode(int drawingmode) -{ - RAS_OpenGLRasterizer::SetDrawingMode(drawingmode); -} - -void RAS_ListRasterizer::Exit() -{ - RAS_OpenGLRasterizer::Exit(); -} - -// eof diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h deleted file mode 100644 index e3e6931311b..00000000000 --- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h +++ /dev/null @@ -1,77 +0,0 @@ - -/** \file RAS_ListRasterizer.h - * \ingroup bgerastogl - */ - -#ifndef __RAS_LISTRASTERIZER_H__ -#define __RAS_LISTRASTERIZER_H__ - -#include "RAS_MaterialBucket.h" -#include "RAS_OpenGLRasterizer.h" -#include <vector> -#include <map> - -class RAS_ListRasterizer; -class RAS_ListSlot : public KX_ListSlot -{ - friend class RAS_ListRasterizer; - unsigned int m_list; - unsigned int m_flag; - unsigned int m_matnr; - RAS_ListRasterizer* m_rasty; -public: - RAS_ListSlot(RAS_ListRasterizer* rasty); - virtual ~RAS_ListSlot(); - virtual void SetModified(bool mod); - virtual int Release(); - - void RemoveList(); - void DrawList(); - void EndList(); - bool End(); - -}; - -enum RAS_ListSlotFlags { - LIST_CREATE =1, - LIST_MODIFY =2, - LIST_BEGIN =4, - LIST_END =8, - LIST_DERIVEDMESH=16, -}; - -struct DerivedMesh; - -typedef std::map<RAS_DisplayArrayList, RAS_ListSlot*> RAS_ArrayLists; -typedef std::vector<RAS_ListSlot*> RAS_ListSlots; // indexed by material slot number -typedef std::map<DerivedMesh*, RAS_ListSlots*> RAS_DerivedMeshLists; - -class RAS_ListRasterizer : public RAS_OpenGLRasterizer -{ - RAS_ArrayLists mArrayLists; - RAS_DerivedMeshLists mDerivedMeshLists; - - RAS_ListSlot* FindOrAdd(class RAS_MeshSlot& ms); - void ReleaseAlloc(); - -public: - void RemoveListSlot(RAS_ListSlot* list); - RAS_ListRasterizer(RAS_ICanvas* canvas, bool lock, RAS_STORAGE_TYPE storage); - virtual ~RAS_ListRasterizer(); - - virtual void IndexPrimitives(class RAS_MeshSlot& ms); - - virtual bool Init(); - virtual void Exit(); - - virtual void SetDrawingMode(int drawingmode); - - virtual bool QueryLists() {return true;} - - -#ifdef WITH_CXX_GUARDEDALLOC - MEM_CXX_CLASS_ALLOC_FUNCS("GE:RAS_ListRasterizer") -#endif -}; - -#endif diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLLight.cpp b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLLight.cpp deleted file mode 100644 index 18254357f85..00000000000 --- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLLight.cpp +++ /dev/null @@ -1,300 +0,0 @@ -/* - * ***** 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. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): Mitchell Stokes - * - * ***** END GPL LICENSE BLOCK ***** - */ - -#include "GPU_glew.h" - -#include <stdio.h> - - -#include "RAS_OpenGLLight.h" -#include "RAS_OpenGLRasterizer.h" -#include "RAS_ICanvas.h" - -#include "MT_CmMatrix4x4.h" - -#include "KX_Camera.h" -#include "KX_Light.h" -#include "KX_Scene.h" - -#include "DNA_lamp_types.h" -#include "DNA_scene_types.h" - -#include "GPU_lamp.h" -#include "GPU_material.h" - -RAS_OpenGLLight::RAS_OpenGLLight(RAS_OpenGLRasterizer *ras) - :m_rasterizer(ras) -{ -} - -RAS_OpenGLLight::~RAS_OpenGLLight() -{ - GPULamp *lamp; - KX_LightObject* kxlight = (KX_LightObject*)m_light; - Lamp *la = (Lamp*)kxlight->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, la->coeff_const, la->coeff_lin, la->coeff_quad); - GPU_lamp_update_spot(lamp, la->spotsize, la->spotblend); - } -} - -bool RAS_OpenGLLight::ApplyFixedFunctionLighting(KX_Scene *kxscene, int oblayer, int slot) -{ - KX_Scene* lightscene = (KX_Scene*)m_scene; - KX_LightObject* kxlight = (KX_LightObject*)m_light; - 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_layer & oblayer)) - return false; - /* only use lights in the same scene, and in a visible layer */ - if (kxscene != lightscene || !(m_layer & scenelayer)) - return false; - - // lights don't get their openGL matrix updated, do it now - if (kxlight->GetSGNode()->IsDirty()) - kxlight->GetOpenGLMatrix(); - - MT_CmMatrix4x4& worldmatrix= *kxlight->GetOpenGLMatrixPtr(); - - vec[0] = worldmatrix(0,3); - vec[1] = worldmatrix(1,3); - vec[2] = worldmatrix(2,3); - vec[3] = 1.0f; - - if (m_type==RAS_ILightObject::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.0f; - glLightfv((GLenum)(GL_LIGHT0+slot), GL_POSITION, vec); - } - else { - //vec[3] = 1.0f; - glLightfv((GLenum)(GL_LIGHT0+slot), GL_POSITION, vec); - glLightf((GLenum)(GL_LIGHT0+slot), GL_CONSTANT_ATTENUATION, 1.0f); - glLightf((GLenum)(GL_LIGHT0+slot), GL_LINEAR_ATTENUATION, m_att1/m_distance); - // without this next line it looks backward compatible. - //attennuation still is acceptable - glLightf((GLenum)(GL_LIGHT0+slot), GL_QUADRATIC_ATTENUATION, m_att2/(m_distance*m_distance)); - - if (m_type==RAS_ILightObject::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, m_spotsize / 2.0f); - glLightf((GLenum)(GL_LIGHT0+slot), GL_SPOT_EXPONENT, 128.0f * m_spotblend); - } - else { - glLightf((GLenum)(GL_LIGHT0+slot), GL_SPOT_CUTOFF, 180.0f); - } - } - - if (m_nodiffuse) { - vec[0] = vec[1] = vec[2] = vec[3] = 0.0f; - } - else { - vec[0] = m_energy*m_color[0]; - vec[1] = m_energy*m_color[1]; - vec[2] = m_energy*m_color[2]; - vec[3] = 1.0f; - } - - glLightfv((GLenum)(GL_LIGHT0+slot), GL_DIFFUSE, vec); - if (m_nospecular) - { - vec[0] = vec[1] = vec[2] = vec[3] = 0.0f; - } - else if (m_nodiffuse) { - vec[0] = m_energy*m_color[0]; - vec[1] = m_energy*m_color[1]; - vec[2] = m_energy*m_color[2]; - vec[3] = 1.0f; - } - - glLightfv((GLenum)(GL_LIGHT0+slot), GL_SPECULAR, vec); - glEnable((GLenum)(GL_LIGHT0+slot)); - - return true; -} - -GPULamp *RAS_OpenGLLight::GetGPULamp() -{ - KX_LightObject* kxlight = (KX_LightObject*)m_light; - - if (m_glsl) - return GPU_lamp_from_blender(kxlight->GetScene()->GetBlenderScene(), kxlight->GetBlenderObject(), kxlight->GetBlenderGroupObject()); - else - return NULL; -} - - -bool RAS_OpenGLLight::HasShadowBuffer() -{ - GPULamp *lamp; - - if ((lamp = GetGPULamp())) - return GPU_lamp_has_shadow_buffer(lamp); - else - return false; -} - -int RAS_OpenGLLight::GetShadowBindCode() -{ - GPULamp *lamp; - - if ((lamp = GetGPULamp())) - return GPU_lamp_shadow_bind_code(lamp); - return -1; -} - -MT_Matrix4x4 RAS_OpenGLLight::GetShadowMatrix() -{ - GPULamp *lamp; - - if ((lamp = GetGPULamp())) - return MT_Matrix4x4(GPU_lamp_dynpersmat(lamp)); - MT_Matrix4x4 mat; - mat.setIdentity(); - return mat; -} - -int RAS_OpenGLLight::GetShadowLayer() -{ - GPULamp *lamp; - - if ((lamp = GetGPULamp())) - return GPU_lamp_shadow_layer(lamp); - else - return 0; -} - -void RAS_OpenGLLight::BindShadowBuffer(RAS_ICanvas *canvas, KX_Camera *cam, MT_Transform& camtrans) -{ - GPULamp *lamp; - float viewmat[4][4], winmat[4][4]; - int winsize; - - /* bind framebuffer */ - lamp = GetGPULamp(); - GPU_lamp_shadow_buffer_bind(lamp, viewmat, &winsize, winmat); - - if (GPU_lamp_shadow_buffer_type(lamp) == LA_SHADMAP_VARIANCE) - m_rasterizer->SetUsingOverrideShader(true); - - /* GPU_lamp_shadow_buffer_bind() changes the viewport, so update the canvas */ - canvas->UpdateViewPort(0, 0, winsize, winsize); - - /* setup camera transformation */ - MT_Matrix4x4 modelviewmat((float*)viewmat); - MT_Matrix4x4 projectionmat((float*)winmat); - - MT_Transform trans = MT_Transform((float*)viewmat); - camtrans.invert(trans); - - cam->SetModelviewMatrix(modelviewmat); - cam->SetProjectionMatrix(projectionmat); - - cam->NodeSetLocalPosition(camtrans.getOrigin()); - cam->NodeSetLocalOrientation(camtrans.getBasis()); - cam->NodeUpdateGS(0); - - /* setup rasterizer transformations */ - /* SetViewMatrix may use stereomode which we temporarily disable here */ - RAS_IRasterizer::StereoMode stereomode = m_rasterizer->GetStereoMode(); - m_rasterizer->SetStereoMode(RAS_IRasterizer::RAS_STEREO_NOSTEREO); - m_rasterizer->SetProjectionMatrix(projectionmat); - m_rasterizer->SetViewMatrix(modelviewmat, cam->NodeGetWorldOrientation(), cam->NodeGetWorldPosition(), cam->NodeGetLocalScaling(), cam->GetCameraData()->m_perspective); - m_rasterizer->SetStereoMode(stereomode); -} - -void RAS_OpenGLLight::UnbindShadowBuffer() -{ - GPULamp *lamp = GetGPULamp(); - GPU_lamp_shadow_buffer_unbind(lamp); - - if (GPU_lamp_shadow_buffer_type(lamp) == LA_SHADMAP_VARIANCE) - m_rasterizer->SetUsingOverrideShader(false); -} - -Image *RAS_OpenGLLight::GetTextureImage(short texslot) -{ - KX_LightObject* kxlight = (KX_LightObject*)m_light; - Lamp *la = (Lamp*)kxlight->GetBlenderObject()->data; - - if (texslot >= MAX_MTEX || texslot < 0) - { - printf("KX_LightObject::GetTextureImage(): texslot exceeds slot bounds (0-%d)\n", MAX_MTEX-1); - return NULL; - } - - if (la->mtex[texslot]) - return la->mtex[texslot]->tex->ima; - - return NULL; -} - -void RAS_OpenGLLight::Update() -{ - GPULamp *lamp; - KX_LightObject* kxlight = (KX_LightObject*)m_light; - - if ((lamp = GetGPULamp()) != NULL && kxlight->GetSGNode()) { - float obmat[4][4]; - // lights don't get their openGL matrix updated, do it now - if (kxlight->GetSGNode()->IsDirty()) - kxlight->GetOpenGLMatrix(); - float *dobmat = kxlight->GetOpenGLMatrixPtr()->getPointer(); - - for (int i=0; i<4; i++) - for (int j=0; j<4; j++, dobmat++) - obmat[i][j] = (float)*dobmat; - int hide = kxlight->GetVisible() ? 0 : 1; - GPU_lamp_update(lamp, m_layer, hide, obmat); - GPU_lamp_update_colors(lamp, m_color[0], m_color[1], - m_color[2], m_energy); - GPU_lamp_update_distance(lamp, m_distance, m_att1, m_att2, m_coeff_const, m_coeff_lin, m_coeff_quad); - GPU_lamp_update_spot(lamp, m_spotsize, m_spotblend); - } -} - - diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLLight.h b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLLight.h deleted file mode 100644 index a520b18c434..00000000000 --- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLLight.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * ***** 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. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): Mitchell Stokes - * - * ***** END GPL LICENSE BLOCK ***** - */ - -#include "RAS_ILightObject.h" - -class RAS_OpenGLRasterizer; -struct GPULamp; -struct Image; - -class RAS_OpenGLLight : public RAS_ILightObject -{ - - RAS_OpenGLRasterizer *m_rasterizer; - - GPULamp *GetGPULamp(); -public: - RAS_OpenGLLight(RAS_OpenGLRasterizer *ras); - ~RAS_OpenGLLight(); - - bool ApplyFixedFunctionLighting(KX_Scene *kxscene, int oblayer, int slot); - - RAS_OpenGLLight* Clone() { return new RAS_OpenGLLight(*this); } - - bool HasShadowBuffer(); - int GetShadowBindCode(); - MT_Matrix4x4 GetShadowMatrix(); - int GetShadowLayer(); - void BindShadowBuffer(RAS_ICanvas *canvas, KX_Camera *cam, MT_Transform& camtrans); - void UnbindShadowBuffer(); - Image *GetTextureImage(short texslot); - void Update(); -}; diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLOffScreen.cpp b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLOffScreen.cpp deleted file mode 100644 index 58b3c61bd05..00000000000 --- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLOffScreen.cpp +++ /dev/null @@ -1,347 +0,0 @@ -/* - * ***** 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. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2015, Blender Foundation - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): Blender Foundation. - * - * ***** END GPL LICENSE BLOCK ***** - */ - -#include "GPU_glew.h" - -#include <stdio.h> - -#include "RAS_OpenGLOffScreen.h" -#include "RAS_ICanvas.h" - -RAS_OpenGLOffScreen::RAS_OpenGLOffScreen(RAS_ICanvas *canvas) - :m_canvas(canvas), m_depthrb(0), m_colorrb(0), m_depthtx(0), m_colortx(0), - m_fbo(0), m_blitfbo(0), m_blitrbo(0), m_blittex(0), m_target(RAS_OFS_RENDER_BUFFER), m_bound(false) -{ - m_width = 0; - m_height = 0; - m_samples = 0; - m_color = 0; -} - -RAS_OpenGLOffScreen::~RAS_OpenGLOffScreen() -{ - Destroy(); -} - -bool RAS_OpenGLOffScreen::Create(int width, int height, int samples, RAS_OFS_RENDER_TARGET target) -{ - GLenum status; - GLuint glo[2], fbo; - GLint max_samples; - GLenum textarget; - - if (m_fbo) { - printf("RAS_OpenGLOffScreen::Create(): buffer exists already, destroy first\n"); - return false; - } - if (target != RAS_IOffScreen::RAS_OFS_RENDER_BUFFER && - target != RAS_IOffScreen::RAS_OFS_RENDER_TEXTURE) - { - printf("RAS_OpenGLOffScreen::Create(): invalid offscren target\n"); - return false; - } - if (!GLEW_EXT_framebuffer_object) { - printf("RAS_OpenGLOffScreen::Create(): frame buffer not supported\n"); - return false; - } - if (samples) { - if (!GLEW_EXT_framebuffer_multisample || - !GLEW_EXT_framebuffer_blit) - { - samples = 0; - } - } - if (samples && target == RAS_OFS_RENDER_TEXTURE) { - // we need this in addition if we use multisample textures - if (!GLEW_ARB_texture_multisample || - !GLEW_EXT_framebuffer_multisample_blit_scaled) - { - samples = 0; - } - } - if (samples) { - max_samples = 0; - glGetIntegerv(GL_MAX_SAMPLES_EXT , &max_samples); - if (samples > max_samples) - samples = max_samples; - } - m_target = target; - fbo = 0; - glGenFramebuffersEXT(1, &fbo); - if (fbo == 0) { - printf("RAS_OpenGLOffScreen::Create(): frame buffer creation failed: %d\n", (int)glGetError()); - return false; - } - m_fbo = fbo; - glo[0] = glo[1] = 0; - if (target == RAS_OFS_RENDER_TEXTURE) { - glGenTextures(2, glo); - if (glo[0] == 0 || glo[1] == 0) { - printf("RAS_OpenGLOffScreen::Create(): texture creation failed: %d\n", (int)glGetError()); - goto L_ERROR; - } - m_depthtx = glo[0]; - m_color = m_colortx = glo[1]; - if (samples) { - textarget = GL_TEXTURE_2D_MULTISAMPLE; - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, m_depthtx); - glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, samples, GL_DEPTH_COMPONENT, width, height, true); - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, m_colortx); - glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, samples, GL_RGBA8, width, height, true); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0); - } - else { - textarget = GL_TEXTURE_2D; - glBindTexture(GL_TEXTURE_2D, m_depthtx); - glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, width, height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL); - glBindTexture(GL_TEXTURE_2D, m_colortx); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); - glBindTexture(GL_TEXTURE_2D, 0); - } - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo); - glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, textarget, m_depthtx, 0); - glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, textarget, m_colortx, 0); - } - else { - glGenRenderbuffersEXT(2, glo); - if (glo[0] == 0 || glo[1] == 0) { - printf("RAS_OpenGLOffScreen::Create(): render buffer creation failed: %d\n", (int)glGetError()); - goto L_ERROR; - } - m_depthrb = glo[0]; - m_colorrb = glo[1]; - glBindRenderbufferEXT(GL_RENDERBUFFER, m_depthrb); - glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, samples, GL_DEPTH_COMPONENT, width, height); - glBindRenderbufferEXT(GL_RENDERBUFFER, m_colorrb); - glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, samples, GL_RGBA8, width, height); - glBindRenderbufferEXT(GL_RENDERBUFFER, 0); - - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo); - glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER, m_depthrb); - glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER, m_colorrb); - } - status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); - - if (status != GL_FRAMEBUFFER_COMPLETE_EXT) { - printf("RAS_OpenGLOffScreen::Create(): frame buffer incomplete: %d\n", (int)status); - goto L_ERROR; - } - m_width = width; - m_height = height; - - if (samples > 0) { - GLuint blit_tex; - GLuint blit_fbo; - // create a secondary FBO to blit to before the pixel can be read - - /* write into new single-sample buffer */ - glGenFramebuffersEXT(1, &blit_fbo); - if (!blit_fbo) { - printf("RAS_OpenGLOffScreen::Create(): failed creating a FBO for multi-sample offscreen buffer\n"); - goto L_ERROR; - } - m_blitfbo = blit_fbo; - blit_tex = 0; - if (target == RAS_OFS_RENDER_TEXTURE) { - glGenTextures(1, &blit_tex); - if (!blit_tex) { - printf("RAS_OpenGLOffScreen::Create(): failed creating a texture for multi-sample offscreen buffer\n"); - goto L_ERROR; - } - // m_color is the texture where the final render goes, the blit texture in this case - m_color = m_blittex = blit_tex; - glBindTexture(GL_TEXTURE_2D, m_blittex); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glBindTexture(GL_TEXTURE_2D, 0); - glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, m_blitfbo); - glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_blittex, 0); - } - else { - /* create render buffer for new 'fbo_blit' */ - glGenRenderbuffersEXT(1, &blit_tex); - if (!blit_tex) { - printf("RAS_OpenGLOffScreen::Create(): failed creating a render buffer for multi-sample offscreen buffer\n"); - goto L_ERROR; - } - m_blitrbo = blit_tex; - glBindRenderbufferEXT(GL_RENDERBUFFER, m_blitrbo); - glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, 0, GL_RGBA8, width, height); - glBindRenderbufferEXT(GL_RENDERBUFFER, 0); - glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, m_blitfbo); - glFramebufferRenderbufferEXT(GL_DRAW_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER, m_blitrbo); - } - status = glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER_EXT); - glBindFramebuffer(GL_DRAW_FRAMEBUFFER_EXT, 0); - if (status != GL_FRAMEBUFFER_COMPLETE) { - printf("RAS_OpenGLOffScreen::Create(): frame buffer for multi-sample offscreen buffer incomplete: %d\n", (int)status); - goto L_ERROR; - } - // remember that multisample is enabled - m_samples = 1; - } - return true; - -L_ERROR: - Destroy(); - return false; -} - -void RAS_OpenGLOffScreen::Destroy() -{ - GLuint globj; - Unbind(); - if (m_fbo) { - globj = m_fbo; - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo); - if (m_target == RAS_OFS_RENDER_TEXTURE) { - GLenum textarget = (m_samples) ? GL_TEXTURE_2D_MULTISAMPLE : GL_TEXTURE_2D; - glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, textarget, 0, 0); - glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, textarget, 0, 0); - } - else { - glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0); - glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, 0); - } - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); - glDeleteFramebuffersEXT(1, &globj); - m_fbo = 0; - } - if (m_depthrb) { - globj = m_depthrb; - glDeleteRenderbuffers(1, &globj); - m_depthrb = 0; - } - if (m_colorrb) { - globj = m_colorrb; - glDeleteRenderbuffers(1, &globj); - m_colorrb = 0; - } - if (m_depthtx) { - globj = m_depthtx; - glDeleteTextures(1, &globj); - m_depthtx = 0; - } - if (m_colortx) { - globj = m_colortx; - glDeleteTextures(1, &globj); - m_colortx = 0; - } - if (m_blitfbo) { - globj = m_blitfbo; - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_blitfbo); - if (m_target == RAS_OFS_RENDER_TEXTURE) { - glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, 0, 0); - } - else { - glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, 0); - } - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); - glDeleteFramebuffersEXT(1, &globj); - m_blitfbo = 0; - } - if (m_blitrbo) { - globj = m_blitrbo; - glDeleteRenderbuffers(1, &globj); - m_blitrbo = 0; - } - if (m_blittex) { - globj = m_blittex; - glDeleteTextures(1, &globj); - m_blittex = 0; - } - m_width = 0; - m_height = 0; - m_samples = 0; - m_color = 0; - m_target = RAS_OFS_RENDER_BUFFER; -} - -void RAS_OpenGLOffScreen::Bind(RAS_OFS_BIND_MODE mode) -{ - if (m_fbo) { - if (mode == RAS_OFS_BIND_RENDER) { - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo); - glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); - glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); - glViewport(0, 0, m_width, m_height); - glDisable(GL_SCISSOR_TEST); - } - else if (!m_blitfbo) { - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo); - glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); - } - else { - glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, m_blitfbo); - glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); - } - m_bound = true; - } -} - -void RAS_OpenGLOffScreen::Unbind() -{ - if (!m_bound) - return; - - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); - glEnable(GL_SCISSOR_TEST); - glReadBuffer(GL_BACK); - glDrawBuffer(GL_BACK); - m_bound = false; -} - -void RAS_OpenGLOffScreen::MipMap() -{ - if (m_color) { - glBindTexture(GL_TEXTURE_2D, m_color); - glGenerateMipmap(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, 0); - } -} - -void RAS_OpenGLOffScreen::Blit() -{ - if (m_bound && m_blitfbo) { - // set the draw target to the secondary FBO, the read target is still the multisample FBO - glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER, m_blitfbo); - - // sample the primary - glBlitFramebufferEXT(0, 0, m_width, m_height, 0, 0, m_width, m_height, GL_COLOR_BUFFER_BIT, GL_NEAREST); - - // make sure the next glReadPixels will read from the secondary buffer - glBindFramebufferEXT(GL_READ_FRAMEBUFFER, m_blitfbo); - } -} diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLOffScreen.h b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLOffScreen.h deleted file mode 100644 index 3f6845f1e21..00000000000 --- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLOffScreen.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * ***** 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. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2015, Blender Foundation - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): Blender Foundation. - * - * ***** END GPL LICENSE BLOCK ***** - */ - -#ifndef __RAS_OPENGLOFFSCREEN__ -#define __RAS_OPENGLOFFSCREEN__ - -#include "RAS_IOffScreen.h" -#include "GPU_extensions.h" - -class RAS_ICanvas; - -class RAS_OpenGLOffScreen : public RAS_IOffScreen -{ - RAS_ICanvas *m_canvas; - // these are GL objects - unsigned int m_depthrb; - unsigned int m_colorrb; - unsigned int m_depthtx; - unsigned int m_colortx; - unsigned int m_fbo; - unsigned int m_blitfbo; - unsigned int m_blitrbo; - unsigned int m_blittex; - RAS_OFS_RENDER_TARGET m_target; - bool m_bound; - - -public: - RAS_OpenGLOffScreen(RAS_ICanvas *canvas); - ~RAS_OpenGLOffScreen(); - - bool Create(int width, int height, int samples, RAS_OFS_RENDER_TARGET target); - void Destroy(); - void Bind(RAS_OFS_BIND_MODE mode); - void Blit(); - void Unbind(); - void MipMap(); -}; - -#endif /* __RAS_OPENGLOFFSCREEN__ */ - diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp deleted file mode 100644 index d1c3162f752..00000000000 --- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp +++ /dev/null @@ -1,1694 +0,0 @@ -/* - * ***** 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. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - */ - -/** \file gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp - * \ingroup bgerastogl - */ - - -#include <math.h> -#include <stdlib.h> - -#include "RAS_OpenGLRasterizer.h" - -#include "GPU_glew.h" - -#include "RAS_ICanvas.h" -#include "RAS_Rect.h" -#include "RAS_TexVert.h" -#include "RAS_MeshObject.h" -#include "RAS_Polygon.h" -#include "RAS_ILightObject.h" -#include "MT_CmMatrix4x4.h" - -#include "RAS_OpenGLLight.h" -#include "RAS_OpenGLOffScreen.h" -#include "RAS_OpenGLSync.h" - -#include "RAS_StorageVA.h" -#include "RAS_StorageVBO.h" - -#include "GPU_draw.h" -#include "GPU_extensions.h" -#include "GPU_material.h" -#include "GPU_shader.h" - -extern "C"{ - #include "BLF_api.h" - #include "BKE_DerivedMesh.h" - #include "DNA_material_types.h" -} - - -// XXX Clean these up <<< -#include "EXP_Value.h" -#include "KX_Scene.h" -#include "KX_RayCast.h" -#include "KX_GameObject.h" -// >>> - -#ifndef M_PI -#define M_PI 3.14159265358979323846 -#endif - -/** - * 32x32 bit masks for vinterlace stereo mode - */ -static GLuint left_eye_vinterlace_mask[32]; -static GLuint right_eye_vinterlace_mask[32]; - -/** - * 32x32 bit masks for hinterlace stereo mode. - * Left eye = &hinterlace_mask[0] - * Right eye = &hinterlace_mask[1] - */ -static GLuint hinterlace_mask[33]; - -RAS_OpenGLRasterizer::RAS_OpenGLRasterizer(RAS_ICanvas* canvas, RAS_STORAGE_TYPE storage) - :RAS_IRasterizer(canvas), - m_2DCanvas(canvas), - m_fogenabled(false), - m_time(0.0f), - m_campos(0.0f, 0.0f, 0.0f), - m_camortho(false), - m_camnegscale(false), - m_stereomode(RAS_STEREO_NOSTEREO), - m_curreye(RAS_STEREO_LEFTEYE), - m_eyeseparation(0.0f), - m_focallength(0.0f), - m_setfocallength(false), - m_noOfScanlines(32), - m_motionblur(0), - m_motionblurvalue(-1.0f), - m_usingoverrideshader(false), - m_clientobject(NULL), - m_auxilaryClientInfo(NULL), - m_drawingmode(KX_TEXTURED), - m_texco_num(0), - m_attrib_num(0), - //m_last_alphablend(GPU_BLEND_SOLID), - m_last_frontface(true), - m_materialCachingInfo(0), - m_storage_type(storage) -{ - m_viewmatrix.setIdentity(); - m_viewinvmatrix.setIdentity(); - - for (int i = 0; i < 32; i++) - { - left_eye_vinterlace_mask[i] = 0x55555555; - right_eye_vinterlace_mask[i] = 0xAAAAAAAA; - hinterlace_mask[i] = (i&1)*0xFFFFFFFF; - } - hinterlace_mask[32] = 0; - - m_prevafvalue = GPU_get_anisotropic(); - - if (m_storage_type == RAS_VBO /*|| m_storage_type == RAS_AUTO_STORAGE && GLEW_ARB_vertex_buffer_object*/) { - m_storage = new RAS_StorageVBO(&m_texco_num, m_texco, &m_attrib_num, m_attrib, m_attrib_layer); - } - else if ((m_storage_type == RAS_VA) || (m_storage_type == RAS_AUTO_STORAGE)) { - m_storage = new RAS_StorageVA(&m_texco_num, m_texco, &m_attrib_num, m_attrib, m_attrib_layer); - } - else { - printf("Unknown rasterizer storage type, falling back to vertex arrays\n"); - m_storage = new RAS_StorageVA(&m_texco_num, m_texco, &m_attrib_num, m_attrib, m_attrib_layer); - } - - glGetIntegerv(GL_MAX_LIGHTS, (GLint *) &m_numgllights); - if (m_numgllights < 8) - m_numgllights = 8; -} - - - -RAS_OpenGLRasterizer::~RAS_OpenGLRasterizer() -{ - // Restore the previous AF value - GPU_set_anisotropic(m_prevafvalue); - - if (m_storage) - delete m_storage; -} - -bool RAS_OpenGLRasterizer::Init() -{ - bool storage_init; - GPU_state_init(); - - - m_ambr = 0.0f; - m_ambg = 0.0f; - m_ambb = 0.0f; - - glDisable(GL_BLEND); - glDisable(GL_ALPHA_TEST); - //m_last_alphablend = GPU_BLEND_SOLID; - GPU_set_material_alpha_blend(GPU_BLEND_SOLID); - - glFrontFace(GL_CCW); - m_last_frontface = true; - - m_redback = 0.4375f; - m_greenback = 0.4375f; - m_blueback = 0.4375f; - m_alphaback = 0.0f; - - glClearColor(m_redback,m_greenback,m_blueback,m_alphaback); - glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - - glShadeModel(GL_SMOOTH); - - storage_init = m_storage->Init(); - - return true && storage_init; -} - - -void RAS_OpenGLRasterizer::SetAmbientColor(float color[3]) -{ - m_ambr = color[0]; - m_ambg = color[1]; - m_ambb = color[2]; -} - -void RAS_OpenGLRasterizer::SetAmbient(float factor) -{ - float ambient[] = {m_ambr * factor, m_ambg * factor, m_ambb * factor, 1.0f}; - glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient); -} - -void RAS_OpenGLRasterizer::SetBackColor(float color[3]) -{ - m_redback = color[0]; - m_greenback = color[1]; - m_blueback = color[2]; - m_alphaback = 0.0f; -} - -void RAS_OpenGLRasterizer::SetFog(short type, float start, float dist, float intensity, float color[3]) -{ - float params[4] = {color[0], color[1], color[2], 1.0f}; - glFogi(GL_FOG_MODE, GL_LINEAR); - glFogf(GL_FOG_DENSITY, intensity / 10.0f); - glFogf(GL_FOG_START, start); - glFogf(GL_FOG_END, start + dist); - glFogfv(GL_FOG_COLOR, params); -} - -void RAS_OpenGLRasterizer::EnableFog(bool enable) -{ - m_fogenabled = enable; -} - -void RAS_OpenGLRasterizer::DisplayFog() -{ - if ((m_drawingmode >= KX_SOLID) && m_fogenabled) { - glEnable(GL_FOG); - } - else { - glDisable(GL_FOG); - } -} - -bool RAS_OpenGLRasterizer::SetMaterial(const RAS_IPolyMaterial& mat) -{ - return mat.Activate(this, m_materialCachingInfo); -} - - - -void RAS_OpenGLRasterizer::Exit() -{ - m_storage->Exit(); - - glEnable(GL_CULL_FACE); - glEnable(GL_DEPTH_TEST); - glClearDepth(1.0f); - glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - glClearColor(m_redback, m_greenback, m_blueback, m_alphaback); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glDepthMask (GL_TRUE); - glDepthFunc(GL_LEQUAL); - glBlendFunc(GL_ONE, GL_ZERO); - - glDisable(GL_POLYGON_STIPPLE); - - glDisable(GL_LIGHTING); - if (GLEW_EXT_separate_specular_color || GLEW_VERSION_1_2) - glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SINGLE_COLOR); - - EndFrame(); -} - -bool RAS_OpenGLRasterizer::BeginFrame(double time) -{ - m_time = time; - - // Blender camera routine destroys the settings - if (m_drawingmode < KX_SOLID) - { - glDisable(GL_CULL_FACE); - glDisable(GL_DEPTH_TEST); - } - else - { - glEnable(GL_DEPTH_TEST); - glEnable(GL_CULL_FACE); - } - - glDisable(GL_BLEND); - glDisable(GL_ALPHA_TEST); - //m_last_alphablend = GPU_BLEND_SOLID; - GPU_set_material_alpha_blend(GPU_BLEND_SOLID); - - glFrontFace(GL_CCW); - m_last_frontface = true; - - glShadeModel(GL_SMOOTH); - - glEnable(GL_MULTISAMPLE_ARB); - - m_2DCanvas->BeginFrame(); - - // Render Tools - m_clientobject = NULL; - m_lastlightlayer = -1; - m_lastauxinfo = NULL; - m_lastlighting = true; /* force disable in DisableOpenGLLights() */ - DisableOpenGLLights(); - - return true; -} - - - -void RAS_OpenGLRasterizer::SetDrawingMode(int drawingmode) -{ - m_drawingmode = drawingmode; - - if (m_drawingmode == KX_WIREFRAME) - glDisable(GL_CULL_FACE); - - m_storage->SetDrawingMode(drawingmode); -} - -int RAS_OpenGLRasterizer::GetDrawingMode() -{ - return m_drawingmode; -} - - -void RAS_OpenGLRasterizer::SetDepthMask(DepthMask depthmask) -{ - glDepthMask(depthmask == KX_DEPTHMASK_DISABLED ? GL_FALSE : GL_TRUE); -} - - -void RAS_OpenGLRasterizer::ClearColorBuffer() -{ - m_2DCanvas->ClearColor(m_redback,m_greenback,m_blueback,m_alphaback); - m_2DCanvas->ClearBuffer(RAS_ICanvas::COLOR_BUFFER); -} - - -void RAS_OpenGLRasterizer::ClearDepthBuffer() -{ - m_2DCanvas->ClearBuffer(RAS_ICanvas::DEPTH_BUFFER); -} - - -void RAS_OpenGLRasterizer::ClearCachingInfo(void) -{ - m_materialCachingInfo = 0; -} - -void RAS_OpenGLRasterizer::FlushDebugShapes(SCA_IScene *scene) -{ - std::vector<OglDebugShape> &debugShapes = m_debugShapes[scene]; - if (debugShapes.empty()) - return; - - // DrawDebugLines - GLboolean light, tex; - - light= glIsEnabled(GL_LIGHTING); - tex= glIsEnabled(GL_TEXTURE_2D); - - if (light) glDisable(GL_LIGHTING); - if (tex) glDisable(GL_TEXTURE_2D); - - // draw lines - glBegin(GL_LINES); - for (unsigned int i = 0; i < debugShapes.size(); i++) { - if (debugShapes[i].m_type != OglDebugShape::LINE) - continue; - glColor4f(debugShapes[i].m_color[0], debugShapes[i].m_color[1], debugShapes[i].m_color[2], 1.0f); - const MT_Scalar *fromPtr = &debugShapes[i].m_pos.x(); - const MT_Scalar *toPtr= &debugShapes[i].m_param.x(); - glVertex3fv(fromPtr); - glVertex3fv(toPtr); - } - glEnd(); - - // draw circles - for (unsigned int i = 0; i < debugShapes.size(); i++) { - if (debugShapes[i].m_type != OglDebugShape::CIRCLE) - continue; - glBegin(GL_LINE_LOOP); - glColor4f(debugShapes[i].m_color[0], debugShapes[i].m_color[1], debugShapes[i].m_color[2], 1.0f); - - static const MT_Vector3 worldUp(0.0f, 0.0f, 1.0f); - MT_Vector3 norm = debugShapes[i].m_param; - MT_Matrix3x3 tr; - if (norm.fuzzyZero() || norm == worldUp) - { - tr.setIdentity(); - } - else - { - MT_Vector3 xaxis, yaxis; - xaxis = MT_cross(norm, worldUp); - yaxis = MT_cross(xaxis, norm); - tr.setValue(xaxis.x(), xaxis.y(), xaxis.z(), - yaxis.x(), yaxis.y(), yaxis.z(), - norm.x(), norm.y(), norm.z()); - } - MT_Scalar rad = debugShapes[i].m_param2.x(); - int n = (int)debugShapes[i].m_param2.y(); - for (int j = 0; j<n; j++) - { - MT_Scalar theta = j*(float)M_PI*2/n; - MT_Vector3 pos(cosf(theta) * rad, sinf(theta) * rad, 0.0f); - pos = pos*tr; - pos += debugShapes[i].m_pos; - const MT_Scalar* posPtr = &pos.x(); - glVertex3fv(posPtr); - } - glEnd(); - } - - if (light) glEnable(GL_LIGHTING); - if (tex) glEnable(GL_TEXTURE_2D); - - debugShapes.clear(); -} - -void RAS_OpenGLRasterizer::EndFrame() -{ - glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - - glDisable(GL_MULTISAMPLE_ARB); - - m_2DCanvas->EndFrame(); -} - -void RAS_OpenGLRasterizer::SetRenderArea() -{ - RAS_Rect area; - // only above/below stereo method needs viewport adjustment - switch (m_stereomode) - { - case RAS_STEREO_ABOVEBELOW: - switch (m_curreye) { - case RAS_STEREO_LEFTEYE: - // upper half of window - area.SetLeft(0); - area.SetBottom(m_2DCanvas->GetHeight() - - int(m_2DCanvas->GetHeight() - m_noOfScanlines) / 2); - - area.SetRight(int(m_2DCanvas->GetWidth())); - area.SetTop(int(m_2DCanvas->GetHeight())); - m_2DCanvas->SetDisplayArea(&area); - break; - case RAS_STEREO_RIGHTEYE: - // lower half of window - area.SetLeft(0); - area.SetBottom(0); - area.SetRight(int(m_2DCanvas->GetWidth())); - area.SetTop(int(m_2DCanvas->GetHeight() - m_noOfScanlines) / 2); - m_2DCanvas->SetDisplayArea(&area); - break; - } - break; - case RAS_STEREO_3DTVTOPBOTTOM: - switch (m_curreye) { - case RAS_STEREO_LEFTEYE: - // upper half of window - area.SetLeft(0); - area.SetBottom(m_2DCanvas->GetHeight() - - m_2DCanvas->GetHeight() / 2); - - area.SetRight(m_2DCanvas->GetWidth()); - area.SetTop(m_2DCanvas->GetHeight()); - m_2DCanvas->SetDisplayArea(&area); - break; - case RAS_STEREO_RIGHTEYE: - // lower half of window - area.SetLeft(0); - area.SetBottom(0); - area.SetRight(m_2DCanvas->GetWidth()); - area.SetTop(m_2DCanvas->GetHeight() / 2); - m_2DCanvas->SetDisplayArea(&area); - break; - } - break; - case RAS_STEREO_SIDEBYSIDE: - switch (m_curreye) - { - case RAS_STEREO_LEFTEYE: - // Left half of window - area.SetLeft(0); - area.SetBottom(0); - area.SetRight(m_2DCanvas->GetWidth()/2); - area.SetTop(m_2DCanvas->GetHeight()); - m_2DCanvas->SetDisplayArea(&area); - break; - case RAS_STEREO_RIGHTEYE: - // Right half of window - area.SetLeft(m_2DCanvas->GetWidth()/2); - area.SetBottom(0); - area.SetRight(m_2DCanvas->GetWidth()); - area.SetTop(m_2DCanvas->GetHeight()); - m_2DCanvas->SetDisplayArea(&area); - break; - } - break; - default: - // every available pixel - area.SetLeft(0); - area.SetBottom(0); - area.SetRight(int(m_2DCanvas->GetWidth())); - area.SetTop(int(m_2DCanvas->GetHeight())); - m_2DCanvas->SetDisplayArea(&area); - break; - } -} - -void RAS_OpenGLRasterizer::SetStereoMode(const StereoMode stereomode) -{ - m_stereomode = stereomode; -} - -RAS_IRasterizer::StereoMode RAS_OpenGLRasterizer::GetStereoMode() -{ - return m_stereomode; -} - -bool RAS_OpenGLRasterizer::Stereo() -{ - if (m_stereomode > RAS_STEREO_NOSTEREO) // > 0 - return true; - else - return false; -} - -bool RAS_OpenGLRasterizer::InterlacedStereo() -{ - return m_stereomode == RAS_STEREO_VINTERLACE || m_stereomode == RAS_STEREO_INTERLACED; -} - -void RAS_OpenGLRasterizer::SetEye(const StereoEye eye) -{ - m_curreye = eye; - switch (m_stereomode) - { - case RAS_STEREO_QUADBUFFERED: - glDrawBuffer(m_curreye == RAS_STEREO_LEFTEYE ? GL_BACK_LEFT : GL_BACK_RIGHT); - break; - case RAS_STEREO_ANAGLYPH: - if (m_curreye == RAS_STEREO_LEFTEYE) { - glColorMask(GL_TRUE, GL_FALSE, GL_FALSE, GL_FALSE); - } - else { - //glAccum(GL_LOAD, 1.0f); - glColorMask(GL_FALSE, GL_TRUE, GL_TRUE, GL_FALSE); - ClearDepthBuffer(); - } - break; - case RAS_STEREO_VINTERLACE: - { - // OpenGL stippling is deprecated, it is no longer possible to affect all shaders - // this way, offscreen rendering and then compositing may be the better solution - glEnable(GL_POLYGON_STIPPLE); - glPolygonStipple((const GLubyte*) ((m_curreye == RAS_STEREO_LEFTEYE) ? left_eye_vinterlace_mask : right_eye_vinterlace_mask)); - if (m_curreye == RAS_STEREO_RIGHTEYE) - ClearDepthBuffer(); - break; - } - case RAS_STEREO_INTERLACED: - { - glEnable(GL_POLYGON_STIPPLE); - glPolygonStipple((const GLubyte*) &hinterlace_mask[m_curreye == RAS_STEREO_LEFTEYE?0:1]); - if (m_curreye == RAS_STEREO_RIGHTEYE) - ClearDepthBuffer(); - break; - } - default: - break; - } -} - -RAS_IRasterizer::StereoEye RAS_OpenGLRasterizer::GetEye() -{ - return m_curreye; -} - - -void RAS_OpenGLRasterizer::SetEyeSeparation(const float eyeseparation) -{ - m_eyeseparation = eyeseparation; -} - -float RAS_OpenGLRasterizer::GetEyeSeparation() -{ - return m_eyeseparation; -} - -void RAS_OpenGLRasterizer::SetFocalLength(const float focallength) -{ - m_focallength = focallength; - m_setfocallength = true; -} - -float RAS_OpenGLRasterizer::GetFocalLength() -{ - return m_focallength; -} - -RAS_IOffScreen *RAS_OpenGLRasterizer::CreateOffScreen(int width, int height, int samples, int target) -{ - RAS_IOffScreen *ofs; - - ofs = new RAS_OpenGLOffScreen(m_2DCanvas); - - if (!ofs->Create(width, height, samples, (RAS_IOffScreen::RAS_OFS_RENDER_TARGET)target)) { - delete ofs; - return NULL; - } - return ofs; -} - -RAS_ISync *RAS_OpenGLRasterizer::CreateSync(int type) -{ - RAS_ISync *sync; - - sync = new RAS_OpenGLSync(); - - if (!sync->Create((RAS_ISync::RAS_SYNC_TYPE)type)) { - delete sync; - return NULL; - } - return sync; -} - -void RAS_OpenGLRasterizer::SwapBuffers() -{ - m_2DCanvas->SwapBuffers(); -} - - - -const MT_Matrix4x4& RAS_OpenGLRasterizer::GetViewMatrix() const -{ - return m_viewmatrix; -} - -const MT_Matrix4x4& RAS_OpenGLRasterizer::GetViewInvMatrix() const -{ - return m_viewinvmatrix; -} - -void RAS_OpenGLRasterizer::IndexPrimitives_3DText(RAS_MeshSlot& ms, - class RAS_IPolyMaterial* polymat) -{ - bool obcolor = ms.m_bObjectColor; - MT_Vector4& rgba = ms.m_RGBAcolor; - RAS_MeshSlot::iterator it; - - const STR_String& mytext = ((CValue*)m_clientobject)->GetPropertyText("Text"); - - // handle object color - if (obcolor) { - glDisableClientState(GL_COLOR_ARRAY); - glColor4d(rgba[0], rgba[1], rgba[2], rgba[3]); - } - else - glEnableClientState(GL_COLOR_ARRAY); - - for (ms.begin(it); !ms.end(it); ms.next(it)) { - RAS_TexVert *vertex; - size_t i, j, numvert; - - numvert = it.array->m_type; - - if (it.array->m_type == RAS_DisplayArray::LINE) { - // line drawing, no text - glBegin(GL_LINES); - - for (i=0; i<it.totindex; i+=2) - { - vertex = &it.vertex[it.index[i]]; - glVertex3fv(vertex->getXYZ()); - - vertex = &it.vertex[it.index[i+1]]; - glVertex3fv(vertex->getXYZ()); - } - - glEnd(); - } - else { - // triangle and quad text drawing - for (i=0; i<it.totindex; i+=numvert) - { - float v[4][3]; - const float *v_ptr[4] = {NULL}; - const float *uv_ptr[4] = {NULL}; - int glattrib, unit; - - for (j=0; j<numvert; j++) { - vertex = &it.vertex[it.index[i+j]]; - - v[j][0] = vertex->getXYZ()[0]; - v[j][1] = vertex->getXYZ()[1]; - v[j][2] = vertex->getXYZ()[2]; - v_ptr[j] = v[j]; - - uv_ptr[j] = vertex->getUV(0); - } - - // find the right opengl attribute - glattrib = -1; - if (GLEW_ARB_vertex_program) - for (unit=0; unit<m_attrib_num; unit++) - if (m_attrib[unit] == RAS_TEXCO_UV) - glattrib = unit; - - GPU_render_text( - polymat->GetDrawingMode(), mytext, mytext.Length(), polymat->GetMCol(), - v_ptr, uv_ptr, glattrib); - - ClearCachingInfo(); - } - } - } - - glDisableClientState(GL_COLOR_ARRAY); -} - -void RAS_OpenGLRasterizer::SetTexCoordNum(int num) -{ - m_texco_num = num; - if (m_texco_num > RAS_MAX_TEXCO) - m_texco_num = RAS_MAX_TEXCO; -} - -void RAS_OpenGLRasterizer::SetAttribNum(int num) -{ - m_attrib_num = num; - if (m_attrib_num > RAS_MAX_ATTRIB) - m_attrib_num = RAS_MAX_ATTRIB; -} - -void RAS_OpenGLRasterizer::SetTexCoord(TexCoGen coords, int unit) -{ - // this changes from material to material - if (unit < RAS_MAX_TEXCO) - m_texco[unit] = coords; -} - -void RAS_OpenGLRasterizer::SetAttrib(TexCoGen coords, int unit, int layer) -{ - // this changes from material to material - if (unit < RAS_MAX_ATTRIB) { - m_attrib[unit] = coords; - m_attrib_layer[unit] = layer; - } -} - -void RAS_OpenGLRasterizer::IndexPrimitives(RAS_MeshSlot& ms) -{ - if (ms.m_pDerivedMesh) - DrawDerivedMesh(ms); - else - m_storage->IndexPrimitives(ms); -} - -// Code for hooking into Blender's mesh drawing for derived meshes. -// If/when we use more of Blender's drawing code, we may be able to -// clean this up -static bool current_wireframe; -static RAS_MaterialBucket *current_bucket; -static RAS_IPolyMaterial *current_polymat; -static RAS_MeshSlot *current_ms; -static RAS_MeshObject *current_mesh; -static int current_blmat_nr; -static GPUVertexAttribs current_gpu_attribs; -static int CheckMaterialDM(int matnr, void *attribs) -{ - // only draw the current material - if (matnr != current_blmat_nr) - return 0; - GPUVertexAttribs *gattribs = (GPUVertexAttribs *)attribs; - if (gattribs) - memcpy(gattribs, ¤t_gpu_attribs, sizeof(GPUVertexAttribs)); - return 1; -} - -void RAS_OpenGLRasterizer::DrawDerivedMesh(class RAS_MeshSlot &ms) -{ - // mesh data is in derived mesh - current_bucket = ms.m_bucket; - current_polymat = current_bucket->GetPolyMaterial(); - current_ms = &ms; - current_mesh = ms.m_mesh; - current_wireframe = m_drawingmode <= RAS_IRasterizer::KX_WIREFRAME; - // MCol *mcol = (MCol*)ms.m_pDerivedMesh->getFaceDataArray(ms.m_pDerivedMesh, CD_MCOL); /* UNUSED */ - - // handle two-side - if (current_polymat->GetDrawingMode() & RAS_IRasterizer::KX_BACKCULL) - this->SetCullFace(true); - else - this->SetCullFace(false); - -#if 0 - if (current_polymat->GetFlag() & RAS_BLENDERGLSL) -#endif - { - // GetMaterialIndex return the original mface material index, - // increment by 1 to match what derived mesh is doing - current_blmat_nr = current_polymat->GetMaterialIndex()+1; - // For GLSL we need to retrieve the GPU material attribute - Material* blmat = current_polymat->GetBlenderMaterial(); - Scene* blscene = current_polymat->GetBlenderScene(); - if (!current_wireframe && blscene && blmat) - GPU_material_vertex_attributes(GPU_material_from_blender(blscene, blmat, false), ¤t_gpu_attribs); - else - memset(¤t_gpu_attribs, 0, sizeof(current_gpu_attribs)); - // DM draw can mess up blending mode, restore at the end - int current_blend_mode = GPU_get_material_alpha_blend(); - ms.m_pDerivedMesh->drawFacesGLSL(ms.m_pDerivedMesh, CheckMaterialDM); - GPU_set_material_alpha_blend(current_blend_mode); - } -} - -void RAS_OpenGLRasterizer::SetProjectionMatrix(MT_CmMatrix4x4 &mat) -{ - glMatrixMode(GL_PROJECTION); - float* matrix = &mat(0, 0); - glLoadMatrixf(matrix); - - m_camortho = (mat(3, 3) != 0.0f); -} - -void RAS_OpenGLRasterizer::SetProjectionMatrix(const MT_Matrix4x4 & mat) -{ - glMatrixMode(GL_PROJECTION); - float matrix[16]; - /* Get into argument. Looks a bit dodgy, but it's ok. */ - mat.getValue(matrix); - glLoadMatrixf(matrix); - - m_camortho = (mat[3][3] != 0.0f); -} - -MT_Matrix4x4 RAS_OpenGLRasterizer::GetFrustumMatrix( - float left, - float right, - float bottom, - float top, - float frustnear, - float frustfar, - float focallength, - bool -) { - MT_Matrix4x4 result; - float mat[16]; - - // correction for stereo - if (Stereo()) - { - float near_div_focallength; - float offset; - - // if Rasterizer.setFocalLength is not called we use the camera focallength - if (!m_setfocallength) - // if focallength is null we use a value known to be reasonable - m_focallength = (focallength == 0.f) ? m_eyeseparation * 30.0f - : focallength; - - near_div_focallength = frustnear / m_focallength; - offset = 0.5f * m_eyeseparation * near_div_focallength; - switch (m_curreye) { - case RAS_STEREO_LEFTEYE: - left += offset; - right += offset; - break; - case RAS_STEREO_RIGHTEYE: - left -= offset; - right -= offset; - break; - } - // leave bottom and top untouched - if (m_stereomode == RAS_STEREO_3DTVTOPBOTTOM) { - // restore the vertical frustum because the 3DTV will - // expand the top and bottom part to the full size of the screen - bottom *= 2.0f; - top *= 2.0f; - } - } - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum(left, right, bottom, top, frustnear, frustfar); - - glGetFloatv(GL_PROJECTION_MATRIX, mat); - result.setValue(mat); - - return result; -} - -MT_Matrix4x4 RAS_OpenGLRasterizer::GetOrthoMatrix( - float left, - float right, - float bottom, - float top, - float frustnear, - float frustfar -) { - MT_Matrix4x4 result; - float mat[16]; - - // stereo is meaningless for orthographic, disable it - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho(left, right, bottom, top, frustnear, frustfar); - - glGetFloatv(GL_PROJECTION_MATRIX, mat); - result.setValue(mat); - - return result; -} - - -// next arguments probably contain redundant info, for later... -void RAS_OpenGLRasterizer::SetViewMatrix(const MT_Matrix4x4 &mat, - const MT_Matrix3x3 & camOrientMat3x3, - const MT_Point3 & pos, - const MT_Vector3 &scale, - bool perspective) -{ - m_viewmatrix = mat; - - // correction for stereo - if (Stereo() && perspective) - { - MT_Vector3 unitViewDir(0.0f, -1.0f, 0.0f); // minus y direction, Blender convention - MT_Vector3 unitViewupVec(0.0f, 0.0f, 1.0f); - MT_Vector3 viewDir, viewupVec; - MT_Vector3 eyeline; - - // actual viewDir - viewDir = camOrientMat3x3 * unitViewDir; // this is the moto convention, vector on right hand side - // actual viewup vec - viewupVec = camOrientMat3x3 * unitViewupVec; - - // vector between eyes - eyeline = viewDir.cross(viewupVec); - - switch (m_curreye) { - case RAS_STEREO_LEFTEYE: - { - // translate to left by half the eye distance - MT_Transform transform; - transform.setIdentity(); - transform.translate(-(eyeline * m_eyeseparation / 2.0f)); - m_viewmatrix *= transform; - } - break; - case RAS_STEREO_RIGHTEYE: - { - // translate to right by half the eye distance - MT_Transform transform; - transform.setIdentity(); - transform.translate(eyeline * m_eyeseparation / 2.0f); - m_viewmatrix *= transform; - } - break; - } - } - - bool negX = (scale[0] < 0.0f); - bool negY = (scale[1] < 0.0f); - bool negZ = (scale[2] < 0.0f); - if (negX || negY || negZ) { - m_viewmatrix.tscale((negX)?-1.0f:1.0f, (negY)?-1.0f:1.0f, (negZ)?-1.0f:1.0f, 1.0); - } - m_viewinvmatrix = m_viewmatrix; - m_viewinvmatrix.invert(); - - // note: getValue gives back column major as needed by OpenGL - MT_Scalar glviewmat[16]; - m_viewmatrix.getValue(glviewmat); - - glMatrixMode(GL_MODELVIEW); - glLoadMatrixf(glviewmat); - m_campos = pos; - m_camnegscale = negX ^ negY ^ negZ; -} - - -const MT_Point3& RAS_OpenGLRasterizer::GetCameraPosition() -{ - return m_campos; -} - -bool RAS_OpenGLRasterizer::GetCameraOrtho() -{ - return m_camortho; -} - -void RAS_OpenGLRasterizer::SetCullFace(bool enable) -{ - if (enable) - glEnable(GL_CULL_FACE); - else - glDisable(GL_CULL_FACE); -} - -void RAS_OpenGLRasterizer::SetLines(bool enable) -{ - if (enable) - glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); - else - glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); -} - -void RAS_OpenGLRasterizer::SetSpecularity(float specX, - float specY, - float specZ, - float specval) -{ - GLfloat mat_specular[] = {specX, specY, specZ, specval}; - glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular); -} - - - -void RAS_OpenGLRasterizer::SetShinyness(float shiny) -{ - GLfloat mat_shininess[] = { shiny }; - glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess); -} - - - -void RAS_OpenGLRasterizer::SetDiffuse(float difX,float difY,float difZ,float diffuse) -{ - GLfloat mat_diffuse [] = {difX, difY,difZ, diffuse}; - glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse); -} - -void RAS_OpenGLRasterizer::SetEmissive(float eX, float eY, float eZ, float e) -{ - GLfloat mat_emit [] = {eX,eY,eZ,e}; - glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, mat_emit); -} - - -double RAS_OpenGLRasterizer::GetTime() -{ - return m_time; -} - -void RAS_OpenGLRasterizer::SetPolygonOffset(float mult, float add) -{ - glPolygonOffset(mult, add); - GLint mode = GL_POLYGON_OFFSET_FILL; - if (m_drawingmode < KX_SHADED) - mode = GL_POLYGON_OFFSET_LINE; - if (mult != 0.0f || add != 0.0f) - glEnable(mode); - else - glDisable(mode); -} - -void RAS_OpenGLRasterizer::EnableMotionBlur(float motionblurvalue) -{ - /* don't just set m_motionblur to 1, but check if it is 0 so - * we don't reset a motion blur that is already enabled */ - if (m_motionblur == 0) - m_motionblur = 1; - m_motionblurvalue = motionblurvalue; -} - -void RAS_OpenGLRasterizer::DisableMotionBlur() -{ - m_motionblur = 0; - m_motionblurvalue = -1.0f; -} - -void RAS_OpenGLRasterizer::SetAlphaBlend(int alphablend) -{ - /* Variance shadow maps don't handle alpha well, best to not allow it for now */ - if (m_drawingmode == KX_SHADOW && m_usingoverrideshader) - GPU_set_material_alpha_blend(GPU_BLEND_SOLID); - else - GPU_set_material_alpha_blend(alphablend); -/* - if (alphablend == m_last_alphablend) - return; - - if (alphablend == GPU_BLEND_SOLID) { - glDisable(GL_BLEND); - glDisable(GL_ALPHA_TEST); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - } - else if (alphablend == GPU_BLEND_ADD) { - glBlendFunc(GL_ONE, GL_ONE); - glEnable(GL_BLEND); - glDisable(GL_ALPHA_TEST); - } - else if (alphablend == GPU_BLEND_ALPHA) { - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glEnable(GL_BLEND); - glEnable(GL_ALPHA_TEST); - glAlphaFunc(GL_GREATER, 0.0f); - } - else if (alphablend == GPU_BLEND_CLIP) { - glDisable(GL_BLEND); - glEnable(GL_ALPHA_TEST); - glAlphaFunc(GL_GREATER, 0.5f); - } - - m_last_alphablend = alphablend; -*/ -} - -void RAS_OpenGLRasterizer::SetFrontFace(bool ccw) -{ - if (m_camnegscale) - ccw = !ccw; - - if (m_last_frontface == ccw) - return; - - if (ccw) - glFrontFace(GL_CCW); - else - glFrontFace(GL_CW); - - m_last_frontface = ccw; -} - -void RAS_OpenGLRasterizer::SetAnisotropicFiltering(short level) -{ - GPU_set_anisotropic((float)level); -} - -short RAS_OpenGLRasterizer::GetAnisotropicFiltering() -{ - return (short)GPU_get_anisotropic(); -} - -void RAS_OpenGLRasterizer::SetMipmapping(MipmapOption val) -{ - if (val == RAS_IRasterizer::RAS_MIPMAP_LINEAR) - { - GPU_set_linear_mipmap(1); - GPU_set_mipmap(1); - } - else if (val == RAS_IRasterizer::RAS_MIPMAP_NEAREST) - { - GPU_set_linear_mipmap(0); - GPU_set_mipmap(1); - } - else - { - GPU_set_linear_mipmap(0); - GPU_set_mipmap(0); - } -} - -RAS_IRasterizer::MipmapOption RAS_OpenGLRasterizer::GetMipmapping() -{ - if (GPU_get_mipmap()) { - if (GPU_get_linear_mipmap()) { - return RAS_IRasterizer::RAS_MIPMAP_LINEAR; - } - else { - return RAS_IRasterizer::RAS_MIPMAP_NEAREST; - } - } - else { - return RAS_IRasterizer::RAS_MIPMAP_NONE; - } -} - -void RAS_OpenGLRasterizer::SetUsingOverrideShader(bool val) -{ - m_usingoverrideshader = val; -} - -bool RAS_OpenGLRasterizer::GetUsingOverrideShader() -{ - return m_usingoverrideshader; -} - -/** - * Render Tools - */ - -/* ProcessLighting performs lighting on objects. the layer is a bitfield that - * contains layer information. There are 20 'official' layers in blender. A - * light is applied on an object only when they are in the same layer. OpenGL - * has a maximum of 8 lights (simultaneous), so 20 * 8 lights are possible in - * a scene. */ - -void RAS_OpenGLRasterizer::ProcessLighting(bool uselights, const MT_Transform& viewmat) -{ - bool enable = false; - int layer= -1; - - /* find the layer */ - if (uselights) { - if (m_clientobject) - layer = static_cast<KX_GameObject*>(m_clientobject)->GetLayer(); - } - - /* avoid state switching */ - if (m_lastlightlayer == layer && m_lastauxinfo == m_auxilaryClientInfo) - return; - - m_lastlightlayer = layer; - m_lastauxinfo = m_auxilaryClientInfo; - - /* enable/disable lights as needed */ - if (layer >= 0) { - //enable = ApplyLights(layer, viewmat); - // taken from blender source, incompatibility between Blender Object / GameObject - KX_Scene* kxscene = (KX_Scene*)m_auxilaryClientInfo; - float glviewmat[16]; - unsigned int count; - std::vector<RAS_OpenGLLight*>::iterator lit = m_lights.begin(); - - for (count=0; count<m_numgllights; count++) - glDisable((GLenum)(GL_LIGHT0+count)); - - viewmat.getValue(glviewmat); - - glPushMatrix(); - glLoadMatrixf(glviewmat); - for (lit = m_lights.begin(), count = 0; !(lit==m_lights.end()) && count < m_numgllights; ++lit) - { - RAS_OpenGLLight* light = (*lit); - - if (light->ApplyFixedFunctionLighting(kxscene, layer, count)) - count++; - } - glPopMatrix(); - - enable = count > 0; - } - - if (enable) - EnableOpenGLLights(); - else - DisableOpenGLLights(); -} - -void RAS_OpenGLRasterizer::EnableOpenGLLights() -{ - if (m_lastlighting == true) - return; - - glEnable(GL_LIGHTING); - glEnable(GL_COLOR_MATERIAL); - - glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); - glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE); - glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, (GetCameraOrtho())? GL_FALSE: GL_TRUE); - if (GLEW_EXT_separate_specular_color || GLEW_VERSION_1_2) - glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR); - - m_lastlighting = true; -} - -void RAS_OpenGLRasterizer::DisableOpenGLLights() -{ - if (m_lastlighting == false) - return; - - glDisable(GL_LIGHTING); - glDisable(GL_COLOR_MATERIAL); - - m_lastlighting = false; -} - -RAS_ILightObject *RAS_OpenGLRasterizer::CreateLight() -{ - return new RAS_OpenGLLight(this); -} - -void RAS_OpenGLRasterizer::AddLight(RAS_ILightObject* lightobject) -{ - RAS_OpenGLLight* gllight = dynamic_cast<RAS_OpenGLLight*>(lightobject); - assert(gllight); - m_lights.push_back(gllight); -} - -void RAS_OpenGLRasterizer::RemoveLight(RAS_ILightObject* lightobject) -{ - RAS_OpenGLLight* gllight = dynamic_cast<RAS_OpenGLLight*>(lightobject); - assert(gllight); - - std::vector<RAS_OpenGLLight*>::iterator lit = - std::find(m_lights.begin(),m_lights.end(),gllight); - - if (!(lit==m_lights.end())) - m_lights.erase(lit); -} - -bool RAS_OpenGLRasterizer::RayHit(struct KX_ClientObjectInfo *client, KX_RayCast *result, float *oglmatrix) -{ - if (result->m_hitMesh) { - - RAS_Polygon* poly = result->m_hitMesh->GetPolygon(result->m_hitPolygon); - if (!poly->IsVisible()) - return false; - - MT_Vector3 resultnormal(result->m_hitNormal); - MT_Vector3 left(oglmatrix[0],oglmatrix[1],oglmatrix[2]); - MT_Vector3 dir = -(left.cross(resultnormal)).safe_normalized(); - left = (dir.cross(resultnormal)).safe_normalized(); - // for the up vector, we take the 'resultnormal' returned by the physics - - float maat[16] = {left[0], left[1], left[2], 0, - dir[0], dir[1], dir[2], 0, - resultnormal[0], resultnormal[1], resultnormal[2], 0, - 0, 0, 0, 1}; - - glTranslatef(oglmatrix[12],oglmatrix[13],oglmatrix[14]); - //glMultMatrixd(oglmatrix); - glMultMatrixf(maat); - return true; - } - else { - return false; - } -} - -void RAS_OpenGLRasterizer::applyTransform(float* oglmatrix,int objectdrawmode ) -{ - /* FIXME: - blender: intern/moto/include/MT_Vector3.inl:42: MT_Vector3 operator/(const - MT_Vector3&, double): Assertion `!MT_fuzzyZero(s)' failed. - - Program received signal SIGABRT, Aborted. - [Switching to Thread 16384 (LWP 1519)] - 0x40477571 in kill () from /lib/libc.so.6 - (gdb) bt - #7 0x08334368 in MT_Vector3::normalized() const () - #8 0x0833e6ec in RAS_OpenGLRasterizer::applyTransform(RAS_IRasterizer*, double*, int) () - */ - - if (objectdrawmode & RAS_IPolyMaterial::BILLBOARD_SCREENALIGNED || - objectdrawmode & RAS_IPolyMaterial::BILLBOARD_AXISALIGNED) - { - // rotate the billboard/halo - //page 360/361 3D Game Engine Design, David Eberly for a discussion - // on screen aligned and axis aligned billboards - // assumed is that the preprocessor transformed all billboard polygons - // so that their normal points into the positive x direction (1.0f, 0.0f, 0.0f) - // when new parenting for objects is done, this rotation - // will be moved into the object - - MT_Point3 objpos (oglmatrix[12],oglmatrix[13],oglmatrix[14]); - MT_Point3 campos = GetCameraPosition(); - MT_Vector3 dir = (campos - objpos).safe_normalized(); - MT_Vector3 up(0,0,1.0f); - - KX_GameObject* gameobj = (KX_GameObject*)m_clientobject; - // get scaling of halo object - MT_Vector3 size = gameobj->GetSGNode()->GetWorldScaling(); - - bool screenaligned = (objectdrawmode & RAS_IPolyMaterial::BILLBOARD_SCREENALIGNED)!=0;//false; //either screen or axisaligned - if (screenaligned) - { - up = (up - up.dot(dir) * dir).safe_normalized(); - } else - { - dir = (dir - up.dot(dir)*up).safe_normalized(); - } - - MT_Vector3 left = dir.normalized(); - dir = (up.cross(left)).normalized(); - - // we have calculated the row vectors, now we keep - // local scaling into account: - - left *= size[0]; - dir *= size[1]; - up *= size[2]; - - float maat[16] = {left[0], left[1], left[2], 0, - dir[0], dir[1], dir[2], 0, - up[0], up[1], up[2], 0, - 0, 0, 0, 1}; - - glTranslatef(objpos[0],objpos[1],objpos[2]); - glMultMatrixf(maat); - - } - else { - if (objectdrawmode & RAS_IPolyMaterial::SHADOW) - { - // shadow must be cast to the ground, physics system needed here! - MT_Point3 frompoint(oglmatrix[12],oglmatrix[13],oglmatrix[14]); - KX_GameObject *gameobj = (KX_GameObject*)m_clientobject; - MT_Vector3 direction = MT_Vector3(0,0,-1); - - direction.normalize(); - direction *= 100000; - - MT_Point3 topoint = frompoint + direction; - - KX_Scene* kxscene = (KX_Scene*) m_auxilaryClientInfo; - PHY_IPhysicsEnvironment* physics_environment = kxscene->GetPhysicsEnvironment(); - PHY_IPhysicsController* physics_controller = gameobj->GetPhysicsController(); - - KX_GameObject *parent = gameobj->GetParent(); - if (!physics_controller && parent) - physics_controller = parent->GetPhysicsController(); - - KX_RayCast::Callback<RAS_OpenGLRasterizer, float> callback(this, physics_controller, oglmatrix); - if (!KX_RayCast::RayTest(physics_environment, frompoint, topoint, callback)) - { - // couldn't find something to cast the shadow on... - glMultMatrixf(oglmatrix); - } - else - { // we found the "ground", but the cast matrix doesn't take - // scaling in consideration, so we must apply the object scale - MT_Vector3 size = gameobj->GetSGNode()->GetLocalScale(); - glScalef(size[0], size[1], size[2]); - } - } else - { - - // 'normal' object - glMultMatrixf(oglmatrix); - } - } -} - -static void DisableForText() -{ - glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); /* needed for texture fonts otherwise they render as wireframe */ - - glDisable(GL_BLEND); - glDisable(GL_ALPHA_TEST); - - glDisable(GL_LIGHTING); - glDisable(GL_COLOR_MATERIAL); - - if (GLEW_ARB_multitexture) { - for (int i=0; i<RAS_MAX_TEXCO; i++) { - glActiveTextureARB(GL_TEXTURE0_ARB+i); - - if (GLEW_ARB_texture_cube_map) { - glDisable(GL_TEXTURE_CUBE_MAP_ARB); - glDisable(GL_TEXTURE_GEN_S); - glDisable(GL_TEXTURE_GEN_T); - glDisable(GL_TEXTURE_GEN_Q); - glDisable(GL_TEXTURE_GEN_R); - } - glDisable(GL_TEXTURE_2D); - } - - glActiveTextureARB(GL_TEXTURE0_ARB); - } - else { - if (GLEW_ARB_texture_cube_map) - glDisable(GL_TEXTURE_CUBE_MAP_ARB); - - glDisable(GL_TEXTURE_2D); - } -} - -void RAS_OpenGLRasterizer::RenderBox2D(int xco, - int yco, - int width, - int height, - float percentage) -{ - /* This is a rather important line :( The gl-mode hasn't been left - * behind quite as neatly as we'd have wanted to. I don't know - * what cause it, though :/ .*/ - glDisable(GL_DEPTH_TEST); - - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glLoadIdentity(); - - glOrtho(0, width, 0, height, -100, 100); - - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glLoadIdentity(); - - yco = height - yco; - int barsize = 50; - - /* draw in black first */ - glColor3ub(0, 0, 0); - glBegin(GL_QUADS); - glVertex2f(xco + 1 + 1 + barsize * percentage, yco - 1 + 10); - glVertex2f(xco + 1, yco - 1 + 10); - glVertex2f(xco + 1, yco - 1); - glVertex2f(xco + 1 + 1 + barsize * percentage, yco - 1); - glEnd(); - - glColor3ub(255, 255, 255); - glBegin(GL_QUADS); - glVertex2f(xco + 1 + barsize * percentage, yco + 10); - glVertex2f(xco, yco + 10); - glVertex2f(xco, yco); - glVertex2f(xco + 1 + barsize * percentage, yco); - glEnd(); - - glMatrixMode(GL_PROJECTION); - glPopMatrix(); - glMatrixMode(GL_MODELVIEW); - glPopMatrix(); - glEnable(GL_DEPTH_TEST); -} - -void RAS_OpenGLRasterizer::RenderText3D( - int fontid, const char *text, int size, int dpi, - const float color[4], const float mat[16], float aspect) -{ - /* gl prepping */ - DisableForText(); - - /* the actual drawing */ - glColor4fv(color); - - /* multiply the text matrix by the object matrix */ - BLF_enable(fontid, BLF_MATRIX|BLF_ASPECT); - BLF_matrix(fontid, mat); - - /* aspect is the inverse scale that allows you to increase - * your resolution without sizing the final text size - * the bigger the size, the smaller the aspect */ - BLF_aspect(fontid, aspect, aspect, aspect); - - BLF_size(fontid, size, dpi); - BLF_position(fontid, 0, 0, 0); - BLF_draw(fontid, text, 65535); - - BLF_disable(fontid, BLF_MATRIX|BLF_ASPECT); -} - -void RAS_OpenGLRasterizer::RenderText2D( - RAS_TEXT_RENDER_MODE mode, - const char* text, - int xco, int yco, - int width, int height) -{ - /* This is a rather important line :( The gl-mode hasn't been left - * behind quite as neatly as we'd have wanted to. I don't know - * what cause it, though :/ .*/ - DisableForText(); - glDisable(GL_DEPTH_TEST); - - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glLoadIdentity(); - - glOrtho(0, width, 0, height, -100, 100); - - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glLoadIdentity(); - - if (mode == RAS_TEXT_PADDED) { - /* draw in black first */ - glColor3ub(0, 0, 0); - BLF_size(blf_mono_font, 11, 72); - BLF_position(blf_mono_font, (float)xco+1, (float)(height-yco-1), 0.0f); - BLF_draw(blf_mono_font, text, 65535); /* XXX, use real len */ - } - - /* the actual drawing */ - glColor3ub(255, 255, 255); - BLF_size(blf_mono_font, 11, 72); - BLF_position(blf_mono_font, (float)xco, (float)(height-yco), 0.0f); - BLF_draw(blf_mono_font, text, 65535); /* XXX, use real len */ - - glMatrixMode(GL_PROJECTION); - glPopMatrix(); - glMatrixMode(GL_MODELVIEW); - glPopMatrix(); - glEnable(GL_DEPTH_TEST); -} - -void RAS_OpenGLRasterizer::PushMatrix() -{ - glPushMatrix(); -} - -void RAS_OpenGLRasterizer::PopMatrix() -{ - glPopMatrix(); -} - -void RAS_OpenGLRasterizer::MotionBlur() -{ - int state = GetMotionBlurState(); - float motionblurvalue; - if (state) - { - motionblurvalue = GetMotionBlurValue(); - if (state==1) - { - // bugfix:load color buffer into accum buffer for the first time(state=1) - glAccum(GL_LOAD, 1.0f); - SetMotionBlurState(2); - } - else if (motionblurvalue >= 0.0f && motionblurvalue <= 1.0f) { - glAccum(GL_MULT, motionblurvalue); - glAccum(GL_ACCUM, 1-motionblurvalue); - glAccum(GL_RETURN, 1.0f); - glFlush(); - } - } -} - -void RAS_OpenGLRasterizer::SetClientObject(void* obj) -{ - if (m_clientobject != obj) - { - bool ccw = (obj == NULL || !((KX_GameObject*)obj)->IsNegativeScaling()); - SetFrontFace(ccw); - - m_clientobject = obj; - } -} - -void RAS_OpenGLRasterizer::SetAuxilaryClientInfo(void* inf) -{ - m_auxilaryClientInfo = inf; -} - -void RAS_OpenGLRasterizer::PrintHardwareInfo() -{ - #define pprint(x) std::cout << x << std::endl; - - pprint("GL_VENDOR: " << glGetString(GL_VENDOR)); - pprint("GL_RENDERER: " << glGetString(GL_RENDERER)); - pprint("GL_VERSION: " << glGetString(GL_VERSION)); - bool support=0; - pprint("Supported Extensions..."); - pprint(" GL_ARB_shader_objects supported? "<< (GLEW_ARB_shader_objects?"yes.":"no.")); - - support= GLEW_ARB_vertex_shader; - pprint(" GL_ARB_vertex_shader supported? "<< (support?"yes.":"no.")); - if (support) { - pprint(" ----------Details----------"); - int max=0; - glGetIntegerv(GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB, (GLint*)&max); - pprint(" Max uniform components." << max); - - glGetIntegerv(GL_MAX_VARYING_FLOATS_ARB, (GLint*)&max); - pprint(" Max varying floats." << max); - - glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB, (GLint*)&max); - pprint(" Max vertex texture units." << max); - - glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB, (GLint*)&max); - pprint(" Max combined texture units." << max); - pprint(""); - } - - support=GLEW_ARB_fragment_shader; - pprint(" GL_ARB_fragment_shader supported? "<< (support?"yes.":"no.")); - if (support) { - pprint(" ----------Details----------"); - int max=0; - glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB, (GLint*)&max); - pprint(" Max uniform components." << max); - pprint(""); - } - - support = GLEW_ARB_texture_cube_map; - pprint(" GL_ARB_texture_cube_map supported? "<< (support?"yes.":"no.")); - if (support) { - pprint(" ----------Details----------"); - int size=0; - glGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB, (GLint*)&size); - pprint(" Max cubemap size." << size); - pprint(""); - } - - support = GLEW_ARB_multitexture; - pprint(" GL_ARB_multitexture supported? "<< (support?"yes.":"no.")); - if (support) { - pprint(" ----------Details----------"); - int units=0; - glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, (GLint*)&units); - pprint(" Max texture units available. " << units); - pprint(""); - } - - pprint(" GL_ARB_texture_env_combine supported? "<< (GLEW_ARB_texture_env_combine?"yes.":"no.")); - - pprint(" GL_ARB_texture_non_power_of_two supported " << (GPU_full_non_power_of_two_support()?"yes.":"no.")); -} - diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h deleted file mode 100644 index 9561e207dba..00000000000 --- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h +++ /dev/null @@ -1,343 +0,0 @@ -/* - * ***** 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. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - */ - -/** \file RAS_OpenGLRasterizer.h - * \ingroup bgerastogl - */ - -#ifndef __RAS_OPENGLRASTERIZER_H__ -#define __RAS_OPENGLRASTERIZER_H__ - -#ifdef _MSC_VER -# pragma warning (disable:4786) -#endif - -#include "MT_CmMatrix4x4.h" -#include <vector> -#include <map> -using namespace std; - -#include "RAS_IRasterizer.h" -#include "RAS_MaterialBucket.h" -#include "RAS_IPolygonMaterial.h" - -#include "BLI_utildefines.h" - -class RAS_IStorage; -class RAS_ICanvas; -class RAS_OpenGLLight; - -#define RAS_MAX_TEXCO 8 /* match in BL_Material */ -#define RAS_MAX_ATTRIB 16 /* match in BL_BlenderShader */ - -enum RAS_STORAGE_TYPE { - RAS_AUTO_STORAGE, - RAS_VA, - RAS_VBO, -}; - -struct OglDebugShape -{ - enum SHAPE_TYPE{ - LINE, - CIRCLE, - }; - SHAPE_TYPE m_type; - MT_Vector3 m_pos; - MT_Vector3 m_param; - MT_Vector3 m_param2; - MT_Vector3 m_color; -}; - -/** - * 3D rendering device context. - */ -class RAS_OpenGLRasterizer : public RAS_IRasterizer -{ - RAS_ICanvas *m_2DCanvas; - - /* fogging vars */ - bool m_fogenabled; - - float m_redback; - float m_greenback; - float m_blueback; - float m_alphaback; - - float m_ambr; - float m_ambg; - float m_ambb; - double m_time; - MT_Matrix4x4 m_viewmatrix; - MT_Matrix4x4 m_viewinvmatrix; - MT_Point3 m_campos; - bool m_camortho; - bool m_camnegscale; - - StereoMode m_stereomode; - StereoEye m_curreye; - float m_eyeseparation; - float m_focallength; - bool m_setfocallength; - int m_noOfScanlines; - - short m_prevafvalue; - - /* motion blur */ - int m_motionblur; - float m_motionblurvalue; - - bool m_usingoverrideshader; - - /* Render tools */ - void *m_clientobject; - void *m_auxilaryClientInfo; - std::vector<RAS_OpenGLLight *> m_lights; - int m_lastlightlayer; - bool m_lastlighting; - void *m_lastauxinfo; - unsigned int m_numgllights; - -protected: - int m_drawingmode; - TexCoGen m_texco[RAS_MAX_TEXCO]; - TexCoGen m_attrib[RAS_MAX_ATTRIB]; - int m_attrib_layer[RAS_MAX_ATTRIB]; - int m_texco_num; - int m_attrib_num; - /* int m_last_alphablend; */ - bool m_last_frontface; - - /* Stores the caching information for the last material activated. */ - RAS_IPolyMaterial::TCachingInfo m_materialCachingInfo; - - /* Making use of a Strategy design pattern for storage behavior. - * Examples of concrete strategies: Vertex Arrays, VBOs, Immediate Mode*/ - int m_storage_type; - RAS_IStorage *m_storage; - -public: - double GetTime(); - RAS_OpenGLRasterizer(RAS_ICanvas *canv, RAS_STORAGE_TYPE storage); - virtual ~RAS_OpenGLRasterizer(); - - /*enum DrawType - { - KX_BOUNDINGBOX = 1, - KX_WIREFRAME, - KX_SOLID, - KX_SHADED, - KX_TEXTURED - }; - - enum DepthMask - { - KX_DEPTHMASK_ENABLED =1, - KX_DEPTHMASK_DISABLED, - };*/ - virtual void SetDepthMask(DepthMask depthmask); - - virtual bool SetMaterial(const RAS_IPolyMaterial &mat); - virtual bool Init(); - virtual void Exit(); - virtual bool BeginFrame(double time); - virtual void ClearColorBuffer(); - virtual void ClearDepthBuffer(); - virtual void ClearCachingInfo(void); - virtual void EndFrame(); - virtual void SetRenderArea(); - - virtual void SetStereoMode(const StereoMode stereomode); - virtual RAS_IRasterizer::StereoMode GetStereoMode(); - virtual bool Stereo(); - virtual bool InterlacedStereo(); - virtual void SetEye(const StereoEye eye); - virtual StereoEye GetEye(); - virtual void SetEyeSeparation(const float eyeseparation); - virtual float GetEyeSeparation(); - virtual void SetFocalLength(const float focallength); - virtual float GetFocalLength(); - virtual RAS_IOffScreen *CreateOffScreen(int width, int height, int samples, int target); - virtual RAS_ISync *CreateSync(int type); - virtual void SwapBuffers(); - - virtual void IndexPrimitives(class RAS_MeshSlot &ms); - virtual void IndexPrimitives_3DText(class RAS_MeshSlot &ms, class RAS_IPolyMaterial *polymat); - virtual void DrawDerivedMesh(class RAS_MeshSlot &ms); - - virtual void SetProjectionMatrix(MT_CmMatrix4x4 &mat); - virtual void SetProjectionMatrix(const MT_Matrix4x4 &mat); - virtual void SetViewMatrix( - const MT_Matrix4x4 &mat, - const MT_Matrix3x3 &ori, - const MT_Point3 &pos, - const MT_Vector3 &scale, - bool perspective); - - virtual const MT_Point3& GetCameraPosition(); - virtual bool GetCameraOrtho(); - - virtual void SetFog(short type, float start, float dist, float intensity, float color[3]); - virtual void EnableFog(bool enable); - virtual void DisplayFog(); - - virtual void SetBackColor(float color[3]); - - virtual void SetDrawingMode(int drawingmode); - virtual int GetDrawingMode(); - - virtual void SetCullFace(bool enable); - virtual void SetLines(bool enable); - - virtual MT_Matrix4x4 GetFrustumMatrix( - float left, float right, float bottom, float top, - float frustnear, float frustfar, - float focallength, bool perspective); - virtual MT_Matrix4x4 GetOrthoMatrix( - float left, float right, float bottom, float top, - float frustnear, float frustfar); - - virtual void SetSpecularity(float specX, float specY, float specZ, float specval); - virtual void SetShinyness(float shiny); - virtual void SetDiffuse(float difX, float difY, float difZ, float diffuse); - virtual void SetEmissive(float eX, float eY, float eZ, float e); - - virtual void SetAmbientColor(float color[3]); - virtual void SetAmbient(float factor); - - virtual void SetPolygonOffset(float mult, float add); - - virtual void FlushDebugShapes(SCA_IScene *scene); - - virtual void DrawDebugLine(SCA_IScene *scene, const MT_Vector3 &from,const MT_Vector3 &to, const MT_Vector3 &color) - { - OglDebugShape line; - line.m_type = OglDebugShape::LINE; - line.m_pos= from; - line.m_param = to; - line.m_color = color; - m_debugShapes[scene].push_back(line); - } - - virtual void DrawDebugCircle(SCA_IScene *scene, const MT_Vector3 ¢er, const MT_Scalar radius, - const MT_Vector3 &color, const MT_Vector3 &normal, int nsector) - { - OglDebugShape line; - line.m_type = OglDebugShape::CIRCLE; - line.m_pos= center; - line.m_param = normal; - line.m_color = color; - line.m_param2.x() = radius; - line.m_param2.y() = (float) nsector; - m_debugShapes[scene].push_back(line); - } - - // We store each debug shape by scene. - std::map<SCA_IScene *, std::vector<OglDebugShape> > m_debugShapes; - - virtual void SetTexCoordNum(int num); - virtual void SetAttribNum(int num); - virtual void SetTexCoord(TexCoGen coords, int unit); - virtual void SetAttrib(TexCoGen coords, int unit, int layer = 0); - - void TexCoord(const RAS_TexVert &tv); - - const MT_Matrix4x4 &GetViewMatrix() const; - const MT_Matrix4x4 &GetViewInvMatrix() const; - - virtual void EnableMotionBlur(float motionblurvalue); - virtual void DisableMotionBlur(); - virtual float GetMotionBlurValue() { return m_motionblurvalue; } - virtual int GetMotionBlurState() { return m_motionblur; } - virtual void SetMotionBlurState(int newstate) - { - if (newstate < 0) - m_motionblur = 0; - else if (newstate > 2) - m_motionblur = 2; - else - m_motionblur = newstate; - } - - virtual void SetAlphaBlend(int alphablend); - virtual void SetFrontFace(bool ccw); - - virtual void SetAnisotropicFiltering(short level); - virtual short GetAnisotropicFiltering(); - - virtual void SetMipmapping(MipmapOption val); - virtual MipmapOption GetMipmapping(); - - virtual void SetUsingOverrideShader(bool val); - virtual bool GetUsingOverrideShader(); - - /** - * Render Tools - */ - void EnableOpenGLLights(); - void DisableOpenGLLights(); - void ProcessLighting(bool uselights, const MT_Transform &viewmat); - - void RenderBox2D(int xco, int yco, int width, int height, float percentage); - void RenderText3D(int fontid, const char *text, int size, int dpi, - const float color[4], const float mat[16], float aspect); - void RenderText2D(RAS_TEXT_RENDER_MODE mode, const char *text, - int xco, int yco, int width, int height); - - void applyTransform(float *oglmatrix, int objectdrawmode); - - void PushMatrix(); - void PopMatrix(); - - /// \see KX_RayCast - bool RayHit(struct KX_ClientObjectInfo *client, class KX_RayCast *result, float *oglmatrix); - /// \see KX_RayCast - bool NeedRayCast(struct KX_ClientObjectInfo *, void *UNUSED(data)) { return true; } - - RAS_ILightObject* CreateLight(); - void AddLight(RAS_ILightObject* lightobject); - - void RemoveLight(RAS_ILightObject* lightobject); - int ApplyLights(int objectlayer, const MT_Transform& viewmat); - - void MotionBlur(); - - void SetClientObject(void *obj); - - void SetAuxilaryClientInfo(void *inf); - - /** - * Prints information about what the hardware supports. - */ - virtual void PrintHardwareInfo(); - -#ifdef WITH_CXX_GUARDEDALLOC - MEM_CXX_CLASS_ALLOC_FUNCS("GE:RAS_OpenGLRasterizer") -#endif -}; - -#endif /* __RAS_OPENGLRASTERIZER_H__ */ diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLSync.cpp b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLSync.cpp deleted file mode 100644 index 26b956cd74e..00000000000 --- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLSync.cpp +++ /dev/null @@ -1,82 +0,0 @@ -/* - * ***** 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. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2015, Blender Foundation - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): Blender Foundation. - * - * ***** END GPL LICENSE BLOCK ***** - */ - -#include "GPU_glew.h" - -#include <stdio.h> - -#include "RAS_OpenGLSync.h" - -RAS_OpenGLSync::RAS_OpenGLSync() - :m_sync(NULL) -{ -} - -RAS_OpenGLSync::~RAS_OpenGLSync() -{ - Destroy(); -} - -bool RAS_OpenGLSync::Create(RAS_SYNC_TYPE type) -{ - if (m_sync) { - printf("RAS_OpenGLSync::Create(): sync already exists, destroy first\n"); - return false; - } - if (type != RAS_SYNC_TYPE_FENCE) { - printf("RAS_OpenGLSync::Create(): only RAS_SYNC_TYPE_FENCE are currently supported\n"); - return false; - } - if (!GLEW_ARB_sync) { - printf("RAS_OpenGLSync::Create(): ARB_sync extension is needed to create sync object\n"); - return false; - } - m_sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); - if (!m_sync) { - printf("RAS_OpenGLSync::Create(): glFenceSync() failed"); - return false; - } - return true; -} - -void RAS_OpenGLSync::Destroy() -{ - if (m_sync) { - glDeleteSync(m_sync); - m_sync = NULL; - } -} - -void RAS_OpenGLSync::Wait() -{ - if (m_sync) { - // this is needed to ensure that the sync is in the GPU - glFlush(); - // block until the operation have completed - glWaitSync(m_sync, 0, GL_TIMEOUT_IGNORED); - } -} diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLSync.h b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLSync.h deleted file mode 100644 index 4ba96903856..00000000000 --- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLSync.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * ***** 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. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2015, Blender Foundation - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): Blender Foundation. - * - * ***** END GPL LICENSE BLOCK ***** - */ - -#ifndef __RAS_OPENGLSYNC__ -#define __RAS_OPENGLSYNC__ - - -#include "RAS_ISync.h" - -struct __GLsync; - -class RAS_OpenGLSync : public RAS_ISync -{ -private: - struct __GLsync *m_sync; - -public: - RAS_OpenGLSync(); - ~RAS_OpenGLSync(); - - virtual bool Create(RAS_SYNC_TYPE type); - virtual void Destroy(); - virtual void Wait(); -}; - -#endif /* __RAS_OPENGLSYNC__ */ diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVA.cpp b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVA.cpp deleted file mode 100644 index f980116f5f8..00000000000 --- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVA.cpp +++ /dev/null @@ -1,260 +0,0 @@ -/* - * ***** 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. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - */ - -#include "RAS_StorageVA.h" - -#include "GPU_glew.h" - -RAS_StorageVA::RAS_StorageVA(int *texco_num, RAS_IRasterizer::TexCoGen *texco, int *attrib_num, RAS_IRasterizer::TexCoGen *attrib, int *attrib_layer) : - m_drawingmode(RAS_IRasterizer::KX_TEXTURED), - m_texco_num(texco_num), - m_attrib_num(attrib_num), - m_last_texco_num(0), - m_last_attrib_num(0), - m_texco(texco), - m_attrib(attrib), - m_attrib_layer(attrib_layer) -{ -} - -RAS_StorageVA::~RAS_StorageVA() -{ -} - -bool RAS_StorageVA::Init() -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - return true; -} - -void RAS_StorageVA::Exit() -{ -} - -void RAS_StorageVA::IndexPrimitives(class RAS_MeshSlot& ms) -{ - static const GLsizei stride = sizeof(RAS_TexVert); - bool wireframe = m_drawingmode <= RAS_IRasterizer::KX_WIREFRAME, use_color_array = true; - RAS_MeshSlot::iterator it; - GLenum drawmode; - - if (!wireframe) - EnableTextures(true); - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_NORMAL_ARRAY); - - // use glDrawElements to draw each vertexarray - for (ms.begin(it); !ms.end(it); ms.next(it)) { - if (it.totindex == 0) - continue; - - // drawing mode - if (it.array->m_type == RAS_DisplayArray::TRIANGLE) - drawmode = GL_TRIANGLES; - else if (it.array->m_type == RAS_DisplayArray::QUAD) - drawmode = GL_QUADS; - else - drawmode = GL_LINES; - - // colors - if (drawmode != GL_LINES && !wireframe) { - if (ms.m_bObjectColor) { - const MT_Vector4& rgba = ms.m_RGBAcolor; - - glDisableClientState(GL_COLOR_ARRAY); - glColor4d(rgba[0], rgba[1], rgba[2], rgba[3]); - use_color_array = false; - } - else { - glColor4f(0.0f, 0.0f, 0.0f, 1.0f); - glEnableClientState(GL_COLOR_ARRAY); - use_color_array = true; - } - } - else - glColor4f(0.0f, 0.0f, 0.0f, 1.0f); - - glVertexPointer(3, GL_FLOAT, stride, it.vertex->getXYZ()); - glNormalPointer(GL_FLOAT, stride, it.vertex->getNormal()); - - if (!wireframe) { - TexCoordPtr(it.vertex); - if (use_color_array) - glColorPointer(4, GL_UNSIGNED_BYTE, stride, it.vertex->getRGBA()); - } - - // here the actual drawing takes places - glDrawElements(drawmode, it.totindex, GL_UNSIGNED_SHORT, it.index); - } - - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_NORMAL_ARRAY); - if (!wireframe) { - glDisableClientState(GL_COLOR_ARRAY); - EnableTextures(false); - } -} - -void RAS_StorageVA::TexCoordPtr(const RAS_TexVert *tv) -{ - /* note: this function must closely match EnableTextures to enable/disable - * the right arrays, otherwise coordinate and attribute pointers from other - * materials can still be used and cause crashes */ - int unit; - - if (GLEW_ARB_multitexture) - { - for (unit = 0; unit < *m_texco_num; unit++) - { - glClientActiveTextureARB(GL_TEXTURE0_ARB+unit); - switch (m_texco[unit]) { - case RAS_IRasterizer::RAS_TEXCO_ORCO: - case RAS_IRasterizer::RAS_TEXCO_GLOB: - glTexCoordPointer(3, GL_FLOAT, sizeof(RAS_TexVert),tv->getXYZ()); - break; - case RAS_IRasterizer::RAS_TEXCO_UV: - glTexCoordPointer(2, GL_FLOAT, sizeof(RAS_TexVert),tv->getUV(unit)); - break; - case RAS_IRasterizer::RAS_TEXCO_NORM: - glTexCoordPointer(3, GL_FLOAT, sizeof(RAS_TexVert),tv->getNormal()); - break; - case RAS_IRasterizer::RAS_TEXTANGENT: - glTexCoordPointer(4, GL_FLOAT, sizeof(RAS_TexVert),tv->getTangent()); - break; - default: - break; - } - } - - glClientActiveTextureARB(GL_TEXTURE0_ARB); - } - - if (GLEW_ARB_vertex_program) { - for (unit = 0; unit < *m_attrib_num; unit++) { - switch (m_attrib[unit]) { - case RAS_IRasterizer::RAS_TEXCO_ORCO: - case RAS_IRasterizer::RAS_TEXCO_GLOB: - glVertexAttribPointerARB(unit, 3, GL_FLOAT, GL_FALSE, sizeof(RAS_TexVert), tv->getXYZ()); - break; - case RAS_IRasterizer::RAS_TEXCO_UV: - glVertexAttribPointerARB(unit, 2, GL_FLOAT, GL_FALSE, sizeof(RAS_TexVert), tv->getUV(m_attrib_layer[unit])); - break; - case RAS_IRasterizer::RAS_TEXCO_NORM: - glVertexAttribPointerARB(unit, 3, GL_FLOAT, GL_FALSE, sizeof(RAS_TexVert), tv->getNormal()); - break; - case RAS_IRasterizer::RAS_TEXTANGENT: - glVertexAttribPointerARB(unit, 4, GL_FLOAT, GL_FALSE, sizeof(RAS_TexVert), tv->getTangent()); - break; - case RAS_IRasterizer::RAS_TEXCO_VCOL: - glVertexAttribPointerARB(unit, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(RAS_TexVert), tv->getRGBA()); - break; - default: - break; - } - } - } -} - -void RAS_StorageVA::EnableTextures(bool enable) -{ - RAS_IRasterizer::TexCoGen *texco, *attrib; - int unit, texco_num, attrib_num; - - /* we cache last texcoords and attribs to ensure we disable the ones that - * were actually last set */ - if (enable) { - texco = m_texco; - texco_num = *m_texco_num; - attrib = m_attrib; - attrib_num = *m_attrib_num; - - memcpy(m_last_texco, m_texco, sizeof(RAS_IRasterizer::TexCoGen)*(*m_texco_num)); - m_last_texco_num = *m_texco_num; - memcpy(m_last_attrib, m_attrib, sizeof(RAS_IRasterizer::TexCoGen)*(*m_attrib_num)); - m_last_attrib_num = *m_attrib_num; - } - else { - texco = m_last_texco; - texco_num = m_last_texco_num; - attrib = m_last_attrib; - attrib_num = m_last_attrib_num; - } - - if (GLEW_ARB_multitexture) { - for (unit = 0; unit < texco_num; unit++) { - glClientActiveTextureARB(GL_TEXTURE0_ARB + unit); - - switch (texco[unit]) { - case RAS_IRasterizer::RAS_TEXCO_ORCO: - case RAS_IRasterizer::RAS_TEXCO_GLOB: - case RAS_IRasterizer::RAS_TEXCO_UV: - case RAS_IRasterizer::RAS_TEXCO_NORM: - case RAS_IRasterizer::RAS_TEXTANGENT: - if (enable) glEnableClientState(GL_TEXTURE_COORD_ARRAY); - else glDisableClientState(GL_TEXTURE_COORD_ARRAY); - break; - default: - glDisableClientState(GL_TEXTURE_COORD_ARRAY); - break; - } - } - - glClientActiveTextureARB(GL_TEXTURE0_ARB); - } - else { - if (texco_num) { - if (enable) glEnableClientState(GL_TEXTURE_COORD_ARRAY); - else glDisableClientState(GL_TEXTURE_COORD_ARRAY); - } - } - - if (GLEW_ARB_vertex_program) { - for (unit = 0; unit < attrib_num; unit++) { - switch (attrib[unit]) { - case RAS_IRasterizer::RAS_TEXCO_ORCO: - case RAS_IRasterizer::RAS_TEXCO_GLOB: - case RAS_IRasterizer::RAS_TEXCO_UV: - case RAS_IRasterizer::RAS_TEXCO_NORM: - case RAS_IRasterizer::RAS_TEXTANGENT: - case RAS_IRasterizer::RAS_TEXCO_VCOL: - if (enable) glEnableVertexAttribArrayARB(unit); - else glDisableVertexAttribArrayARB(unit); - break; - default: - glDisableVertexAttribArrayARB(unit); - break; - } - } - } - - if (!enable) { - m_last_texco_num = 0; - m_last_attrib_num = 0; - } -} - diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVA.h b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVA.h deleted file mode 100644 index a5a3170ed77..00000000000 --- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVA.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * ***** 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. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - */ - -#ifndef __KX_VERTEXARRAYSTORAGE -#define __KX_VERTEXARRAYSTORAGE - -#include "RAS_IStorage.h" -#include "RAS_IRasterizer.h" - -#include "RAS_OpenGLRasterizer.h" - -class RAS_StorageVA : public RAS_IStorage -{ - -public: - RAS_StorageVA(int *texco_num, RAS_IRasterizer::TexCoGen *texco, int *attrib_num, RAS_IRasterizer::TexCoGen *attrib, int *attrib_layer); - virtual ~RAS_StorageVA(); - - virtual bool Init(); - virtual void Exit(); - - virtual void IndexPrimitives(RAS_MeshSlot& ms); - - virtual void SetDrawingMode(int drawingmode) {m_drawingmode = drawingmode;}; - -protected: - int m_drawingmode; - - int* m_texco_num; - int* m_attrib_num; - - int m_last_texco_num; - int m_last_attrib_num; - - RAS_IRasterizer::TexCoGen* m_texco; - RAS_IRasterizer::TexCoGen* m_attrib; - int* m_attrib_layer; - - RAS_IRasterizer::TexCoGen m_last_texco[RAS_MAX_TEXCO]; - RAS_IRasterizer::TexCoGen m_last_attrib[RAS_MAX_ATTRIB]; - - virtual void EnableTextures(bool enable); - virtual void TexCoordPtr(const RAS_TexVert *tv); - - -#ifdef WITH_CXX_GUARDEDALLOC -public: - void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_StorageVA"); } - void operator delete( void *mem ) { MEM_freeN(mem); } -#endif -}; - -#endif //__KX_VERTEXARRAYSTORAGE diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVBO.cpp b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVBO.cpp deleted file mode 100644 index 4ba5882a46e..00000000000 --- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVBO.cpp +++ /dev/null @@ -1,227 +0,0 @@ -/* - * ***** 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. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - */ - -#include "RAS_StorageVBO.h" -#include "RAS_MeshObject.h" - -#include "GPU_glew.h" - -VBO::VBO(RAS_DisplayArray *data, unsigned int indices) -{ - this->data = data; - this->size = data->m_vertex.size(); - this->indices = indices; - this->stride = sizeof(RAS_TexVert); - - // Determine drawmode - if (data->m_type == data->QUAD) - this->mode = GL_QUADS; - else if (data->m_type == data->TRIANGLE) - this->mode = GL_TRIANGLES; - else - this->mode = GL_LINE; - - // Generate Buffers - glGenBuffersARB(1, &this->ibo); - glGenBuffersARB(1, &this->vbo_id); - - // Fill the buffers with initial data - UpdateIndices(); - UpdateData(); - - // Establish offsets - this->vertex_offset = (void*)(((RAS_TexVert*)0)->getXYZ()); - this->normal_offset = (void*)(((RAS_TexVert*)0)->getNormal()); - this->tangent_offset = (void*)(((RAS_TexVert*)0)->getTangent()); - this->color_offset = (void*)(((RAS_TexVert*)0)->getRGBA()); - this->uv_offset = (void*)(((RAS_TexVert*)0)->getUV(0)); -} - -VBO::~VBO() -{ - glDeleteBuffersARB(1, &this->ibo); - glDeleteBuffersARB(1, &this->vbo_id); -} - -void VBO::UpdateData() -{ - glBindBufferARB(GL_ARRAY_BUFFER_ARB, this->vbo_id); - glBufferData(GL_ARRAY_BUFFER, this->stride*this->size, &this->data->m_vertex[0], GL_STATIC_DRAW); -} - -void VBO::UpdateIndices() -{ - glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, this->ibo); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, data->m_index.size() * sizeof(GLushort), - &data->m_index[0], GL_STATIC_DRAW); -} - -void VBO::Draw(int texco_num, RAS_IRasterizer::TexCoGen* texco, int attrib_num, RAS_IRasterizer::TexCoGen* attrib, int *attrib_layer) -{ - int unit; - - // Bind buffers - glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, this->ibo); - glBindBufferARB(GL_ARRAY_BUFFER_ARB, this->vbo_id); - - // Vertexes - glEnableClientState(GL_VERTEX_ARRAY); - glVertexPointer(3, GL_FLOAT, this->stride, this->vertex_offset); - - // Normals - glEnableClientState(GL_NORMAL_ARRAY); - glNormalPointer(GL_FLOAT, this->stride, this->normal_offset); - - // Colors - glEnableClientState(GL_COLOR_ARRAY); - glColorPointer(4, GL_UNSIGNED_BYTE, this->stride, this->color_offset); - - for (unit = 0; unit < texco_num; ++unit) - { - glClientActiveTexture(GL_TEXTURE0_ARB + unit); - switch (texco[unit]) { - case RAS_IRasterizer::RAS_TEXCO_ORCO: - case RAS_IRasterizer::RAS_TEXCO_GLOB: - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glTexCoordPointer(3, GL_FLOAT, this->stride, this->vertex_offset); - break; - case RAS_IRasterizer::RAS_TEXCO_UV: - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glTexCoordPointer(2, GL_FLOAT, this->stride, (void*)((intptr_t)this->uv_offset+(sizeof(GLfloat)*2*unit))); - break; - case RAS_IRasterizer::RAS_TEXCO_NORM: - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glTexCoordPointer(3, GL_FLOAT, this->stride, this->normal_offset); - break; - case RAS_IRasterizer::RAS_TEXTANGENT: - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glTexCoordPointer(4, GL_FLOAT, this->stride, this->tangent_offset); - break; - default: - break; - } - } - glClientActiveTextureARB(GL_TEXTURE0_ARB); - - if (GLEW_ARB_vertex_program) - { - for (unit = 0; unit < attrib_num; ++unit) - { - switch (attrib[unit]) { - case RAS_IRasterizer::RAS_TEXCO_ORCO: - case RAS_IRasterizer::RAS_TEXCO_GLOB: - glVertexAttribPointerARB(unit, 3, GL_FLOAT, GL_FALSE, this->stride, this->vertex_offset); - glEnableVertexAttribArrayARB(unit); - break; - case RAS_IRasterizer::RAS_TEXCO_UV: - glVertexAttribPointerARB(unit, 2, GL_FLOAT, GL_FALSE, this->stride, (void*)((intptr_t)this->uv_offset+attrib_layer[unit]*sizeof(GLfloat)*2)); - glEnableVertexAttribArrayARB(unit); - break; - case RAS_IRasterizer::RAS_TEXCO_NORM: - glVertexAttribPointerARB(unit, 2, GL_FLOAT, GL_FALSE, stride, this->normal_offset); - glEnableVertexAttribArrayARB(unit); - break; - case RAS_IRasterizer::RAS_TEXTANGENT: - glVertexAttribPointerARB(unit, 4, GL_FLOAT, GL_FALSE, this->stride, this->tangent_offset); - glEnableVertexAttribArrayARB(unit); - break; - case RAS_IRasterizer::RAS_TEXCO_VCOL: - glVertexAttribPointerARB(unit, 4, GL_UNSIGNED_BYTE, GL_TRUE, this->stride, this->color_offset); - glEnableVertexAttribArrayARB(unit); - default: - break; - } - } - } - - glDrawElements(this->mode, this->indices, GL_UNSIGNED_SHORT, 0); - - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_NORMAL_ARRAY); - glDisableClientState(GL_COLOR_ARRAY); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); - - if (GLEW_ARB_vertex_program) - { - for (int i = 0; i < attrib_num; ++i) - glDisableVertexAttribArrayARB(i); - } - - glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); - glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0); -} - -RAS_StorageVBO::RAS_StorageVBO(int *texco_num, RAS_IRasterizer::TexCoGen *texco, int *attrib_num, RAS_IRasterizer::TexCoGen *attrib, int *attrib_layer): - m_drawingmode(RAS_IRasterizer::KX_TEXTURED), - m_texco_num(texco_num), - m_attrib_num(attrib_num), - m_texco(texco), - m_attrib(attrib), - m_attrib_layer(attrib_layer) -{ -} - -RAS_StorageVBO::~RAS_StorageVBO() -{ -} - -bool RAS_StorageVBO::Init() -{ - return true; -} - -void RAS_StorageVBO::Exit() -{ - VBOMap::iterator it = m_vbo_lookup.begin(); - while (it != m_vbo_lookup.end()) { - delete it->second; - ++it; - } - m_vbo_lookup.clear(); -} - -void RAS_StorageVBO::IndexPrimitives(RAS_MeshSlot& ms) -{ - RAS_MeshSlot::iterator it; - VBO *vbo; - - for (ms.begin(it); !ms.end(it); ms.next(it)) - { - vbo = m_vbo_lookup[it.array]; - - if (vbo == 0) - m_vbo_lookup[it.array] = vbo = new VBO(it.array, it.totindex); - - // Update the vbo - if (ms.m_mesh->MeshModified()) - { - vbo->UpdateData(); - } - - vbo->Draw(*m_texco_num, m_texco, *m_attrib_num, m_attrib, m_attrib_layer); - } -} diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVBO.h b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVBO.h deleted file mode 100644 index c82b6a3206d..00000000000 --- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVBO.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - * ***** 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. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - */ - -#ifndef __KX_VERTEXBUFFEROBJECTSTORAGE -#define __KX_VERTEXBUFFEROBJECTSTORAGE - -#include <map> -#include "GPU_glew.h" - -#include "RAS_IStorage.h" -#include "RAS_IRasterizer.h" - -#include "RAS_OpenGLRasterizer.h" - -class VBO -{ -public: - VBO(RAS_DisplayArray *data, unsigned int indices); - ~VBO(); - - void Draw(int texco_num, RAS_IRasterizer::TexCoGen* texco, int attrib_num, RAS_IRasterizer::TexCoGen* attrib, int *attrib_layer); - - void UpdateData(); - void UpdateIndices(); -private: - RAS_DisplayArray* data; - GLuint size; - GLuint stride; - GLuint indices; - GLenum mode; - GLuint ibo; - GLuint vbo_id; - - void* vertex_offset; - void* normal_offset; - void* color_offset; - void* tangent_offset; - void* uv_offset; -}; - -typedef std::map<RAS_DisplayArray*, VBO*> VBOMap; - -class RAS_StorageVBO : public RAS_IStorage -{ - -public: - RAS_StorageVBO(int *texco_num, RAS_IRasterizer::TexCoGen *texco, int *attrib_num, RAS_IRasterizer::TexCoGen *attrib, int *attrib_layer); - virtual ~RAS_StorageVBO(); - - virtual bool Init(); - virtual void Exit(); - - virtual void IndexPrimitives(RAS_MeshSlot& ms); - - virtual void SetDrawingMode(int drawingmode) {m_drawingmode = drawingmode;}; - -protected: - int m_drawingmode; - - int* m_texco_num; - int* m_attrib_num; - - RAS_IRasterizer::TexCoGen* m_texco; - RAS_IRasterizer::TexCoGen* m_attrib; - int* m_attrib_layer; - - VBOMap m_vbo_lookup; - -#ifdef WITH_CXX_GUARDEDALLOC -public: - void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_StorageVA"); } - void operator delete( void *mem ) { MEM_freeN(mem); } -#endif -}; - -#endif //__KX_VERTEXBUFFEROBJECTSTORAGE |