Paste Code
Paste Blends
Paste Images
Index: source/blender/makesdna/DNA_scene_types.h
===================================================================
--- source/blender/makesdna/DNA_scene_types.h (revision 18000)
+++ source/blender/makesdna/DNA_scene_types.h (working copy)
@@ -310,6 +310,11 @@
/* cineon */
short cineonwhite, cineonblack;
float cineongamma;
+
+ /* Dome variables */
+ float domesize;
+ short domeres, pad0;
+
} RenderData;

/* control render convert and shading engine */
Index: source/blender/src/buttons_scene.c
===================================================================
--- source/blender/src/buttons_scene.c (revision 18000)
+++ source/blender/src/buttons_scene.c (working copy)
@@ -1820,6 +1820,7 @@
* RAS_STEREO_ANAGLYPH 5
* RAS_STEREO_SIDEBYSIDE 6
* RAS_STEREO_VINTERLACE 7
+ * RAS_STEREO_DOME 8
*/
uiBlockBeginAlign(block);
uiDefButS(block, ROW, 0, "No Stereo", xco, yco-=30, 88, 19, &(G.scene->r.stereomode), 7.0, 1.0, 0, 0, "Disables stereo");
@@ -1828,7 +1829,10 @@
uiDefButS(block, ROW, 0, "Anaglyph", xco-=180, yco-=21, 88, 19, &(G.scene->r.stereomode), 7.0, 5.0, 0, 0, "Enables anaglyph (Red-Blue) stereo method");
uiDefButS(block, ROW, 0, "Side by Side", xco+=90, yco, 88, 19, &(G.scene->r.stereomode), 7.0, 6.0, 0, 0, "Enables side by side left and right images");
uiDefButS(block, ROW, 0, "V Interlace", xco+=90, yco, 88, 19, &(G.scene->r.stereomode), 7.0, 7.0, 0, 0, "Enables interlaced vertical strips for autostereo display");
-
+ uiDefButS(block, ROW, 0, "Dome 180º", xco-=180, yco-=21, 88, 19, &(G.scene->r.stereomode), 7.0, 8.0, 0, 0, "Enables Dome View");
+ uiDefButF(block, NUM, 0, "Size:", xco+=90, yco, 88, 19, &G.scene->r.domesize, 1.0, 10.0, 0, 0, "Size of the ENV MAP faces");
+ uiDefButS(block, NUM, 0, "Res:", xco+=90, yco, 88, 19, &G.scene->r.domeres, 1.0, 5.0, 1.0, 0, "Resolution of the dome - 1 to 50");
+
uiBlockEndAlign(block);

uiBlockSetDirection(block, UI_TOP);
Index: source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
===================================================================
--- source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp (revision 18000)
+++ source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp (working copy)
@@ -366,6 +366,12 @@
initMathutils();
initVideoTexture();

+ //initialize Dome Settings
+ if(blscene->r.stereomode == RAS_IRasterizer::RAS_STEREO_DOME){
+ ketsjiengine->tmpInitDome();
+ ketsjiengine->InitDome();
+ }
+
if (sceneconverter)
{
// convert and add scene
@@ -403,7 +409,10 @@
if (render)
{
// render the frame
- ketsjiengine->Render();
+ if(blscene->r.stereomode == RAS_IRasterizer::RAS_STEREO_DOME)
+ RenderDome();
+ else
+ ketsjiengine->Render();
}

// test for the ESC key
@@ -430,6 +439,9 @@
printf("\nBlender Game Engine Finished\n\n");
exitstring = ketsjiengine->GetExitString();

+ //finalize Dome Settings
+ if(blscene->r.stereomode == RAS_IRasterizer::RAS_STEREO_DOME)
+ ketsjiengine->EndDome();

// when exiting the mainloop

Index: source/gameengine/Ketsji/KX_Camera.cpp
===================================================================
--- source/gameengine/Ketsji/KX_Camera.cpp (revision 18000)
+++ source/gameengine/Ketsji/KX_Camera.cpp (working copy)
@@ -425,7 +425,12 @@
{
return m_frustum_culling;
}
-
+
+void KX_Camera::SetFrustumCulling(bool frustum)
+{
+ m_frustum_culling = frustum;
+}
+
void KX_Camera::EnableViewport(bool viewport)
{
m_camdata.m_viewport = viewport;
Index: source/gameengine/Ketsji/KX_Camera.h
===================================================================
--- source/gameengine/Ketsji/KX_Camera.h (revision 18000)
+++ source/gameengine/Ketsji/KX_Camera.h (working copy)
@@ -220,6 +220,11 @@
* Gets this camera's culling status.
*/
bool GetFrustumCulling() const;
+
+ /**
+ * Sets this camera's culling status. (for debug only)
+ */
+ void SetFrustumCulling(bool frustum);

/**
* Sets this camera's viewport status.
Index: source/gameengine/Ketsji/KX_Dome.cpp
===================================================================
--- source/gameengine/Ketsji/KX_Dome.cpp (revision 0)
+++ source/gameengine/Ketsji/KX_Dome.cpp (revision 0)
@@ -0,0 +1,1346 @@
+/* $Id$
+-----------------------------------------------------------------------------
+
+This program is free software; you can redistribute it and/or modify it under
+the terms of the GNU Lesser 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 Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along with
+this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+Place - Suite 330, Boston, MA 02111-1307, USA, or go to
+http://www.gnu.org/copyleft/lesser.txt.
+-----------------------------------------------------------------------------
+*/
+
+// implementation
+
+#include <PyObjectPlus.h>
+#include <structmember.h>
+#include <float.h>
+#include <math.h>
+
+
+#include <BIF_gl.h>
+
+#include "KX_PythonInit.h"
+#include "DNA_scene_types.h"
+#include "RAS_CameraData.h"
+//#include "RAS_MeshObject.h"
+#include "BLI_arithb.h"
+
+#include "KX_Dome.h"
+#include "GL/glew.h"
+#include "GL/glu.h"
+
+//#include "ImageBase.h"
+//#include "BlendType.h"
+//#include "Exception.h"
+//#include "Texture.h"
+
+// constructor
+KX_Dome::KX_Dome (
+ RAS_ICanvas* canvas,
+ /// rasterizer
+ RAS_IRasterizer* rasterizer,
+ /// render tools
+ RAS_IRenderTools* rendertools,
+ /// engine
+ KX_KetsjiEngine* engine
+
+)://KX_Scene * scene, KX_Camera * camera) :
+// ImageViewport(),
+ // m_render(true),
+ // m_scene(scene),
+ // m_camera(camera),
+// m_owncamera(false),
+// m_observer(NULL),
+// m_mirror(NULL),
+ m_canvas(canvas),
+ m_rasterizer(rasterizer),
+ m_rendertools(rendertools),
+ m_engine(engine),
+ m_clip(100.f)
+{
+ // initialize background colour
+ setBackground(0, 0, 255, 255);
+ // retrieve rendering objects
+ // m_engine = KX_GetActiveEngine();
+// m_rasterizer = m_engine->GetRasterizer();
+// m_canvas = m_engine->GetCanvas();
+// m_rendertools = m_engine->GetRenderTools();
+ cubetop.resize(1);
+ cubebottom.resize(1);
+ cubeleft.resize(2);
+ cuberight.resize(2);
+}
+
+static GLenum DomeFaceTarget [6] = {
+ GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
+ GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
+ GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
+ GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
+ GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
+ GL_TEXTURE_CUBE_MAP_POSITIVE_X
+};
+
+//unsigned int m_DomeFaces;
+unsigned int m_DomeFacesTmp[6]; // tmp to store a single render image
+
+int m_DomeFacesize=512;
+
+// destructor
+KX_Dome::~KX_Dome (void)
+{
+// if (m_owncamera)
+// m_camera->Release();
+/*
+ for (int i=0;i<nfacestop;i++){
+ for (int j=0;j<3;j++){
+ for (int k=0;k<3;k++){
+ printf("cubetop[%1d].verts[%1d][%1d]: %2.4f\n", i, j, k, cubetop[i].verts[j][k]);
+// cout << cubetop[i].verts[j][k] << std::endl;
+ }
+ }
+ }
+ */
+}
+
+
+// set background color/
+void KX_Dome::setBackground (int red, int green, int blue, int alpha)
+{
+ m_background[0] = (red < 0) ? 0.f : (red > 255) ? 1.f : float(red)/255.f;
+ m_background[1] = (green < 0) ? 0.f : (green > 255) ? 1.f : float(green)/255.f;
+ m_background[2] = (blue < 0) ? 0.f : (blue > 255) ? 1.f : float(blue)/255.f;
+ m_background[3] = (alpha < 0) ? 0.f : (alpha > 255) ? 1.f : float(alpha)/255.f;
+}
+
+/* my code ::: */
+
+void KX_Dome::Dome_CubeCreate(int cubeRes){
+ int i,j;
+
+ //creating faces for the env mapcube 180º Dome
+ // Top Face - just a triangle
+ cubetop[0].verts[0][0] = -sqrt(2.0) / 2.0;
+ cubetop[0].verts[0][1] = 0.0;
+ cubetop[0].verts[0][2] = 0.5;
+ cubetop[0].u[0] = 0.0;
+ cubetop[0].v[0] = 1.0;
+
+ cubetop[0].verts[1][0] = 0.0;
+ cubetop[0].verts[1][1] = sqrt(2.0) / 2.0;
+ cubetop[0].verts[1][2] = 0.5;
+ cubetop[0].u[1] = 0.0;
+ cubetop[0].v[1] = 0.0;
+
+ cubetop[0].verts[2][0] = sqrt(2.0) / 2.0;
+ cubetop[0].verts[2][1] = 0.0;
+ cubetop[0].verts[2][2] = 0.5;
+ cubetop[0].u[2] = 1.0;
+ cubetop[0].v[2] = 0.0;
+
+ nfacestop = 1;
+
+ /* Bottom face - just a triangle */
+ cubebottom[0].verts[0][0] = -sqrt(2.0) / 2.0;
+ cubebottom[0].verts[0][1] = 0;
+ cubebottom[0].verts[0][2] = -0.5;
+ cubebottom[0].u[0] = 1;
+ cubebottom[0].v[0] = 0;
+
+ cubebottom[0].verts[1][0] = sqrt(2.0) / 2.0;
+ cubebottom[0].verts[1][1] = 0;
+ cubebottom[0].verts[1][2] = -0.5;
+ cubebottom[0].u[1] = 0;
+ cubebottom[0].v[1] = 1;
+
+ cubebottom[0].verts[2][0] = 0;
+ cubebottom[0].verts[2][1] = sqrt(2.0) / 2.0;
+ cubebottom[0].verts[2][2] = -0.5;
+ cubebottom[0].u[2] = 0;
+ cubebottom[0].v[2] = 0;
+
+ nfacesbottom = 1;
+
+ /* Left face - two triangles */
+
+ cubeleft[0].verts[0][0] = -sqrt(2.0) / 2.0;
+ cubeleft[0].verts[0][1] = 0;
+ cubeleft[0].verts[0][2] = -0.5;
+ cubeleft[0].u[0] = 0;
+ cubeleft[0].v[0] = 0;
+
+ cubeleft[0].verts[1][0] = 0;
+ cubeleft[0].verts[1][1] = sqrt(2.0) / 2.0;
+ cubeleft[0].verts[1][2] = -0.5;
+ cubeleft[0].u[1] = 1;
+ cubeleft[0].v[1] = 0;
+
+ cubeleft[0].verts[2][0] = -sqrt(2.0) / 2.0;
+ cubeleft[0].verts[2][1] = 0;
+ cubeleft[0].verts[2][2] = 0.5;
+ cubeleft[0].u[2] = 0;
+ cubeleft[0].v[2] = 1;
+
+ cubeleft[1].verts[0][0] = -sqrt(2.0) / 2.0;
+ cubeleft[1].verts[0][1] = 0;
+ cubeleft[1].verts[0][2] = 0.5;
+ cubeleft[1].u[0] = 0;
+ cubeleft[1].v[0] = 1;
+
+ cubeleft[1].verts[1][0] = 0;
+ cubeleft[1].verts[1][1] = sqrt(2.0) / 2.0;
+ cubeleft[1].verts[1][2] = -0.5;
+ cubeleft[1].u[1] = 1;
+ cubeleft[1].v[1] = 0;
+
+ cubeleft[1].verts[2][0] = 0;
+ cubeleft[1].verts[2][1] = sqrt(2.0) / 2.0;
+ cubeleft[1].verts[2][2] = 0.5;
+ cubeleft[1].u[2] = 1;
+ cubeleft[1].v[2] = 1;
+
+ nfacesleft = 2;
+
+ /* Right face - two triangles */
+ cuberight[0].verts[0][0] = 0;
+ cuberight[0].verts[0][1] = sqrt(2.0) / 2.0;
+ cuberight[0].verts[0][2] = -0.5;
+ cuberight[0].u[0] = 0;
+ cuberight[0].v[0] = 0;
+
+ cuberight[0].verts[1][0] = sqrt(2.0) / 2.0;
+ cuberight[0].verts[1][1] = 0;
+ cuberight[0].verts[1][2] = -0.5;
+ cuberight[0].u[1] = 1;
+ cuberight[0].v[1] = 0;
+
+ cuberight[0].verts[2][0] = sqrt(2.0) / 2.0;
+ cuberight[0].verts[2][1] = 0;
+ cuberight[0].verts[2][2] = 0.5;
+ cuberight[0].u[2] = 1;
+ cuberight[0].v[2] = 1;
+
+ cuberight[1].verts[0][0] = 0;
+ cuberight[1].verts[0][1] = sqrt(2.0) / 2.0;
+ cuberight[1].verts[0][2] = -0.5;
+ cuberight[1].u[0] = 0;
+ cuberight[1].v[0] = 0;
+
+ cuberight[1].verts[1][0] = sqrt(2.0) / 2.0;
+ cuberight[1].verts[1][1] = 0;
+ cuberight[1].verts[1][2] = 0.5;
+ cuberight[1].u[1] = 1;
+ cuberight[1].v[1] = 1;
+
+ cuberight[1].verts[2][0] = 0;
+ cuberight[1].verts[2][1] = sqrt(2.0) / 2.0;
+ cuberight[1].verts[2][2] = 0.5;
+ cuberight[1].u[2] = 0;
+ cuberight[1].v[2] = 1;
+
+ nfacesright = 2;
+
+ //Refine a triangular mesh by bisecting each edge forms 3 new triangles for each existing triangle on each iteration
+ //Could be made more efficient for drawing if the triangles were ordered in a fan or strip!
+
+// cubeRes = 3;
+ for(i=0;i<cubeRes;i++){
+ cubetop.resize(4*nfacestop);
+ Dome_CubeSplitFace(cubetop,&nfacestop);
+ cubebottom.resize(4*nfacesbottom);
+ Dome_CubeSplitFace(cubebottom,&nfacesbottom);
+ cubeleft.resize(4*nfacesleft);
+ Dome_CubeSplitFace(cubeleft,&nfacesleft);
+ cuberight.resize(4*nfacesright);
+ Dome_CubeSplitFace(cuberight,&nfacesright);
+ }
+
+ // Turn into a hemisphere
+ for(j=0;j<3;j++){
+ for(i=0;i<nfacestop;i++)
+ cubetop[i].verts[j].normalize();
+ for(i=0;i<nfacesbottom;i++)
+ cubebottom[i].verts[j].normalize();
+ for(i=0;i<nfacesleft;i++)
+ cubeleft[i].verts[j].normalize();
+ for(i=0;i<nfacesright;i++)
+ cuberight[i].verts[j].normalize();
+ }
+
+ //flatten onto xz plane
+ for(j=0;j<3;j++){
+ for(i=0;i<nfacestop;i++)
+ Dome_CubeFlatten(cubetop[i].verts[j]);
+ for(i=0;i<nfacesbottom;i++)
+ Dome_CubeFlatten(cubebottom[i].verts[j]);
+ for(i=0;i<nfacesleft;i++)
+ Dome_CubeFlatten(cubeleft[i].verts[j]);
+ for(i=0;i<nfacesright;i++)
+ Dome_CubeFlatten(cuberight[i].verts[j]);
+ }
+}
+
+void KX_Dome::Dome_CubeSplitFace(vector <DomeFace>& face, int *nfaces)
+{
+ int i;
+ int n1, n2;
+
+ n1 = n2 = *nfaces;
+
+ for(i=0;i<n1;i++){
+
+ face[n2].verts[0] = (face[i].verts[0] + face[i].verts[1]) /2;
+ face[n2].verts[1] = face[i].verts[1];
+ face[n2].verts[2] = (face[i].verts[1] + face[i].verts[2]) /2;
+ face[n2].u[0] = (face[i].u[0] + face[i].u[1]) /2;
+ face[n2].u[1] = face[i].u[1];
+ face[n2].u[2] = (face[i].u[1] + face[i].u[2]) /2;
+ face[n2].v[0] = (face[i].v[0] + face[i].v[1]) /2;
+ face[n2].v[1] = face[i].v[1];
+ face[n2].v[2] = (face[i].v[1] + face[i].v[2]) /2;
+
+ face[n2+1].verts[0] = (face[i].verts[1] + face[i].verts[2]) /2;
+ face[n2+1].verts[1] = face[i].verts[2];
+ face[n2+1].verts[2] = (face[i].verts[2] + face[i].verts[0]) /2;
+ face[n2+1].u[0] = (face[i].u[1] + face[i].u[2]) /2;
+ face[n2+1].u[1] = face[i].u[2];
+ face[n2+1].u[2] = (face[i].u[2] + face[i].u[0]) /2;
+ face[n2+1].v[0] = (face[i].v[1] + face[i].v[2]) /2;
+ face[n2+1].v[1] = face[i].v[2];
+ face[n2+1].v[2] = (face[i].v[2] + face[i].v[0]) /2;
+
+ face[n2+2].verts[0] = (face[i].verts[0] + face[i].verts[1]) /2;
+ face[n2+2].verts[1] = (face[i].verts[1] + face[i].verts[2]) /2;
+ face[n2+2].verts[2] = (face[i].verts[2] + face[i].verts[0]) /2;
+ face[n2+2].u[0] = (face[i].u[0] + face[i].u[1]) /2;
+ face[n2+2].u[1] = (face[i].u[1] + face[i].u[2]) /2;
+ face[n2+2].u[2] = (face[i].u[2] + face[i].u[0]) /2;
+ face[n2+2].v[0] = (face[i].v[0] + face[i].v[1]) /2;
+ face[n2+2].v[1] = (face[i].v[1] + face[i].v[2]) /2;
+ face[n2+2].v[2] = (face[i].v[2] + face[i].v[0]) /2;
+
+ //face[i].verts[0] = face[i].verts[0] ;
+ face[i].verts[1] = (face[i].verts[0] + face[i].verts[1]) /2;
+ face[i].verts[2] = (face[i].verts[0] + face[i].verts[2]) /2;
+ //face[i].u[0] = face[i].u[0];
+ face[i].u[1] = (face[i].u[0] + face[i].u[1]) /2;
+ face[i].u[2] = (face[i].u[0] + face[i].u[2]) /2;
+ //face[i].v[0] = face[i].v[0] ;
+ face[i].v[1] = (face[i].v[0] + face[i].v[1]) /2;
+ face[i].v[2] = (face[i].v[0] + face[i].v[2]) /2;
+
+ n2 += 3; // number of faces
+ }
+ *nfaces = n2;
+}
+
+void KX_Dome::Dome_CubeFlatten(MT_Vector3 & verts){
+ double phi, r;
+
+ r = atan2(sqrt(verts[0]*verts[0] + verts[2]*verts[2]), verts[1]);
+ r /= (MT_PI / 2);
+ printf("R= %2.4f\n", r);
+
+ phi = atan2(verts[2], verts[0]);
+ printf("Phi= %2.4f\n", phi);
+
+ verts[0] = r * cos(phi);
+ verts[1] = 0; // zed, I probably will need to change it to work with BGE axis
+ verts[2] = r * sin(phi);
+}
+
+void DrawDomeVert(float theta, float phi)
+{
+ float r = 1.0f;
+ float x, y, z, nx, ny, nz;
+ float dtor = 3.1416/180.0;
+ float ztrans = 1.0;
+
+ nx = sin(dtor * theta) * cos(dtor * phi);
+ ny = sin(dtor * phi);
+ nz = cos(dtor * theta) * cos(dtor * phi);
+ glNormal3f(nx, ny, nz);
+
+ x = r * sin(dtor * theta) * cos(dtor * phi);
+ y = r * sin(dtor * phi);
+ z = -ztrans + r * cos(dtor * theta) * cos(dtor * phi);
+ glVertex4f(x, y, z, 1.0);
+}
+
+void DrawDomeSphere(float del)
+{
+ float phi, phi2, theta;
+
+ glColor4f(1.0, 1.0, 1.0, 1.0);
+ // glBegin(GL_TRIANGLE_STRIP);
+ for (phi = -90.0f; phi < 90.0f; phi += del) {
+ glBegin(GL_TRIANGLE_STRIP);
+
+ phi2 = phi + del;
+
+ for (theta = -90.0f; theta <= 90.0f; theta += del) {
+ DrawDomeVert(theta, phi);
+ DrawDomeVert(theta, phi2);
+ }
+ glEnd();
+ }
+// glEnd();
+}
+/*
+void KX_Dome::Dome_CubeDraw(unsigned int viewport[4], int m_DomeFaces)
+{
+ //Skybox => 4 images
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ // Making the viewport always square
+
+ int can_width = viewport[2];
+ int can_height = viewport[3];
+
+ float ortho_width, ortho_height = 1.0;
+
+ if (can_width < can_height){
+ ortho_width = 1.0;
+ ortho_height = (float)can_height/can_width;
+ }else{
+ ortho_width = (float)can_width/can_height;
+ ortho_height = 1.0;
+ }
+
+ glOrtho((-ortho_width), ortho_width, (-ortho_height), ortho_height, -20.0, 10.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glDisable(GL_DEPTH_TEST);
+ glPolygonMode(GL_FRONT, GL_FILL);
+ glShadeModel(GL_SMOOTH);
+ glDisable(GL_LIGHTING);
+
+ glBegin(GL_TRIANGLES);
+ glColor3f(0.0f ,0.0f, 1.0f);
+ glVertex3f( 0.0f, 0.5f, 4.0f);
+ glColor3f(0.0f ,0.5f, 0.0f);
+ glVertex3f(-0.5f,-0.5f, 4.0f);
+ glColor3f(1.0f ,0.0f, 0.0f);
+ glVertex3f( 0.5f,-0.5f, 4.0f);
+ glEnd();
+
+ glEnable(GL_TEXTURE_2D);
+
+// DomeFacesTmp[0] -> LEFT
+ glBindTexture(GL_TEXTURE_2D, m_DomeFaces);
+ glBegin(GL_QUADS);
+ glColor3f(1.0f ,1.0f, 1.0f);
+ glTexCoord2f(1.0,1.0);
+ glVertex3f( -0.05f, 0.3f, 3.0f);
+ glTexCoord2f(0.0,1.0);
+ glVertex3f(-0.65f,0.3f, 3.0f);
+ glTexCoord2f(0.0,0.0);
+ glVertex3f(-0.65f,-0.3f, 3.0f);
+ glTexCoord2f(1.0,0.0);
+ glVertex3f(-0.05f,-0.3f, 3.0f);
+ glEnd();
+
+// DomeFacesTmp[1] -> RIGHT
+ glBindTexture(GL_TEXTURE_2D, m_DomeFaces+1);
+ glBegin(GL_QUADS);
+ glColor3f(1.0f ,1.0f, 1.0f);
+ glTexCoord2f(1.0,1.0);
+ glVertex3f( 0.65f, 0.3f, 3.0f);
+ glTexCoord2f(0.0,1.0);
+ glVertex3f(0.05f,0.3f, 3.0f);
+ glTexCoord2f(0.0,0.0);
+ glVertex3f(0.05f,-0.3f, 3.0f);
+ glTexCoord2f(1.0,0.0);
+ glVertex3f( 0.65f,-0.3f, 3.0f);
+ glEnd();
+
+// DomeFacesTmp[2] -> TOP
+ glBindTexture(GL_TEXTURE_2D, m_DomeFaces+2);
+ glBegin(GL_QUADS);
+ glColor3f(1.0f ,1.0f, 1.0f);
+ glTexCoord2f(1.0,1.0);
+ glVertex3f( -0.05f, 0.95f, 3.0f);
+ glTexCoord2f(0.0,1.0);
+ glVertex3f(-0.65f,0.95f, 3.0f);
+ glTexCoord2f(0.0,0.0);
+ glVertex3f(-0.65f,0.35f, 3.0f);
+ glTexCoord2f(1.0,0.0);
+ glVertex3f(-0.05f,0.35f, 3.0f);
+ glEnd();
+
+// DomeFacesTmp[3] -> BOTTOM
+ glBindTexture(GL_TEXTURE_2D, m_DomeFaces+3);
+ glBegin(GL_QUADS);
+ glColor3f(1.0f ,1.0f, 1.0f);
+ glTexCoord2f(1.0,1.0);
+ glVertex3f( -0.05f, -0.35f, 3.0f);
+ glTexCoord2f(0.0,1.0);
+ glVertex3f(-0.65f,-0.35f, 3.0f);
+ glTexCoord2f(0.0,0.0);
+ glVertex3f(-0.65f,-0.95f, 3.0f);
+ glTexCoord2f(1.0,0.0);
+ glVertex3f(-0.05f,-0.95f, 3.0f);
+ glEnd();
+
+ glDisable(GL_TEXTURE_2D);
+ glEnable(GL_DEPTH_TEST);
+}
+*/
+
+void KX_Dome::Dome_CubeDraw(unsigned int viewport[4], int m_DomeFaces)
+{
+ //correct =>Skybox
+ int i,j;
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ // Making the viewport always square
+
+ int can_width = viewport[2];
+ int can_height = viewport[3];
+
+ float ortho_width, ortho_height = 1.0;
+
+ if (can_width < can_height){
+ ortho_width = 1.0;
+ ortho_height = (float)can_height/can_width;
+ }else{
+ ortho_width = (float)can_width/can_height;
+ ortho_height = 1.0;
+ }
+
+ glOrtho((-ortho_width), ortho_width, (-ortho_height), ortho_height, -20.0, 10.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt(0.0,-1.0,0.0, 0.0,0.0,0.0, 0.0,0.0,1.0);
+ glDisable(GL_DEPTH_TEST);
+ glPolygonMode(GL_FRONT, GL_FILL);
+// glPolygonMode(GL_FRONT, GL_LINE);
+ glShadeModel(GL_SMOOTH);
+ glDisable(GL_LIGHTING);
+
+ glEnable(GL_TEXTURE_2D);
+ glColor3f(1.0,1.0,1.0);
+
+ glBindTexture(GL_TEXTURE_2D, m_DomeFaces);
+ // top triangle
+ glBegin(GL_TRIANGLES);
+// glColor3f(0.0f, 0.0f, 1.0f);
+ for (i=0;i<nfacestop;i++) {
+ for (j=0;j<3;j++) {
+ glTexCoord2f(cubetop[i].u[j],cubetop[i].v[j]);
+ glVertex3f((GLfloat)cubetop[i].verts[j][0],(GLfloat)cubetop[i].verts[j][1],(GLfloat)cubetop[i].verts[j][2]);
+ }
+ }
+ glEnd();
+
+ glBindTexture(GL_TEXTURE_2D, m_DomeFaces+1);
+ // bottom triangle
+ glBegin(GL_TRIANGLES);
+// glColor3f(1.0f, 1.0f, 0.0f);
+ for (i=0;i<nfacesbottom;i++) {
+ for (j=0;j<3;j++) {
+ glTexCoord2f(cubebottom[i].u[j],cubebottom[i].v[j]);
+ glVertex3f((GLfloat)cubebottom[i].verts[j][0],(GLfloat)cubebottom[i].verts[j][1],(GLfloat)cubebottom[i].verts[j][2]);
+ }
+ }
+ glEnd();
+
+ glBindTexture(GL_TEXTURE_2D, m_DomeFaces+2);
+ // left triangle
+ glBegin(GL_TRIANGLES);
+// glColor3f(0.0f, 1.0f, 0.0f);
+ for (i=0;i<nfacesleft;i++) {
+ for (j=0;j<3;j++) {
+ glTexCoord2f(cubeleft[i].u[j],cubeleft[i].v[j]);
+ glVertex3f((GLfloat)cubeleft[i].verts[j][0],(GLfloat)cubeleft[i].verts[j][1],(GLfloat)cubeleft[i].verts[j][2]);
+ }
+ }
+ glEnd();
+
+ glBindTexture(GL_TEXTURE_2D, m_DomeFaces+3);
+ // right triangle
+ glBegin(GL_TRIANGLES);
+// glColor3f(1.0f, 0.0f, 0.0f);
+ for (i=0;i<nfacesright;i++) {
+ for (j=0;j<3;j++) {
+ glTexCoord2f(cuberight[i].u[j],cuberight[i].v[j]);
+ glVertex3f((GLfloat)cuberight[i].verts[j][0],(GLfloat)cuberight[i].verts[j][1],(GLfloat)cuberight[i].verts[j][2]);
+ }
+ }
+ glEnd();
+
+ glDisable(GL_TEXTURE_2D);
+ glEnable(GL_DEPTH_TEST);
+}
+void KX_Dome::RenderDome()
+{
+ m_engine->Render();
+
+/*
+ KX_Scene* firstscene = *m_scenes.begin();
+ const RAS_FrameSettings &framesettings = firstscene->GetFramingType();
+
+ m_logger->StartLog(tc_rasterizer, m_kxsystem->GetTimeInSeconds(), true);
+
+ // hiding mouse cursor each frame
+ // (came back when going out of focus and then back in again)
+ if (m_hideCursor)
+ m_canvas->SetMouseState(RAS_ICanvas::MOUSE_INVISIBLE);
+
+ // clear the entire game screen with the border color
+ // only once per frame
+ m_canvas->BeginDraw();
+ if (m_drawingmode == RAS_IRasterizer::KX_TEXTURED) {
+ m_canvas->SetViewPort(0, 0, m_canvas->GetWidth(), m_canvas->GetHeight());
+ if (m_overrideFrameColor)
+ {
+ // Do not use the framing bar color set in the Blender scenes
+ m_canvas->ClearColor(
+ m_overrideFrameColorR,
+ m_overrideFrameColorG,
+ m_overrideFrameColorB,
+ 1.0
+ );
+ }
+ else
+ {
+ // Use the framing bar color set in the Blender scenes
+ m_canvas->ClearColor(
+ framesettings.BarRed(),
+ framesettings.BarGreen(),
+ framesettings.BarBlue(),
+ 1.0
+ );
+ }
+ // clear the -whole- viewport
+ m_canvas->ClearBuffer(RAS_ICanvas::COLOR_BUFFER|RAS_ICanvas::DEPTH_BUFFER);
+ }
+
+ m_rasterizer->SetEye(RAS_IRasterizer::RAS_STEREO_LEFTEYE);
+
+ // BeginFrame() sets the actual drawing area. You can use a part of the window
+ if (!BeginFrame())
+ return;
+
+ KX_SceneList::iterator sceneit;
+ for (sceneit = m_scenes.begin();sceneit != m_scenes.end(); sceneit++)
+ // for each scene, call the proceed functions
+ {
+ KX_Scene* scene = *sceneit;
+ KX_Camera* cam = scene->GetActiveCamera();
+ // pass the scene's worldsettings to the rasterizer
+ SetWorldSettings(scene->GetWorldInfo());
+
+ // shadow buffers
+ RenderShadowBuffers(scene);
+
+ // Avoid drawing the scene with the active camera twice when it's viewport is enabled
+ if(cam && !cam->GetViewport())
+ {
+ if (scene->IsClearingZBuffer())
+ m_rasterizer->ClearDepthBuffer();
+
+ m_rendertools->SetAuxilaryClientInfo(scene);
+
+ // do the rendering
+ // dome checking
+ if(m_rasterizer->GetStereoMode()==RAS_IRasterizer::RAS_STEREO_DOME)
+ RenderDomeFrame(scene,cam);
+ else
+ RenderFrame(scene, cam);
+ }
+
+ list<class KX_Camera*>* cameras = scene->GetCameras();
+
+ // Draw the scene once for each camera with an enabled viewport
+ list<KX_Camera*>::iterator it = cameras->begin();
+ while(it != cameras->end())
+ {
+ if((*it)->GetViewport())
+ {
+ if (scene->IsClearingZBuffer())
+ m_rasterizer->ClearDepthBuffer();
+
+ m_rendertools->SetAuxilaryClientInfo(scene);
+
+ // do the rendering
+ if(m_rasterizer->GetStereoMode()==RAS_IRasterizer::RAS_STEREO_DOME)
+ RenderDomeFrame(scene, (*it));
+ else
+ RenderFrame(scene, (*it));
+ }
+
+ it++;
+ }
+ }
+
+ // only one place that checks for stereo
+ if(m_rasterizer->Stereo())
+ {
+ m_rasterizer->SetEye(RAS_IRasterizer::RAS_STEREO_RIGHTEYE);
+
+ if (!BeginFrame())
+ return;
+
+ KX_SceneList::iterator sceneit;
+ for (sceneit = m_scenes.begin();sceneit != m_scenes.end(); sceneit++)
+ // for each scene, call the proceed functions
+ {
+ KX_Scene* scene = *sceneit;
+ KX_Camera* cam = scene->GetActiveCamera();
+
+ // pass the scene's worldsettings to the rasterizer
+ SetWorldSettings(scene->GetWorldInfo());
+
+ if (scene->IsClearingZBuffer())
+ m_rasterizer->ClearDepthBuffer();
+
+ //pass the scene, for picking and raycasting (shadows)
+ m_rendertools->SetAuxilaryClientInfo(scene);
+
+ // do the rendering
+ //RenderFrame(scene);
+ RenderFrame(scene, cam);
+ }
+ } // if(m_rasterizer->Stereo())
+
+ EndFrame();
+*/
+}
+/*
+void KX_Dome::Dome_CubeDraw(unsigned int viewport[4], int m_DomeFaces)
+{
+//tmp, cubemap
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ //
+
+ int can_width = viewport[2];
+ int can_height = viewport[3];
+
+ float ortho_width, ortho_height;
+
+ if (can_width < can_height){
+ ortho_width = 1.0;
+ ortho_height = (float)can_height/can_width;
+ }else{
+ ortho_width = (float)can_width/can_height;
+ ortho_height = 1.0;
+ }
+
+ glOrtho((-ortho_width), ortho_width, (-ortho_height), ortho_height, -20.0, 10.0);
+
+ //Start to Draw
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glDisable(GL_DEPTH_TEST);
+ glPolygonMode(GL_FRONT, GL_FILL);
+ glShadeModel(GL_SMOOTH);
+ glDisable(GL_LIGHTING);
+
+ glDisable(GL_TEXTURE_2D);
+
+ glBindTexture(GL_TEXTURE_CUBE_MAP, m_DomeFaces);
+ // Commands to Enable EnvMap
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
+
+ glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+ glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP);
+ glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP);
+ glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP);
+ glEnable(GL_TEXTURE_CUBE_MAP);
+ glEnable(GL_TEXTURE_GEN_S);
+ glEnable(GL_TEXTURE_GEN_T);
+ glEnable(GL_TEXTURE_GEN_R);
+ glEnable(GL_NORMALIZE);
+
+ DrawDomeSphere(9.0);
+
+ glDisable(GL_TEXTURE_CUBE_MAP);
+ glEnable(GL_DEPTH_TEST);
+}
+*/
+/*
+// capture image from viewport
+void KX_Dome::calcImage (unsigned int texId)
+{
+ if (m_rasterizer->GetDrawingMode() != RAS_IRasterizer::KX_TEXTURED || // no need for texture
+ m_camera->GetViewport() || // camera must be inactive
+ m_camera == m_scene->GetActiveCamera())
+ {
+ // no need to compute texture in non texture rendering
+ m_avail = false;
+ return;
+ }
+ // render the scene from the camera
+ Render();
+ // get image from viewport
+ ImageViewport::calcImage(texId);
+ // restore OpenGL state
+ m_canvas->EndFrame();
+}
+*/
+/*
+void ImageRender::Render()
+{
+ RAS_FrameFrustum frustrum;
+
+ if (!m_render)
+ return;
+
+ if (m_mirror)
+ {
+ // mirror mode, compute camera frustrum, position and orientation
+ // convert mirror position and normal in world space
+ const MT_Matrix3x3 & mirrorObjWorldOri = m_mirror->GetSGNode()->GetWorldOrientation();
+ const MT_Point3 & mirrorObjWorldPos = m_mirror->GetSGNode()->GetWorldPosition();
+ const MT_Vector3 & mirrorObjWorldScale = m_mirror->GetSGNode()->GetWorldScaling();
+ MT_Point3 mirrorWorldPos =
+ mirrorObjWorldPos + mirrorObjWorldScale * (mirrorObjWorldOri * m_mirrorPos);
+ MT_Vector3 mirrorWorldZ = mirrorObjWorldOri * m_mirrorZ;
+ // get observer world position
+ const MT_Point3 & observerWorldPos = m_observer->GetSGNode()->GetWorldPosition();
+ // get plane D term = mirrorPos . normal
+ MT_Scalar mirrorPlaneDTerm = mirrorWorldPos.dot(mirrorWorldZ);
+ // compute distance of observer to mirror = D - observerPos . normal
+ MT_Scalar observerDistance = mirrorPlaneDTerm - observerWorldPos.dot(mirrorWorldZ);
+ // if distance < 0.01 => observer is on wrong side of mirror, don't render
+ if (observerDistance < 0.01f)
+ return;
+ // set camera world position = observerPos + normal * 2 * distance
+ MT_Point3 cameraWorldPos = observerWorldPos + (MT_Scalar(2.0)*observerDistance)*mirrorWorldZ;
+ m_camera->GetSGNode()->SetLocalPosition(cameraWorldPos);
+ // set camera orientation: z=normal, y=mirror_up in world space, x= y x z
+ MT_Vector3 mirrorWorldY = mirrorObjWorldOri * m_mirrorY;
+ MT_Vector3 mirrorWorldX = mirrorObjWorldOri * m_mirrorX;
+ MT_Matrix3x3 cameraWorldOri(
+ mirrorWorldX[0], mirrorWorldY[0], mirrorWorldZ[0],
+ mirrorWorldX[1], mirrorWorldY[1], mirrorWorldZ[1],
+ mirrorWorldX[2], mirrorWorldY[2], mirrorWorldZ[2]);
+ m_camera->GetSGNode()->SetLocalOrientation(cameraWorldOri);
+ m_camera->GetSGNode()->UpdateWorldData(0.0);
+ // compute camera frustrum:
+ // get position of mirror relative to camera: offset = mirrorPos-cameraPos
+ MT_Vector3 mirrorOffset = mirrorWorldPos - cameraWorldPos;
+ // convert to camera orientation
+ mirrorOffset = mirrorOffset * cameraWorldOri;
+ // scale mirror size to world scale:
+ // get closest local axis for mirror Y and X axis and scale height and width by local axis scale
+ MT_Scalar x, y;
+ x = fabs(m_mirrorY[0]);
+ y = fabs(m_mirrorY[1]);
+ float height = (x > y) ?
+ ((x > fabs(m_mirrorY[2])) ? mirrorObjWorldScale[0] : mirrorObjWorldScale[2]):
+ ((y > fabs(m_mirrorY[2])) ? mirrorObjWorldScale[1] : mirrorObjWorldScale[2]);
+ x = fabs(m_mirrorX[0]);
+ y = fabs(m_mirrorX[1]);
+ float width = (x > y) ?
+ ((x > fabs(m_mirrorX[2])) ? mirrorObjWorldScale[0] : mirrorObjWorldScale[2]):
+ ((y > fabs(m_mirrorX[2])) ? mirrorObjWorldScale[1] : mirrorObjWorldScale[2]);
+ width *= m_mirrorHalfWidth;
+ height *= m_mirrorHalfHeight;
+ // left = offsetx-width
+ // right = offsetx+width
+ // top = offsety+height
+ // bottom = offsety-height
+ // near = -offsetz
+ // far = near+100
+ frustrum.x1 = mirrorOffset[0]-width;
+ frustrum.x2 = mirrorOffset[0]+width;
+ frustrum.y1 = mirrorOffset[1]-height;
+ frustrum.y2 = mirrorOffset[1]+height;
+ frustrum.camnear = -mirrorOffset[2];
+ frustrum.camfar = -mirrorOffset[2]+m_clip;
+ }
+ const float ortho = 100.0;
+ const RAS_IRasterizer::StereoMode stereomode = m_rasterizer->GetStereoMode();
+
+ // The screen area that ImageViewport will copy is also the rendering zone
+ m_canvas->SetViewPort(m_position[0], m_position[1], m_position[0]+m_capSize[0]-1, m_position[1]+m_capSize[1]-1);
+ m_canvas->ClearColor(m_background[0], m_background[1], m_background[2], m_background[3]);
+ m_canvas->ClearBuffer(RAS_ICanvas::COLOR_BUFFER|RAS_ICanvas::DEPTH_BUFFER);
+ m_rasterizer->BeginFrame(RAS_IRasterizer::KX_TEXTURED,m_engine->GetClockTime());
+ m_rendertools->BeginFrame(m_rasterizer);
+ m_engine->SetWorldSettings(m_scene->GetWorldInfo());
+ m_rendertools->SetAuxilaryClientInfo(m_scene);
+ m_rasterizer->DisplayFog();
+ // matrix calculation, don't apply any of the stereo mode
+ m_rasterizer->SetStereoMode(RAS_IRasterizer::RAS_STEREO_NOSTEREO);
+ if (m_mirror)
+ {
+ // frustrum was computed above
+ // get frustrum matrix and set projection matrix
+ MT_Matrix4x4 projmat = m_rasterizer->GetFrustumMatrix(
+ frustrum.x1, frustrum.x2, frustrum.y1, frustrum.y2, frustrum.camnear, frustrum.camfar);
+
+ m_camera->SetProjectionMatrix(projmat);
+ } else if (m_camera->hasValidProjectionMatrix())
+ {
+ m_rasterizer->SetProjectionMatrix(m_camera->GetProjectionMatrix());
+ } else
+ {
+ float lens = m_camera->GetLens();
+ bool orthographic = !m_camera->GetCameraData()->m_perspective;
+ float nearfrust = m_camera->GetCameraNear();
+ float farfrust = m_camera->GetCameraFar();
+ float aspect_ratio = 1.0f;
+ Scene *blenderScene = m_scene->GetBlenderScene();
+
+ if (orthographic) {
+ lens *= ortho;
+ nearfrust = (nearfrust + 1.0)*ortho;
+ farfrust *= ortho;
+ }
+ // compute the aspect ratio from frame blender scene settings so that render to texture
+ // works the same in Blender and in Blender player
+ if (blenderScene->r.ysch != 0)
+ aspect_ratio = float(blenderScene->r.xsch) / float(blenderScene->r.ysch);
+
+ RAS_FramingManager::ComputeDefaultFrustum(
+ nearfrust,
+ farfrust,
+ lens,
+ aspect_ratio,
+ frustrum);
+
+ MT_Matrix4x4 projmat = m_rasterizer->GetFrustumMatrix(
+ frustrum.x1, frustrum.x2, frustrum.y1, frustrum.y2, frustrum.camnear, frustrum.camfar);
+
+ m_camera->SetProjectionMatrix(projmat);
+ }
+
+ MT_Transform camtrans(m_camera->GetWorldToCamera());
+ if (!m_camera->GetCameraData()->m_perspective)
+ camtrans.getOrigin()[2] *= ortho;
+ MT_Matrix4x4 viewmat(camtrans);
+
+ m_rasterizer->SetViewMatrix(viewmat, m_camera->NodeGetWorldPosition(),
+ m_camera->GetCameraLocation(), m_camera->GetCameraOrientation());
+ m_camera->SetModelviewMatrix(viewmat);
+ // restore the stereo mode now that the matrix is computed
+ m_rasterizer->SetStereoMode(stereomode);
+
+ // do not update the mesh, we don't want to do it more than once per frame
+ //m_scene->UpdateMeshTransformations();
+
+ m_scene->CalculateVisibleMeshes(m_rasterizer,m_camera);
+
+ m_scene->RenderBuckets(camtrans, m_rasterizer, m_rendertools);
+}
+*/
+/*
+// cast Image pointer to ImageRender
+inline ImageRender * getImageRender (PyImage * self)
+{ return static_cast<ImageRender*>(self->m_image); }
+*/
+
+// python methods
+
+// Blender Scene type
+//BlendType<KX_Scene> sceneType ("KX_Scene");
+// Blender Camera type
+//BlendType<KX_Camera> cameraType ("KX_Camera");
+
+/*
+// object initialization
+static int ImageRender_init (PyObject * pySelf, PyObject * args, PyObject * kwds)
+{
+ // parameters - scene object
+ PyObject * scene;
+ // camera object
+ PyObject * camera;
+ // parameter keywords
+ static char *kwlist[] = {"sceneObj", "cameraObj", NULL};
+ // get parameters
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO", kwlist, &scene, &camera))
+ return -1;
+ try
+ {
+ // get scene pointer
+ KX_Scene * scenePtr (NULL);
+ if (scene != NULL) scenePtr = sceneType.checkType(scene);
+ // throw exception if scene is not available
+ if (scenePtr == NULL) THRWEXCP(SceneInvalid, S_OK);
+
+ // get camera pointer
+ KX_Camera * cameraPtr (NULL);
+ if (camera != NULL) cameraPtr = cameraType.checkType(camera);
+ // throw exception if camera is not available
+ if (cameraPtr == NULL) THRWEXCP(CameraInvalid, S_OK);
+
+ // get pointer to image structure
+ PyImage * self = reinterpret_cast<PyImage*>(pySelf);
+ // create source object
+ if (self->m_image != NULL) delete self->m_image;
+ self->m_image = new ImageRender(scenePtr, cameraPtr);
+ }
+ catch (Exception & exp)
+ {
+ exp.report();
+ return -1;
+ }
+ // initialization succeded
+ return 0;
+}
+*/
+/*
+// get background color
+PyObject * getBackground (PyImage * self, void * closure)
+{
+ return Py_BuildValue("[BBBB]",
+ getImageRender(self)->getBackground(0),
+ getImageRender(self)->getBackground(1),
+ getImageRender(self)->getBackground(2),
+ getImageRender(self)->getBackground(3));
+}
+*/
+/*
+// set color
+static int setBackground (PyImage * self, PyObject * value, void * closure)
+{
+ // check validity of parameter
+ if (value == NULL || !PySequence_Check(value) || PySequence_Length(value) != 4
+ || !PyInt_Check(PySequence_Fast_GET_ITEM(value, 0))
+ || !PyInt_Check(PySequence_Fast_GET_ITEM(value, 1))
+ || !PyInt_Check(PySequence_Fast_GET_ITEM(value, 2))
+ || !PyInt_Check(PySequence_Fast_GET_ITEM(value, 3)))
+ {
+ PyErr_SetString(PyExc_TypeError, "The value must be a sequence of 4 integer between 0 and 255");
+ return -1;
+ }
+ // set background color
+ getImageRender(self)->setBackground((unsigned char)(PyInt_AsLong(PySequence_Fast_GET_ITEM(value, 0))),
+ (unsigned char)(PyInt_AsLong(PySequence_Fast_GET_ITEM(value, 1))),
+ (unsigned char)(PyInt_AsLong(PySequence_Fast_GET_ITEM(value, 2))),
+ (unsigned char)(PyInt_AsLong(PySequence_Fast_GET_ITEM(value, 3))));
+ // success
+ return 0;
+}
+*/
+/*
+// methods structure
+static PyMethodDef imageRenderMethods[] =
+{ // methods from ImageBase class
+ {"refresh", (PyCFunction)Image_refresh, METH_NOARGS, "Refresh image - invalidate its current content"},
+ {NULL}
+};
+// attributes structure
+static PyGetSetDef imageRenderGetSets[] =
+{
+ {(char*)"background", (getter)getBackground, (setter)setBackground, (char*)"background color", NULL},
+ // attribute from ImageViewport
+ {(char*)"capsize", (getter)ImageViewport_getCaptureSize, (setter)ImageViewport_setCaptureSize, (char*)"size of render area", NULL},
+ {(char*)"alpha", (getter)ImageViewport_getAlpha, (setter)ImageViewport_setAlpha, (char*)"use alpha in texture", NULL},
+ {(char*)"whole", (getter)ImageViewport_getWhole, (setter)ImageViewport_setWhole, (char*)"use whole viewport to render", NULL},
+ // attributes from ImageBase class
+ {(char*)"image", (getter)Image_getImage, NULL, (char*)"image data", NULL},
+ {(char*)"size", (getter)Image_getSize, NULL, (char*)"image size", NULL},
+ {(char*)"scale", (getter)Image_getScale, (setter)Image_setScale, (char*)"fast scale of image (near neighbour)", NULL},
+ {(char*)"flip", (getter)Image_getFlip, (setter)Image_setFlip, (char*)"flip image vertically", NULL},
+ {(char*)"filter", (getter)Image_getFilter, (setter)Image_setFilter, (char*)"pixel filter", NULL},
+ {NULL}
+};
+*/
+
+/*
+// object initialization
+static int ImageMirror_init (PyObject * pySelf, PyObject * args, PyObject * kwds)
+{
+ // parameters - scene object
+ PyObject * scene;
+ // reference object for mirror
+ PyObject * observer;
+ // object holding the mirror
+ PyObject * mirror;
+ // material of the mirror
+ short materialID = 0;
+ // parameter keywords
+ static char *kwlist[] = {"scene", "observer", "mirror", "material", NULL};
+ // get parameters
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "OOO|h", kwlist, &scene, &observer, &mirror, &materialID))
+ return -1;
+ try
+ {
+ // get scene pointer
+ KX_Scene * scenePtr (NULL);
+ if (scene != NULL && PyObject_TypeCheck(scene, &KX_Scene::Type))
+ scenePtr = static_cast<KX_Scene*>(scene);
+ else
+ THRWEXCP(SceneInvalid, S_OK);
+
+ // get observer pointer
+ KX_GameObject * observerPtr (NULL);
+ if (observer != NULL && PyObject_TypeCheck(observer, &KX_GameObject::Type))
+ observerPtr = static_cast<KX_GameObject*>(observer);
+ else if (observer != NULL && PyObject_TypeCheck(observer, &KX_Camera::Type))
+ observerPtr = static_cast<KX_Camera*>(observer);
+ else
+ THRWEXCP(ObserverInvalid, S_OK);
+
+ // get mirror pointer
+ KX_GameObject * mirrorPtr (NULL);
+ if (mirror != NULL && PyObject_TypeCheck(mirror, &KX_GameObject::Type))
+ mirrorPtr = static_cast<KX_GameObject*>(mirror);
+ else
+ THRWEXCP(MirrorInvalid, S_OK);
+
+ // locate the material in the mirror
+ RAS_IPolyMaterial * material = getMaterial(mirror, materialID);
+ if (material == NULL)
+ THRWEXCP(MaterialNotAvail, S_OK);
+
+ // get pointer to image structure
+ PyImage * self = reinterpret_cast<PyImage*>(pySelf);
+
+ // create source object
+ if (self->m_image != NULL)
+ {
+ delete self->m_image;
+ self->m_image = NULL;
+ }
+ self->m_image = new ImageRender(scenePtr, observerPtr, mirrorPtr, material);
+ }
+ catch (Exception & exp)
+ {
+ exp.report();
+ return -1;
+ }
+ // initialization succeded
+ return 0;
+}
+*/
+/**
+// get background color
+PyObject * getClip (PyImage * self, void * closure)
+{
+ return PyFloat_FromDouble(getImageRender(self)->getClip());
+}
+*/
+/*
+// set clip
+static int setClip (PyImage * self, PyObject * value, void * closure)
+{
+ // check validity of parameter
+ double clip;
+ if (value == NULL || !PyFloat_Check(value) || (clip = PyFloat_AsDouble(value)) < 0.01 || clip > 5000.0)
+ {
+ PyErr_SetString(PyExc_TypeError, "The value must be an float between 0.01 and 5000");
+ return -1;
+ }
+ // set background color
+ getImageRender(self)->setClip(float(clip));
+ // success
+ return 0;
+}
+*/
+/*
+// attributes structure
+static PyGetSetDef imageMirrorGetSets[] =
+{
+ {(char*)"clip", (getter)getClip, (setter)setClip, (char*)"clipping distance", NULL},
+ // attribute from ImageRender
+ {(char*)"background", (getter)getBackground, (setter)setBackground, (char*)"background color", NULL},
+ // attribute from ImageViewport
+ {(char*)"capsize", (getter)ImageViewport_getCaptureSize, (setter)ImageViewport_setCaptureSize, (char*)"size of render area", NULL},
+ {(char*)"alpha", (getter)ImageViewport_getAlpha, (setter)ImageViewport_setAlpha, (char*)"use alpha in texture", NULL},
+ {(char*)"whole", (getter)ImageViewport_getWhole, (setter)ImageViewport_setWhole, (char*)"use whole viewport to render", NULL},
+ // attributes from ImageBase class
+ {(char*)"image", (getter)Image_getImage, NULL, (char*)"image data", NULL},
+ {(char*)"size", (getter)Image_getSize, NULL, (char*)"image size", NULL},
+ {(char*)"scale", (getter)Image_getScale, (setter)Image_setScale, (char*)"fast scale of image (near neighbour)", NULL},
+ {(char*)"flip", (getter)Image_getFlip, (setter)Image_setFlip, (char*)"flip image vertically", NULL},
+ {(char*)"filter", (getter)Image_getFilter, (setter)Image_setFilter, (char*)"pixel filter", NULL},
+ {NULL}
+};
+*/
+/*
+// constructor
+ImageRender::ImageRender (KX_Scene * scene, KX_GameObject * observer, KX_GameObject * mirror, RAS_IPolyMaterial * mat) :
+ ImageViewport(),
+ m_render(false),
+ m_scene(scene),
+ m_observer(observer),
+ m_mirror(mirror),
+ m_clip(100.f)
+{
+ // this constructor is used for automatic planar mirror
+ // create a camera, take all data by default, in any case we will recompute the frustrum on each frame
+ RAS_CameraData camdata;
+ vector<RAS_TexVert*> mirrorVerts;
+ vector<RAS_TexVert*>::iterator it;
+ float mirrorArea = 0.f;
+ float mirrorNormal[3] = {0.f, 0.f, 0.f};
+ float mirrorUp[3];
+ float dist, vec[3], axis[3];
+ float zaxis[3] = {0.f, 0.f, 1.f};
+ float yaxis[3] = {0.f, 1.f, 0.f};
+ float mirrorMat[3][3];
+ float left, right, top, bottom, back;
+
+ m_camera= new KX_Camera(scene, KX_Scene::m_callbacks, camdata);
+ m_camera->SetName("__mirror__cam__");
+ // don't add the camera to the scene object list, it doesn't need to be accessible
+ m_owncamera = true;
+ // retrieve rendering objects
+ m_engine = KX_GetActiveEngine();
+ m_rasterizer = m_engine->GetRasterizer();
+ m_canvas = m_engine->GetCanvas();
+ m_rendertools = m_engine->GetRenderTools();
+ // locate the vertex assigned to mat and do following calculation in mesh coordinates
+ for (int meshIndex = 0; meshIndex < mirror->GetMeshCount(); meshIndex++)
+ {
+ RAS_MeshObject* mesh = mirror->GetMesh(meshIndex);
+ int numPolygons = mesh->NumPolygons();
+ for (int polygonIndex=0; polygonIndex < numPolygons; polygonIndex++)
+ {
+ RAS_Polygon* polygon = mesh->GetPolygon(polygonIndex);
+ if (polygon->GetMaterial()->GetPolyMaterial() == mat)
+ {
+ RAS_TexVert *v1, *v2, *v3, *v4;
+ float normal[3];
+ float area;
+ // this polygon is part of the mirror,
+ v1 = polygon->GetVertex(0);
+ v2 = polygon->GetVertex(1);
+ v3 = polygon->GetVertex(2);
+ mirrorVerts.push_back(v1);
+ mirrorVerts.push_back(v2);
+ mirrorVerts.push_back(v3);
+ if (polygon->VertexCount() == 4)
+ {
+ v4 = polygon->GetVertex(3);
+ mirrorVerts.push_back(v4);
+ area = CalcNormFloat4((float*)v1->getXYZ(), (float*)v2->getXYZ(), (float*)v3->getXYZ(), (float*)v4->getXYZ(), normal);
+ } else
+ {
+ area = CalcNormFloat((float*)v1->getXYZ(), (float*)v2->getXYZ(), (float*)v3->getXYZ(), normal);
+ }
+ area = fabs(area);
+ mirrorArea += area;
+ VecMulf(normal, area);
+ VecAddf(mirrorNormal, mirrorNormal, normal);
+ }
+ }
+ }
+ if (mirrorVerts.size() == 0 || mirrorArea < FLT_EPSILON)
+ {
+ // no vertex or zero size mirror
+ THRWEXCP(MirrorSizeInvalid, S_OK);
+ }
+ // compute average normal of mirror faces
+ VecMulf(mirrorNormal, 1.0f/mirrorArea);
+ if (Normalize(mirrorNormal) == 0.f)
+ {
+ // no normal
+ THRWEXCP(MirrorNormalInvalid, S_OK);
+ }
+ // the mirror plane has an equation of the type ax+by+cz = d where (a,b,c) is the normal vector
+ // if the mirror is more vertical then horizontal, the Z axis is the up direction.
+ // otherwise the Y axis is the up direction.
+ // If the mirror is not perfectly vertical(horizontal), the Z(Y) axis projection on the mirror
+ // plan by the normal will be the up direction.
+ if (fabs(mirrorNormal[2]) > fabs(mirrorNormal[1]) &&
+ fabs(mirrorNormal[2]) > fabs(mirrorNormal[0]))
+ {
+ // the mirror is more horizontal than vertical
+ VecCopyf(axis, yaxis);
+ }
+ else
+ {
+ // the mirror is more vertical than horizontal
+ VecCopyf(axis, zaxis);
+ }
+ dist = Inpf(mirrorNormal, axis);
+ if (fabs(dist) < FLT_EPSILON)
+ {
+ // the mirror is already fully aligned with up axis
+ VecCopyf(mirrorUp, axis);
+ }
+ else
+ {
+ // projection of axis to mirror plane through normal
+ VecCopyf(vec, mirrorNormal);
+ VecMulf(vec, dist);
+ VecSubf(mirrorUp, axis, vec);
+ if (Normalize(mirrorUp) == 0.f)
+ {
+ // should not happen
+ THRWEXCP(MirrorHorizontal, S_OK);
+ return;
+ }
+ }
+ // compute rotation matrix between local coord and mirror coord
+ // to match camera orientation, we select mirror z = -normal, y = up, x = y x z
+ VecCopyf(mirrorMat[2], mirrorNormal);
+ VecMulf(mirrorMat[2], -1.0f);
+ VecCopyf(mirrorMat[1], mirrorUp);
+ Crossf(mirrorMat[0], mirrorMat[1], mirrorMat[2]);
+ // transpose to make it a orientation matrix from local space to mirror space
+ Mat3Transp(mirrorMat);
+ // transform all vertex to plane coordinates and determine mirror position
+ left = FLT_MAX;
+ right = -FLT_MAX;
+ bottom = FLT_MAX;
+ top = -FLT_MAX;
+ back = -FLT_MAX; // most backward vertex (=highest Z coord in mirror space)
+ for (it = mirrorVerts.begin(); it != mirrorVerts.end(); it++)
+ {
+ VecCopyf(vec, (float*)(*it)->getXYZ());
+ Mat3MulVecfl(mirrorMat, vec);
+ if (vec[0] < left)
+ left = vec[0];
+ if (vec[0] > right)
+ right = vec[0];
+ if (vec[1] < bottom)
+ bottom = vec[1];
+ if (vec[1] > top)
+ top = vec[1];
+ if (vec[2] > back)
+ back = vec[2];
+ }
+ // now store this information in the object for later rendering
+ m_mirrorHalfWidth = (right-left)*0.5f;
+ m_mirrorHalfHeight = (top-bottom)*0.5f;
+ if (m_mirrorHalfWidth < 0.01f || m_mirrorHalfHeight < 0.01f)
+ {
+ // mirror too small
+ THRWEXCP(MirrorTooSmall, S_OK);
+ }
+ // mirror position in mirror coord
+ vec[0] = (left+right)*0.5f;
+ vec[1] = (top+bottom)*0.5f;
+ vec[2] = back;
+ // convert it in local space: transpose again the matrix to get back to mirror to local transform
+ Mat3Transp(mirrorMat);
+ Mat3MulVecfl(mirrorMat, vec);
+ // mirror position in local space
+ m_mirrorPos.setValue(vec[0], vec[1], vec[2]);
+ // mirror normal vector (pointed towards the back of the mirror) in local space
+ m_mirrorZ.setValue(-mirrorNormal[0], -mirrorNormal[1], -mirrorNormal[2]);
+ m_mirrorY.setValue(mirrorUp[0], mirrorUp[1], mirrorUp[2]);
+ m_mirrorX = m_mirrorY.cross(m_mirrorZ);
+ m_render = true;
+
+ setBackground(0, 0, 255, 255);
+}
+
+*/
+
+
Index: source/gameengine/Ketsji/KX_Dome.h
===================================================================
--- source/gameengine/Ketsji/KX_Dome.h (revision 0)
+++ source/gameengine/Ketsji/KX_Dome.h (revision 0)
@@ -0,0 +1,145 @@
+/* $Id: KX_Dome.h
+-----------------------------------------------------------------------------
+
+
+This program is free software; you can redistribute it and/or modify it under
+the terms of the GNU Lesser 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 Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along with
+this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+Place - Suite 330, Boston, MA 02111-1307, USA, or go to
+http://www.gnu.org/copyleft/lesser.txt.
+-----------------------------------------------------------------------------
+*/
+
+#if !defined KX_DOME_H
+#define KX_DOME_H
+
+
+//#include "Common.h"
+
+#include "KX_Scene.h"
+#include "KX_Camera.h"
+#include "DNA_screen_types.h"
+#include "RAS_ICanvas.h"
+#include "RAS_IRasterizer.h"
+#include "RAS_IRenderTools.h"
+#include "KX_KetsjiEngine.h"
+
+//#include "ImageViewport.h"
+//#include "GL/glew.h"
+#include <BIF_gl.h>
+#include <vector>
+
+/// class for render 3d scene
+class KX_Dome
+{
+public:
+ /// constructor
+ KX_Dome (
+ RAS_ICanvas* m_canvas,
+ /// rasterizer
+ RAS_IRasterizer* m_rasterizer,
+ /// render tools
+ RAS_IRenderTools* m_rendertools,
+ /// engine
+ KX_KetsjiEngine* m_engine
+ );
+// KX_Scene * scene, KX_Camera * camera);
+// ImageRender (KX_Scene * scene, KX_GameObject * observer, KX_GameObject * mirror, RAS_IPolyMaterial * mat);
+
+ /// destructor
+ virtual ~KX_Dome (void);
+
+ typedef struct {
+ double u[3], v[3];
+ MT_Vector3 verts[3]; //three verts
+ } DomeFace;
+
+ vector <DomeFace> cubetop, cubebottom, cubefront, cuberight, cubeleft;
+
+ int nfacestop, nfacesbottom, nfacesleft, nfacesright;
+ double aperture;
+
+ //old
+ void DrawDomeVert(float theta, float phi);
+ void DrawDomeSphere(float del);
+
+ //from initTexture
+ void setBackground (int red, int green, int blue, int alpha);
+
+ void RenderDome(void);
+
+ // Paul Bourke functions
+ void Dome_CubeCreate(int cubeRes);
+ void Dome_CubeSplitFace(vector <DomeFace>& face, int *nfaces);
+ void Dome_CubeFlatten(MT_Vector3& verts);
+ void Dome_CubeDraw(unsigned int viewport[4], int m_DomeFaces);
+
+ /// get background color
+// int getBackground (int idx) { return (idx < 0 || idx > 3) ? 0 : int(m_background[idx]*255.f); }
+ /// set background color
+// void setBackground (int red, int green, int blue, int alpha);
+
+ /// clipping distance
+// float getClip (void) { return m_clip; }
+ /// set whole buffer use
+// void setClip (float clip) { m_clip = clip; }
+
+protected:
+ /// true if ready to render
+// bool m_render;
+ /// rendered scene
+ KX_Scene * m_scene;
+ /// camera for render
+ KX_Camera * m_camera;
+ /// do we own the camera?
+ // bool m_owncamera; // ????
+ /// for mirror operation
+
+ float m_clip; // clipping distance
+ /// canvas
+ RAS_ICanvas* m_canvas;
+ /// rasterizer
+ RAS_IRasterizer* m_rasterizer;
+ /// render tools
+ RAS_IRenderTools* m_rendertools;
+ /// engine
+ KX_KetsjiEngine* m_engine;
+
+ /// background colour
+ float m_background[4];
+
+
+ /// render 3d scene to image
+// virtual void calcImage (unsigned int texId);
+
+// void Render();
+// void SetupRenderFrame(KX_Scene *scene, KX_Camera* cam);
+// void RenderFrame(KX_Scene* scene, KX_Camera* cam);
+// void SetBackGround(KX_WorldInfo* wi);
+// void SetWorldSettings(KX_WorldInfo* wi);
+};
+
+/* my function here. I don't want to use a class unless I need it */
+
+//void DomeDraw(unsigned int viewport[4], int m_DomeFaces);
+
+/* functions from Paul Bourke */
+
+//void Dome_CubeSplitFace(KX_Dome::DomeFace* face, int *nfaces);
+
+//void Dome_CubeDraw(void);
+
+//KX_Dome::DomeFace* cubetop, cubebottom, cubefront, cuberight, cubeleft;
+//int nfacestop, nfacesbottom, nfacesleft, nfacesright;
+//double aperture;
+
+#endif
+
Index: source/gameengine/Ketsji/KX_GameObject.cpp
===================================================================
--- source/gameengine/Ketsji/KX_GameObject.cpp (revision 18000)
+++ source/gameengine/Ketsji/KX_GameObject.cpp (working copy)
@@ -884,7 +884,28 @@
}
}

+void KX_GameObject::NodeSetWorldOrientation(const MT_Matrix3x3& rot){

+ // check on valid node in case a python controller holds a reference to a deleted object
+ if (!GetSGNode())
+ return;
+
+ if (m_pPhysicsController1 && !GetSGNode()->GetSGParent())
+ {
+ // see note above
+ m_pPhysicsController1->setOrientation(rot);
+ }
+
+// SG_Node* parent = m_pSGNode->GetSGParent();
+// if (parent != NULL){
+ //set worldposition of the parent instead
+// parent->SetWorldOrientation(rot);
+// GetSGNode()->SetWorldOrientation(rot);
+// }
+// else
+ GetSGNode()->SetWorldOrientation(rot);
+}
+
void KX_GameObject::NodeUpdateGS(double time,bool bInitiator)
{
if (GetSGNode())
Index: source/gameengine/Ketsji/KX_GameObject.h
===================================================================
--- source/gameengine/Ketsji/KX_GameObject.h (revision 18000)
+++ source/gameengine/Ketsji/KX_GameObject.h (working copy)
@@ -365,6 +365,8 @@
// adapt local position so that world position is set to desired position
void NodeSetWorldPosition(const MT_Point3& trans);

+ void NodeSetWorldOrientation(const MT_Matrix3x3& rot );
+
void
NodeUpdateGS(
double time,
Index: source/gameengine/Ketsji/KX_KetsjiEngine.cpp
===================================================================
--- source/gameengine/Ketsji/KX_KetsjiEngine.cpp (revision 18000)
+++ source/gameengine/Ketsji/KX_KetsjiEngine.cpp (working copy)
@@ -74,6 +74,11 @@
#include "RAS_FramingManager.h"
#include "stdio.h"

+#include "KX_Dome.h"
+
+#include "GL/glew.h"
+#include "GL/glu.h"
+
// If define: little test for Nzc: guarded drawing. If the canvas is
// not valid, skip rendering this frame.
//#define NZC_GUARDED_OUTPUT
@@ -97,8 +102,40 @@
double KX_KetsjiEngine::m_suspendedtime = 0.0;
double KX_KetsjiEngine::m_suspendeddelta = 0.0;
double KX_KetsjiEngine::m_average_framerate = 0.0;
+/*
+static const enum KX_KetsjiEngine::DomeFaceTarget {
+ GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT,
+ GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT,
+ GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT,
+ GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT,
+ GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT,
+ GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT
+};
+*/
+static GLenum DomeFaceTarget [6] = {
+ GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
+ GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
+ GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
+ GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
+ GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
+ GL_TEXTURE_CUBE_MAP_POSITIVE_X
+};
+/*
+static GLenum DomeFaceTarget [6] = {
+ GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT,
+ GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT,
+ GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT,
+ GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT,
+ GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT,
+ GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT
+};
+*/

+unsigned int DomeFaces[4];
+unsigned int DomeFacesTmp[6]; // tmp to store a single render image

+int DomeFaceSize=512;
+
/**
* Constructor of the Ketsji Engine
*/
@@ -165,7 +202,9 @@

for (int i = tc_first; i < tc_numCategories; i++)
m_logger->AddCategory((KX_TimeCategory)i);
-
+
+ //Initialize the dome
+// m_dome = new KX_Dome(m_canvas, m_rasterizer, m_rendertools,this);
}


@@ -176,6 +215,7 @@
KX_KetsjiEngine::~KX_KetsjiEngine()
{
delete m_logger;
+ delete m_dome;
}


@@ -253,8 +293,12 @@
m_sceneconverter = sceneconverter;
}

+void KX_KetsjiEngine::InitDome()
+{
+ m_dome = new KX_Dome(m_canvas, m_rasterizer, m_rendertools,this);
+ m_dome->Dome_CubeCreate(4);
+}

-
/**
* Ketsji Init(), Initializes datastructures and converts data from
* Blender into Ketsji native (realtime) format also sets up the
@@ -610,11 +654,822 @@

return doRender;
}
+void KX_KetsjiEngine::tmpInitDome()
+{
+// KX_Dome my_dome = KX_Dome(scene,cam);
+// KX_Dome *kx_dome = &my_dome;
+// m_dome = new KX_Dome();
+ //create 6 images
+ glGenTextures(4, (GLuint*)&DomeFaces);
+
+ for (int i=0;i<4;i++){
+ //create tmp texture
+// glGenTextures(1, (GLuint*)&DomeFaces[i]);
+ glBindTexture(GL_TEXTURE_2D, DomeFaces[i]);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16, DomeFaceSize, DomeFaceSize, 0, GL_RGBA,
+ GL_UNSIGNED_BYTE, 0);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_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_CUBE_MAP, DomeFaces);

+// glGenTextures(1, (GLuint*)&DomeFaces);
+// glBindTexture(GL_TEXTURE_CUBE_MAP, DomeFaces);

+ for (int i=0;i<6;i++){
+ glTexImage2D(DomeFaceTarget[i], 0, GL_RGBA, DomeFaceSize, DomeFaceSize, 0, GL_RGBA,
+ GL_UNSIGNED_BYTE, 0);
+ glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP);
+ glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP);
+ }

-void KX_KetsjiEngine::Render()
+ for (int i=0;i<6;i++){
+ //create tmp texture
+ glGenTextures(1, (GLuint*)&DomeFacesTmp[i]);
+ glBindTexture(GL_TEXTURE_2D, DomeFacesTmp[i]);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, DomeFaceSize, DomeFaceSize, 0, GL_RGBA,
+ GL_UNSIGNED_BYTE, 0);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+ }
+
+ printf("\nInitializing Dome\n\n");
+ return;
+}
+void KX_KetsjiEngine::EndDome(){
+// delete m_dome;
+ //delete the six envmap images created
+ glDeleteTextures(6, (GLuint*)&DomeFaces);
+ glDeleteTextures(6, (GLuint*)&DomeFacesTmp);
+
+ printf("\nEnding Dome\n\n");
+ return;
+}
+/*
+void DomeDraw(GLuint viewport[4], KX_Dome* dome)
{
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ // Making the viewport always square
+
+ int can_width = viewport[2];
+ int can_height = viewport[3];
+
+ float ortho_width, ortho_height;
+
+ if (can_width < can_height){
+ ortho_width = 1.0;
+ ortho_height = (float)can_height/can_width;
+ }else{
+ ortho_width = (float)can_width/can_height;
+ ortho_height = 1.0;
+ }
+
+ glOrtho((-ortho_width), ortho_width, (-ortho_height), ortho_height, -20.0, 10.0);
+
+ //Start to Draw
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glDisable(GL_DEPTH_TEST);
+ glPolygonMode(GL_FRONT, GL_FILL);
+ glShadeModel(GL_SMOOTH);
+ glDisable(GL_LIGHTING);
+
+ glDisable(GL_TEXTURE_2D);
+
+ glBindTexture(GL_TEXTURE_CUBE_MAP, DomeFaces);
+ // Commands to Enable EnvMap
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
+
+ glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+ glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP);
+ glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP);
+ glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP);
+ glEnable(GL_TEXTURE_CUBE_MAP);
+ glEnable(GL_TEXTURE_GEN_S);
+ glEnable(GL_TEXTURE_GEN_T);
+ glEnable(GL_TEXTURE_GEN_R);
+ glEnable(GL_NORMALIZE);
+
+ dome->DrawDomeSphere(9.0);
+
+
+ glDisable(GL_TEXTURE_CUBE_MAP);
+ glEnable(GL_DEPTH_TEST);
+}
+*/
+void DomeDrawTmp2(GLuint viewport[4])
+{
+ //6 faces tmp
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ /* Making the viewport always square */
+
+ int can_width = viewport[2];
+ int can_height = viewport[3];
+
+ float ortho_width, ortho_height = 1.0;
+
+ if (can_width < can_height){
+ ortho_width = 1.0;
+ ortho_height = (float)can_height/can_width;
+ }else{
+ ortho_width = (float)can_width/can_height;
+ ortho_height = 1.0;
+ }
+
+ glOrtho((-ortho_width), ortho_width, (-ortho_height), ortho_height, -20.0, 10.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glDisable(GL_DEPTH_TEST);
+ glPolygonMode(GL_FRONT, GL_FILL);
+ glShadeModel(GL_SMOOTH);
+ glDisable(GL_LIGHTING);
+
+ glBegin(GL_TRIANGLES);
+ glColor3f(0.0f ,0.0f, 1.0f);
+ glVertex3f( 0.0f, 0.5f, 4.0f);
+ glColor3f(0.0f ,0.5f, 0.0f);
+ glVertex3f(-0.5f,-0.5f, 4.0f);
+ glColor3f(1.0f ,0.0f, 0.0f);
+ glVertex3f( 0.5f,-0.5f, 4.0f);
+ glEnd();
+
+ glEnable(GL_TEXTURE_2D);
+// DomeFacesTmp[0] -> GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT
+ glBindTexture(GL_TEXTURE_2D, DomeFacesTmp[0]);
+ glBegin(GL_QUADS);
+ glColor3f(1.0f ,1.0f, 1.0f);
+ glTexCoord2f(1.0,1.0);
+ glVertex3f( -0.35f, 0.8f, 3.0f);
+ glTexCoord2f(0.0,1.0);
+ glVertex3f(-0.95f,0.8f, 3.0f);
+ glTexCoord2f(0.0,0.0);
+ glVertex3f(-0.95f,0.2f, 3.0f);
+ glTexCoord2f(1.0,0.0);
+ glVertex3f(-0.35f,0.2f, 3.0f);
+ glEnd();
+
+// DomeFacesTmp[1] -> GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT
+ glBindTexture(GL_TEXTURE_2D, DomeFacesTmp[1]);
+ glBegin(GL_QUADS);
+ glColor3f(1.0f ,1.0f, 1.0f);
+ glTexCoord2f(1.0,1.0);
+ glVertex3f( -0.35f, -0.2f, 3.0f);
+ glTexCoord2f(0.0,1.0);
+ glVertex3f(-0.95f,-0.2f, 3.0f);
+ glTexCoord2f(0.0,0.0);
+ glVertex3f(-0.95f,-0.8f, 3.0f);
+ glTexCoord2f(1.0,0.0);
+ glVertex3f(-0.35f,-0.8f, 3.0f);
+ glEnd();
+
+// DomeFacesTmp[2] -> GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT
+ glBindTexture(GL_TEXTURE_2D, DomeFacesTmp[2]);
+ glBegin(GL_QUADS);
+ glColor3f(1.0f ,1.0f, 1.0f);
+ glTexCoord2f(1.0,1.0);
+ glVertex3f( 0.3f, 0.8f, 3.0f);
+ glTexCoord2f(0.0,1.0);
+ glVertex3f(-0.3f,0.8f, 3.0f);
+ glTexCoord2f(0.0,0.0);
+ glVertex3f(-0.3f,0.2f, 3.0f);
+ glTexCoord2f(1.0,0.0);
+ glVertex3f(0.3f,0.2f, 3.0f);
+ glEnd();
+
+// DomeFacesTmp[3] -> GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT
+ glBindTexture(GL_TEXTURE_2D, DomeFacesTmp[3]);
+ glBegin(GL_QUADS);
+ glColor3f(1.0f ,1.0f, 1.0f);
+ glTexCoord2f(1.0,1.0);
+ glVertex3f( 0.3f, -0.2f, 3.0f);
+ glTexCoord2f(0.0,1.0);
+ glVertex3f(-0.3f,-0.2f, 3.0f);
+ glTexCoord2f(0.0,0.0);
+ glVertex3f(-0.3f,-0.8f, 3.0f);
+ glTexCoord2f(1.0,0.0);
+ glVertex3f(0.3f,-0.8f, 3.0f);
+ glEnd();
+
+// DomeFacesTmp[4] -> GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT
+ glBindTexture(GL_TEXTURE_2D, DomeFacesTmp[4]);
+ glBegin(GL_QUADS);
+ glColor3f(1.0f ,1.0f, 1.0f);
+ glTexCoord2f(1.0,1.0);
+ glVertex3f( 0.95f, 0.8f, 3.0f);
+ glTexCoord2f(0.0,1.0);
+ glVertex3f( 0.35f,0.8f, 3.0f);
+ glTexCoord2f(0.0,0.0);
+ glVertex3f( 0.35f,0.2f, 3.0f);
+ glTexCoord2f(1.0,0.0);
+ glVertex3f( 0.95f,0.2f, 3.0f);
+ glEnd();
+
+// DomeFacesTmp[5] -> GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT
+ glBindTexture(GL_TEXTURE_2D, DomeFacesTmp[5]);
+ glBegin(GL_QUADS);
+ glColor3f(1.0f ,1.0f, 1.0f);
+ glTexCoord2f(1.0,1.0);
+ glVertex3f( 0.95f, -0.2f, 3.0f);
+ glTexCoord2f(0.0,1.0);
+ glVertex3f(0.35f,-0.2f, 3.0f);
+ glTexCoord2f(0.0,0.0);
+ glVertex3f(0.35f,-0.8f, 3.0f);
+ glTexCoord2f(1.0,0.0);
+ glVertex3f( 0.95f,-0.8f, 3.0f);
+ glEnd();
+
+ glDisable(GL_TEXTURE_2D);
+ glEnable(GL_DEPTH_TEST);
+}
+void KX_KetsjiEngine::DomeRotateCamera(KX_Camera* cam, int i){
+
+ MT_Matrix3x3 locRot [6] = {
+ MT_Matrix3x3( 0.0, 1.0, 0.0, // 90º - Left
+ -1.0, 0.0, 0.0,
+ 0.0, 0.0, 1.0),
+ MT_Matrix3x3( 0.0,-1.0, 0.0, // 90º - Right
+ 1.0, 0.0, 0.0,
+ 0.0, 0.0, 1.0),
+ MT_Matrix3x3( 0.0, 0.0, 1.0, // 90º - Bottom
+ 0.0,-1.0, 0.0,
+ 1.0, 0.0, 0.0),
+ MT_Matrix3x3( 0.0, 0.0,-1.0, // 90º - Top
+ 0.0,-1.0, 0.0,
+ -1.0, 0.0, 0.0),
+ MT_Matrix3x3( 1.0, 0.0, 0.0, // 0º - Front
+ 0.0, 1.0, 0.0,
+ 0.0, 0.0, 1.0),
+ MT_Matrix3x3(-1.0, 0.0, 0.0, // 180º - Back
+ 0.0,-1.0, 0.0,
+ 0.0, 0.0, 1.0)
+ };
+
+ MT_Quaternion cam_ori = cam->GetCameraOrientation();
+ MT_Matrix3x3 cam_node_ori = cam->GetSGNode()->GetLocalOrientation();
+ MT_Matrix3x3 gloOri = cam->NodeGetWorldOrientation().inverse();
+
+// cam->NodeSetWorldOrientation(locRot[i]*cam_node_ori);
+
+ MT_Matrix4x4 cam_mat = cam->GetModelviewMatrix();
+
+ MT_Vector3 vu = MT_Vector3 (cam_mat[1][0], cam_mat[1][1], cam_mat[1][2]); // view up vector
+ MT_Vector3 vd = MT_Vector3 (cam_mat[2][0], cam_mat[2][1], cam_mat[2][2]); // view direction
+ MT_Vector3 vp = MT_Vector3 (cam_mat[3][0], cam_mat[3][1], cam_mat[3][2]); // view position
+
+ cam_mat[3][0] += 10.0;
+
+// cam->SetModelviewMatrix(cam_mat);
+
+// m_rasterizer->SetViewMatrix(cam_mat);
+
+// m_rasterizer->SetProjectionMatrix(cam->GetProjectionMatrix());
+// cam->NodeSetLocalOrientation(locRot[i]*cam_node_ori);
+// cam->GetSGNode()->RelativeRotate(locRot[i],true);
+// cam->NodeUpdateGS(0,true);
+// MT_Matrix4x4 cam_MM = cam->GetModelviewMatrix();
+// cam_MM *= locRot_4[i];
+// cam->SetModelviewMatrix(cam_MM);
+// printf("Rotating Camera !!!!!!\n");
+
+}
+void KX_KetsjiEngine::DomeRotateView(KX_Camera* cam, int i, MT_Matrix4x4 cam_mat){
+//Mix MatrixMethod
+//changing camera
+// MT_Matrix4x4 cam_mat = cam->GetModelviewMatrix();
+ cam_mat = cam->GetModelviewMatrix();
+
+
+ MT_Vector3 vu = MT_Vector3 (cam_mat[1][0], cam_mat[1][1], cam_mat[1][2]); // view up vector
+ MT_Vector3 vd = MT_Vector3 (cam_mat[2][0], cam_mat[2][1], cam_mat[2][2]); // view direction
+ MT_Vector3 vp = MT_Vector3 (cam_mat[3][0], cam_mat[3][1], cam_mat[3][2]); // view position
+
+ vp = cam->NodeGetWorldPosition();
+
+// cam->SetModelviewMatrix(cam_mat);
+
+ MT_Vector3 vr; // view right vector
+ MT_Vector3 vl; // view left vector
+
+ MT_Vector3 vright;
+ MT_Vector3 vleft;
+
+ vd.normalize();
+ vu.normalize();
+
+ vr = MT_cross(vu, vd);
+ vr.normalize();
+
+ vl = MT_cross(vd, vu);
+ vl.normalize();
+
+ vright = vr - vd;
+ vleft = vl - vd;
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(90.0,1.0,cam->GetCameraNear(),cam->GetCameraFar());
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ MT_Matrix3x3 m_lookAt;
+ switch (i){
+ case 0: //top
+ m_lookAt = MT_Matrix3x3(vp[0],vp[1],vp[2],(vp[0]+vu[0]),(vp[1]+vu[1]),(vp[2]+vu[2]),-vright[0],-vright[1],-vright[2]);
+ gluLookAt(vp[0],vp[1],vp[2],(vp[0]+vu[0]),(vp[1]+vu[1]),(vp[2]+vu[2]),-vright[0],-vright[1],-vright[2]);
+ break;
+ case 1: //bottom
+ m_lookAt = MT_Matrix3x3(vp[0],vp[1],vp[2],(vp[0]-vu[0]),(vp[1]-vu[1]),(vp[2]-vu[2]),-vleft[0],-vleft[1],-vleft[2]);
+ gluLookAt(vp[0],vp[1],vp[2],(vp[0]-vu[0]),(vp[1]-vu[1]),(vp[2]-vu[2]),-vleft[0],-vleft[1],-vleft[2]);
+ break;
+ case 2: // left
+ m_lookAt = MT_Matrix3x3(vp[0],vp[1],vp[2],(vp[0] +vleft[0]),(vp[1] +vleft[1]),(vp[2]+vleft[2]),vu[0], vu[1], vu[2]);
+ gluLookAt(vp[0],vp[1],vp[2],(vp[0] +vleft[0]),(vp[1] +vleft[1]),(vp[2]+vleft[2]),vu[0], vu[1], vu[2]);
+ break;
+ case 3: // right
+ m_lookAt = MT_Matrix3x3(vp[0],vp[1],vp[2],(vp[0]+vright[0]),(vp[1]+vright[1]),(vp[2]+vright[2]),vu[0],vu[1],vu[2]);
+ gluLookAt(vp[0],vp[1],vp[2],(vp[0]+vright[0]),(vp[1]+vright[1]),(vp[2]+vright[2]),vu[0],vu[1],vu[2]);
+ break;
+ default:
+ gluLookAt(vp[0],vp[1],vp[2],(vp[0]+vd[0]),(vp[1]+vd[1]),(vp[2]+vd[2]),vu[0],vu[1],vu[2]);
+ break;
+ };
+
+ // implementing a manual gluLookAt()
+ MT_Vector3 m_vd = m_lookAt[1];
+ MT_Vector3 m_vu = m_lookAt[2];
+
+ MT_Vector3 f = m_vd - vp;
+ MT_Vector3 s = f * m_vu;
+ MT_Vector3 u = s * f;
+
+ MT_Matrix4x4 n_cam_mat = MT_Matrix4x4(s[0], s[1], s[2], 0.0,
+ u[0], u[1], u[2], 0.0,
+ -f[0],-f[1],-f[2], 0.0,
+ 0.0, 0.0, 0.0, 0.0);
+ n_cam_mat = cam_mat * n_cam_mat;
+
+// glMatrixMode(GL_MODELVIEW);
+// glLoadIdentity();
+// glMultMatrixfv(n_cam_mat);
+//
+// cam->SetModelviewMatrix(n_cam_mat);
+// m_rasterizer->SetViewMatrix(n_cam_mat, cam->NodeGetWorldPosition(), cam->GetCameraLocation(), cam->GetCameraOrientation());
+
+}
+/*
+void DomeRotateView(KX_Camera* cam, int i){
+//Mix MatrixMethod
+ MT_Matrix4x4 cam_mat = cam->GetModelviewMatrix();
+
+ MT_Vector3 vu = MT_Vector3 (cam_mat[1][0], cam_mat[1][1], cam_mat[1][2]); // view up vector
+ MT_Vector3 vd = MT_Vector3 (cam_mat[2][0], cam_mat[2][1], cam_mat[2][2]); // view direction
+ MT_Vector3 vp = MT_Vector3 (cam_mat[3][0], cam_mat[3][1], cam_mat[3][2]); // view position
+ MT_Vector3 aup = MT_Vector3 (0.0,0.0,1.0);
+
+ vp = cam->NodeGetWorldPosition();
+
+// cam->SetModelviewMatrix(cam_mat);
+
+ MT_Vector3 vr; // view right vector
+ MT_Vector3 vl; // view left vector
+
+ MT_Vector3 vright;
+ MT_Vector3 vleft;
+
+ vd.normalize();
+ vu.normalize();
+
+ vr = MT_cross(vu, vd);
+ vr.normalize();
+
+ vl = MT_cross(vd, vu);
+ vl.normalize();
+
+ vright = vr - vd;
+ vleft = vl - vd;
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(90.0,1.0,cam->GetCameraNear(),cam->GetCameraFar());
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ switch (i){
+ case 0: //top
+ gluLookAt(vp[0],vp[1],vp[2],(vp[0]+vu[0]),(vp[1]+vu[1]),(vp[2]+vu[2]),-vright[0],-vright[1],-vright[2]);
+ break;
+ case 1: //bottom
+ gluLookAt(vp[0],vp[1],vp[2],(vp[0]-vu[0]),(vp[1]-vu[1]),(vp[2]-vu[2]),-vleft[0],-vleft[1],-vleft[2]);
+ break;
+ case 2: // left
+ gluLookAt(vp[0],vp[1],vp[2],(vp[0] +vleft[0]),(vp[1] +vleft[1]),(vp[2]+vleft[2]),vu[0], vu[1], vu[2]);
+ break;
+ case 3: // right
+ gluLookAt(vp[0],vp[1],vp[2],(vp[0]+vright[0]),(vp[1]+vright[1]),(vp[2]+vright[2]),vu[0],vu[1],vu[2]);
+ break;
+ default:
+ gluLookAt(vp[0],vp[1],vp[2],(vp[0]+vd[0]),(vp[1]+vd[1]),(vp[2]+vd[2]),vu[0],vu[1],vu[2]);
+ break;
+ };
+}
+*/
+void DomeRotateViewPaul(KX_Camera* cam, int i){
+//PaulBourke
+// SetViewMatrix(viewmat, m_camera->NodeGetWorldPosition(),
+// m_camera->GetCameraLocation(), m_camera->GetCameraOrientation());
+
+ MT_Matrix3x3 camOrientMat3x3(cam->GetCameraOrientation());
+
+// MT_Matrix3x3 camOrientMat3x3(cam->NodeGetWorldOrientation());
+
+// MT_Vector3 unitViewDir(0.0, -1.0, 0.0); // minus y direction, Blender convention
+ MT_Vector3 unitViewDir(0.0, -1.0, 0.0); // minus y direction, Blender convention
+ MT_Vector3 unitViewupVec(0.0, 0.0, 1.0);
+ MT_Vector3 viewDir, viewupVec;
+ MT_Vector3 viewcrossleftVec, viewcrossrightVec;
+ MT_Vector3 viewleftVec, viewrightVec;
+ MT_Vector3 viewPos = cam->NodeGetWorldPosition();
+
+ // actual viewDir
+ viewDir = camOrientMat3x3 * unitViewDir; // this is the moto convention, vector on right hand side
+ // actual viewup vec
+ viewupVec = camOrientMat3x3 * unitViewupVec;
+
+ // vector left to the camera
+ viewcrossleftVec = viewupVec.cross(viewDir);
+
+ // vector right to the camera
+ viewcrossrightVec = viewDir.cross(viewupVec);
+
+ //I don't think I really need a safe_normalized here (a regular normalized should work)
+ viewDir.safe_normalized();
+ viewupVec.safe_normalized();
+ viewcrossrightVec.safe_normalized();
+ viewcrossleftVec.safe_normalized();
+
+ viewrightVec = viewcrossrightVec + viewDir;
+ viewleftVec = viewcrossleftVec + viewDir;
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(90.0,1.0,cam->GetCameraNear(),cam->GetCameraFar());
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ switch (i){
+ case 0:
+ gluLookAt(viewPos[0],viewPos[1],viewPos[2],(viewPos[0] +viewleftVec[0]),(viewPos[1] +viewleftVec[1]),(viewPos[2]+viewleftVec[2]),viewupVec[0], viewupVec[1], viewupVec[2]);
+ break;
+ case 1:
+ gluLookAt(viewPos[0],viewPos[1],viewPos[2],(viewPos[0]+viewrightVec[0]),(viewPos[1]+viewrightVec[1]),(viewPos[2]+viewrightVec[2]),viewupVec[0],viewupVec[1],viewupVec[2]);
+ break;
+ case 2:
+ gluLookAt(viewPos[0],viewPos[1],viewPos[2],(viewPos[0]+viewupVec[0]),(viewPos[1]+viewupVec[1]),(viewPos[2]+viewupVec[2]),-viewrightVec[0],-viewrightVec[1],-viewrightVec[2]);
+ break;
+ case 3:
+ gluLookAt(viewPos[0],viewPos[1],viewPos[2],(viewPos[0]-viewupVec[0]),(viewPos[1]-viewupVec[1]),(viewPos[2]-viewupVec[2]),-viewleftVec[0],-viewleftVec[1],-viewleftVec[2]);
+ break;
+ case 4:
+ gluLookAt(viewPos[0],viewPos[1],viewPos[2],(viewPos[0]-viewupVec[0]),(viewPos[1]-viewupVec[1]),(viewPos[2]-viewupVec[2]),-viewleftVec[0],-viewleftVec[1],-viewleftVec[2]);
+ break;
+ case 5:
+ gluLookAt(viewPos[0],viewPos[1],viewPos[2],(viewPos[0] +viewDir[0]),(viewPos[1] +viewDir[1]),(viewPos[2]+viewDir[2]),viewupVec[0], viewupVec[1], viewupVec[2]);
+ break;
+ };
+
+
+// MT_Scalar glviewmat[16];
+// m_viewmatrix.getValue(glviewmat);
+
+// glMatrixMode(GL_MODELVIEW);
+// glLoadMatrixd(glviewmat);
+}
+void DomeRotateViewOld(KX_Camera* cam, int i){
+
+ MT_Matrix4x4 cam_mat = cam->GetModelviewMatrix();
+
+ MT_Vector3 vu = MT_Vector3 (cam_mat[1][0], cam_mat[1][1], cam_mat[1][2]); // view up vector
+ MT_Vector3 vd = MT_Vector3 (cam_mat[2][0], cam_mat[2][1], cam_mat[2][2]); // view direction
+ MT_Vector3 vp = MT_Vector3 (cam_mat[3][0], cam_mat[3][1], cam_mat[3][2]); // view position
+
+// cam_mat[3][0] += 10.0;
+
+// cam->SetModelviewMatrix(cam_mat);
+
+ MT_Vector3 vr; // view right vector
+ MT_Vector3 vl; // view left vector
+
+ MT_Vector3 vright;
+ MT_Vector3 vleft;
+
+ /* vp = view position */
+ MT_Point3 pos = cam->NodeGetWorldPosition();
+ MT_Point3 ori = MT_Point3 (0.0, 0.0, 0.0);
+// vp = pos - ori;
+// vp = cam->GetCameraLocation()
+// vp = cam->NodeGetWorldPosition();
+
+ /* vu - view up vector */
+// MT_Matrix3x3 worldori = cam->NodeGetWorldOrientation();
+// vu = cam->PyGetAxisVect(0.0,0.0,1.0);
+// vu = worldori * (pos - ori);
+
+ /* vd - view direction */
+// vd = pos - ori;
+
+ vd.safe_normalized();
+ vu.safe_normalized();
+
+ vr = MT_cross(vd, vu);
+ vr.safe_normalized();
+
+ vl = MT_cross(vu, vd);
+ vl.safe_normalized();
+
+ vright = vr + vd;
+ vleft = vl + vd;
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(90.0,1.0,cam->GetCameraNear(),cam->GetCameraFar());
+
+// GLdouble vp_x = (GLdouble *)vp.x;
+
+ MT_Matrix3x3 locRot [6] = {
+ MT_Matrix3x3( 0.0, 1.0, 0.0, // 90º - Left
+ -1.0, 0.0, 0.0,
+ 0.0, 0.0, 1.0),
+ MT_Matrix3x3( 0.0,-1.0, 0.0, // 90º - Right
+ 1.0, 0.0, 0.0,
+ 0.0, 0.0, 1.0),
+ MT_Matrix3x3( 0.0, 0.0, 1.0, // 90º - Bottom
+ 0.0,-1.0, 0.0,
+ 1.0, 0.0, 0.0),
+ MT_Matrix3x3( 0.0, 0.0,-1.0, // 90º - Top
+ 0.0,-1.0, 0.0,
+ -1.0, 0.0, 0.0),
+ MT_Matrix3x3( 1.0, 0.0, 0.0, // 0º - Front
+ 0.0, 1.0, 0.0,
+ 0.0, 0.0, 1.0),
+ MT_Matrix3x3(-1.0, 0.0, 0.0, // 180º - Back
+ 0.0,-1.0, 0.0,
+ 0.0, 0.0, 1.0)
+ };
+ GLfloat directions[] = {
+ 0.0, 0.0, -1.0,
+ 0.0, 0.0, 1.0,
+ 0.0, -1.0, 0.0,
+ 0.0, 1.0, 0.0,
+ -1.0, 0.0, 0.0,
+ 1.0, 0.0, 0.0
+ };
+ GLfloat ups[] = {
+ 0.0, -1.0, 0.0,
+ 0.0, -1.0, 0.0,
+ 0.0, 0.0, -1.0,
+ 0.0, 0.0, 1.0,
+ 0.0, -1.0, 0.0,
+ 0.0, -1.0, 0.0
+ };/*
+ GLfloat ups[] = {
+ 0.0, 1.0, 0.0,
+ 0.0, 1.0, 0.0,
+ 0.0, 0.0, 1.0,
+ 0.0, 0.0, -1.0,
+ 0.0, 1.0, 0.0,
+ 0.0, 1.0, 0.0
+ };*/
+ //hand-rotating the camera
+// gluLookAt(locRot[i][0][0],locRot[i][0][1],locRot[i][0][2],locRot[i][1][0],locRot[i][1][1],locRot[i][1][2],locRot[i][2][0],locRot[i][2][1],locRot[i][2][2]);
+
+ GLfloat *direction = directions;
+ GLfloat *up = ups;
+
+ //counter
+ direction += 3*i;
+ up += 3*i;
+
+ gluLookAt(0.0, 0.0, 0.0, direction[0], direction[1], direction[2],
+ up[0], up[1], up[2]);
+
+ float vp_x = vp[0];
+/*
+ switch (i){
+ case 0:
+// gluLookAt(locRot[0][0],locRot[0][1],locRot[0][3],locRot[0][4],locRot[0][5],locRot[0][6],locRot[0][7],locRot[0][8]);
+ gluLookAt(vp[0],vp[1],vp[2],(vp[0] +vleft[0]),(vp[1] +vleft[1]),(vp[2]+vleft[2]),vu[0], vu[1], vu[2]);
+ break;
+ case 1:
+ gluLookAt(vp[0],vp[1],vp[2],(vp[0]+vright[0]),(vp[1]+vright[1]),(vp[2]+vright[2]),vu[0],vu[1],vu[2]);
+ break;
+ case 2:
+ gluLookAt(vp[0],vp[1],vp[2],(vp[0]+vu[0]),(vp[1]+vu[1]),(vp[2]+vu[2]),-vright[0],-vright[1],-vright[2]);
+ break;
+ case 3:
+ gluLookAt(vp[0],vp[1],vp[2],(vp[0]-vu[0]),(vp[1]-vu[1]),(vp[2]-vu[2]),-vleft[0],-vleft[1],-vleft[2]);
+ break;
+ };*/
+}
+void DomeBindImages(GLuint viewport[4], int i){
+
+ // Storing the cubemap image
+// glBindTexture(GL_TEXTURE_CUBE_MAP, DomeFaces);
+// glCopyTexImage2D(DomeFaceTarget[i], 0, GL_RGBA8, 0, 0, DomeFaceSize, DomeFaceSize, 0);
+
+ //storing the plane image (for tests)
+ glBindTexture(GL_TEXTURE_2D, DomeFaces[i]);
+// glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 0, 0, viewport[2], viewport[3], 0);
+ glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 0, 0, DomeFaceSize, DomeFaceSize, 0);
+}
+void KX_KetsjiEngine::RenderDomeFrame(KX_Scene* scene, KX_Camera* cam)
+{
+ //routine to render the dome
+ const RAS_IRasterizer::StereoMode stereomode = m_rasterizer->GetStereoMode();
+ GLuint viewport[4]={0};
+ glGetIntegerv(GL_VIEWPORT,(GLint *)viewport);
+ unsigned int m_viewport[4] = {viewport[0], viewport[1], viewport[2], viewport[3]};
+
+ //tmp disabling culling
+ cam->SetFrustumCulling(false);
+// KX_Dome my_dome = KX_Dome(scene,cam);
+// KX_Dome *kx_dome = &my_dome;
+
+ //the initial orientation of the camera
+ MT_Matrix4x4 cam_mat = cam->GetModelviewMatrix();
+// cam->SetModelviewMatrix(cam_mat);
+ MT_Matrix4x4 cam_mat_b = cam->GetModelviewMatrix();
+
+ DomePreRender(scene,cam);
+ for (int i=0;i<4;i++){
+ DomeRotateView(cam, i, cam_mat);
+// DomeRotateCamera(cam, i);
+ DomeRenderRoutine(scene, cam);
+ DomeBindImages(viewport, i);
+ }
+// cam->SetModelviewMatrix(cam_mat);
+ DomePostRender(scene,cam,stereomode);
+ m_canvas->EndFrame();
+// m_dome->Dome_CubeCreate(1); // in Dome.cpp
+ m_dome->Dome_CubeDraw(m_viewport,DomeFaces[0]);
+ //DomeDraw(m_viewport, DomeFaces);
+}
+void KX_KetsjiEngine::DomePreRender(KX_Scene* m_scene, KX_Camera* m_camera)
+{
+ // The final one
+ RAS_FrameFrustum frustrum;
+// const RAS_IRasterizer::StereoMode stereomode = m_rasterizer->GetStereoMode();
+
+ //Set the viewport to be of the size of the Dome face
+ m_canvas->SetViewPort(0,0, DomeFaceSize, DomeFaceSize);
+ m_canvas->ClearColor(m_overrideFrameColorR,m_overrideFrameColorB,m_overrideFrameColorB,1.0);
+
+ m_rasterizer->BeginFrame(RAS_IRasterizer::KX_TEXTURED,GetClockTime());
+ m_rendertools->BeginFrame(m_rasterizer);
+ SetWorldSettings(m_scene->GetWorldInfo());
+ m_rendertools->SetAuxilaryClientInfo(m_scene);
+ m_rasterizer->SetStereoMode(RAS_IRasterizer::RAS_STEREO_NOSTEREO);
+
+ m_rasterizer->DisplayFog();
+
+ if (m_camera->hasValidProjectionMatrix())
+ {
+ m_rasterizer->SetProjectionMatrix(m_camera->GetProjectionMatrix());
+ } else
+ {
+ float lens = m_camera->GetLens();
+ bool orthographic = !m_camera->GetCameraData()->m_perspective;
+ float nearfrust = m_camera->GetCameraNear();
+ float farfrust = m_camera->GetCameraFar();
+ float aspect_ratio = 1.0f;
+
+
+ RAS_FramingManager::ComputeDefaultFrustum(
+ nearfrust,
+ farfrust,
+ lens,
+ aspect_ratio,
+ frustrum);
+
+ MT_Matrix4x4 projmat = m_rasterizer->GetFrustumMatrix(
+ frustrum.x1, frustrum.x2, frustrum.y1, frustrum.y2, frustrum.camnear, frustrum.camfar);
+
+ m_camera->SetProjectionMatrix(projmat);
+ }
+
+ MT_Transform camtrans(m_camera->GetWorldToCamera());
+ MT_Matrix4x4 viewmat(camtrans);
+
+ m_rasterizer->SetViewMatrix(viewmat, m_camera->NodeGetWorldPosition(),
+ m_camera->GetCameraLocation(), m_camera->GetCameraOrientation());
+ m_camera->SetModelviewMatrix(viewmat);
+
+ m_scene->UpdateMeshTransformations();
+}
+void KX_KetsjiEngine::DomeRenderRoutine(KX_Scene* m_scene, KX_Camera* m_camera)
+{
+ MT_Transform camtrans(m_camera->GetWorldToCamera());
+ m_canvas->ClearColor(m_overrideFrameColorR,m_overrideFrameColorB,m_overrideFrameColorB,1.0);
+ m_canvas->ClearBuffer(RAS_ICanvas::COLOR_BUFFER|RAS_ICanvas::DEPTH_BUFFER);
+
+ m_scene->CalculateVisibleMeshes(m_rasterizer,m_camera);
+ m_scene->RenderBuckets(camtrans, m_rasterizer, m_rendertools);
+}
+void KX_KetsjiEngine::DomePostRender(KX_Scene* m_scene, KX_Camera* m_camera, RAS_IRasterizer::StereoMode stereomode)
+{
+ m_rasterizer->SetStereoMode(stereomode);
+ //restore glViewport();
+ //restore glScissor();
+// m_canvas->SetViewport(viewport[0], viewport[1], viewport[2], viewport[3]);
+}
+void KX_KetsjiEngine::DomeImageRender(KX_Scene* m_scene, KX_Camera* m_camera)
+{
+ RAS_FrameFrustum frustrum;
+ const RAS_IRasterizer::StereoMode stereomode = m_rasterizer->GetStereoMode();
+
+ // The screen area that ImageViewport will copy is also the rendering zone
+// m_canvas->SetViewPort(m_position[0], m_position[1], m_position[0]+m_capSize[0]-1, m_position[1]+m_capSize[1]-1);
+ // m_canvas->ClearColor(m_background[0], m_background[1], m_background[2], m_background[3]);
+ m_canvas->SetViewPort(0, 0, m_canvas->GetWidth(), m_canvas->GetHeight());
+ m_canvas->ClearColor(m_overrideFrameColorR,m_overrideFrameColorB,m_overrideFrameColorB,1.0);
+
+ m_canvas->ClearBuffer(RAS_ICanvas::COLOR_BUFFER|RAS_ICanvas::DEPTH_BUFFER);
+// m_rasterizer->BeginFrame(RAS_IRasterizer::KX_TEXTURED,m_engine->GetClockTime());
+ m_rasterizer->BeginFrame(RAS_IRasterizer::KX_TEXTURED,GetClockTime());
+ m_rendertools->BeginFrame(m_rasterizer);
+// m_engine->SetWorldSettings(m_scene->GetWorldInfo());
+ SetWorldSettings(m_scene->GetWorldInfo());
+ m_rendertools->SetAuxilaryClientInfo(m_scene);
+ m_rasterizer->DisplayFog();
+ // matrix calculation, don't apply any of the stereo mode
+ m_rasterizer->SetStereoMode(RAS_IRasterizer::RAS_STEREO_NOSTEREO);
+
+ if (m_camera->hasValidProjectionMatrix())
+ {
+ m_rasterizer->SetProjectionMatrix(m_camera->GetProjectionMatrix());
+ } else
+ {
+ float lens = m_camera->GetLens();
+ bool orthographic = !m_camera->GetCameraData()->m_perspective;
+ float nearfrust = m_camera->GetCameraNear();
+ float farfrust = m_camera->GetCameraFar();
+ float aspect_ratio = 1.0f;
+// Scene *blenderScene = m_scene->GetBlenderScene();
+
+ // compute the aspect ratio from frame blender scene settings so that render to texture
+ // works the same in Blender and in Blender player
+ // if (blenderScene->r.ysch != 0)
+ // aspect_ratio = float(blenderScene->r.xsch) / float(blenderScene->r.ysch);
+
+ RAS_FramingManager::ComputeDefaultFrustum(
+ nearfrust,
+ farfrust,
+ lens,
+ aspect_ratio,
+ frustrum);
+
+ MT_Matrix4x4 projmat = m_rasterizer->GetFrustumMatrix(
+ frustrum.x1, frustrum.x2, frustrum.y1, frustrum.y2, frustrum.camnear, frustrum.camfar);
+
+ m_camera->SetProjectionMatrix(projmat);
+ }
+
+ MT_Transform camtrans(m_camera->GetWorldToCamera());
+// if (!m_camera->GetCameraData()->m_perspective)
+// camtrans.getOrigin()[2] *= ortho;
+ MT_Matrix4x4 viewmat(camtrans);
+
+ m_rasterizer->SetViewMatrix(viewmat, m_camera->NodeGetWorldPosition(),
+ m_camera->GetCameraLocation(), m_camera->GetCameraOrientation());
+ m_camera->SetModelviewMatrix(viewmat);
+ // restore the stereo mode now that the matrix is computed
+ m_rasterizer->SetStereoMode(stereomode);
+
+ // do not update the mesh, we don't want to do it more than once per frame
+ //m_scene->UpdateMeshTransformations();
+
+ m_scene->CalculateVisibleMeshes(m_rasterizer,m_camera);
+
+ m_scene->RenderBuckets(camtrans, m_rasterizer, m_rendertools);
+}
+void KX_KetsjiEngine::DomeOriginalRender()
+{
KX_Scene* firstscene = *m_scenes.begin();
const RAS_FrameSettings &framesettings = firstscene->GetFramingType();

@@ -737,9 +1592,567 @@

EndFrame();
}
+void KX_KetsjiEngine::oldDomeRender(KX_Scene* scene, KX_Camera* cam)
+{
+ //old file
+ /*
+ Render (call Render)
+ copy (Bind);
+ rotate;
+ Render (call Render)
+ copy (Bind);
+ Render (call Render)
+ copy (Bind);
+ Draw
+ */

+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

+ bool override_camera;
+ RAS_Rect viewport, area;
+ float left, right, bottom, top, nearfrust, farfrust, focallength;
+ const float ortho = 100.0;
+// KX_Camera* cam = scene->GetActiveCamera();
+
+ if (!cam)
+ return;

+ GetSceneViewport(scene, cam, area, viewport);
+
+ // store the computed viewport in the scene
+ scene->SetSceneViewport(viewport);
+
+ // set the viewport for this frame and scene
+ m_canvas->SetViewPort(viewport.GetLeft(), viewport.GetBottom(),
+ viewport.GetRight(), viewport.GetTop());
+
+ // see KX_BlenderMaterial::Activate
+ //m_rasterizer->SetAmbient();
+ m_rasterizer->DisplayFog();
+
+ override_camera = m_overrideCam && (scene->GetName() == m_overrideSceneName);
+ override_camera = override_camera && (cam->GetName() == "__default__cam__");
+
+ if (override_camera && m_overrideCamUseOrtho) {
+ MT_CmMatrix4x4 projmat = m_overrideCamProjMat;
+ m_rasterizer->SetProjectionMatrix(projmat);
+ } else if (cam->hasValidProjectionMatrix() && !cam->GetViewport() )
+ {
+ m_rasterizer->SetProjectionMatrix(cam->GetProjectionMatrix());
+ } else
+ {
+ RAS_FrameFrustum frustum;
+ float lens = cam->GetLens();
+ nearfrust = cam->GetCameraNear();
+ farfrust = cam->GetCameraFar();
+ focallength = cam->GetFocalLength();
+
+ if(override_camera) {
+ nearfrust = m_overrideCamNear;
+ farfrust = m_overrideCamFar;
+ }
+
+ RAS_FramingManager::ComputeFrustum(
+ scene->GetFramingType(),
+ area,
+ viewport,
+ lens,
+ nearfrust,
+ farfrust,
+ frustum
+ );
+
+ left = frustum.x1 * m_cameraZoom;
+ right = frustum.x2 * m_cameraZoom;
+ bottom = frustum.y1 * m_cameraZoom;
+ top = frustum.y2 * m_cameraZoom;
+ nearfrust = frustum.camnear;
+ farfrust = frustum.camfar;
+
+ MT_Matrix4x4 projmat = m_rasterizer->GetFrustumMatrix(
+ left, right, bottom, top, nearfrust, farfrust, focallength);
+
+ cam->SetProjectionMatrix(projmat);
+
+ }
+
+ MT_Transform camtrans(cam->GetWorldToCamera());
+ if (!cam->GetCameraData()->m_perspective)
+ camtrans.getOrigin()[2] *= ortho;
+ MT_Matrix4x4 viewmat(camtrans);
+
+ scene->UpdateMeshTransformations();
+
+ MT_Quaternion cam_ori = cam->GetCameraOrientation();
+ MT_Matrix3x3 cam_node_ori = cam->GetSGNode()->GetLocalOrientation();
+ MT_Matrix3x3 gloOri = cam->NodeGetWorldOrientation().inverse();
+// MT_Matrix3x3 gloOri = cam->NodeGetWorldOrientation();
+
+
+ MT_Matrix3x3 locRot [6] = {
+ MT_Matrix3x3( 1.0, 0.0, 0.0, // 0º - Front
+ 0.0, 1.0, 0.0,
+ 0.0, 0.0, 1.0),
+ MT_Matrix3x3(-1.0, 0.0, 0.0, // 180º - Back
+ 0.0,-1.0, 0.0,
+ 0.0, 0.0, 1.0),
+ MT_Matrix3x3( 0.0, 1.0, 0.0, // 90º - Left
+ -1.0, 0.0, 0.0,
+ 0.0, 0.0, 1.0),
+ MT_Matrix3x3( 0.0,-1.0, 0.0, // 90º - Right
+ 1.0, 0.0, 0.0,
+ 0.0, 0.0, 1.0),
+ MT_Matrix3x3( 0.0, 0.0,-1.0, // 90º - Top
+ 0.0, 1.0, 0.0,
+ 1.0, 0.0, 0.0),
+ MT_Matrix3x3( 0.0, 0.0, 1.0, // 90º - Bottom
+ 0.0, 1.0, 0.0,
+ -1.0, 0.0, 0.0)
+ };
+
+ glEnable(GL_TEXTURE_2D);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ for (int i = 0;i<6;i++){
+
+ // cam->NodeSetLocalOrientation(locRot*gloOri);
+
+ // cam->NodeSetLocalOrientation(locRot[i]*cam->GetSGNode()->GetLocalOrientation());
+ cam->NodeSetLocalOrientation(locRot[i]*cam_node_ori);
+ // scene->UpdateMeshTransformations();
+
+ //// RenderDomeCamera(scene, cam, viewmat, camtrans, rotn180);
+
+/* Code from the top */
+
+ GetSceneViewport(scene, cam, area, viewport);
+
+ // store the computed viewport in the scene
+ scene->SetSceneViewport(viewport);
+
+ // set the viewport for this frame and scene
+ m_canvas->SetViewPort(viewport.GetLeft(), viewport.GetBottom(),
+ viewport.GetRight(), viewport.GetTop());
+
+ RAS_FrameFrustum frustum;
+ float lens = cam->GetLens();
+ nearfrust = cam->GetCameraNear();
+ farfrust = cam->GetCameraFar();
+ focallength = cam->GetFocalLength();
+
+ if(override_camera) {
+ nearfrust = m_overrideCamNear;
+ farfrust = m_overrideCamFar;
+ }
+
+ RAS_FramingManager::ComputeFrustum(
+ scene->GetFramingType(),
+ area,
+ viewport,
+ lens,
+ nearfrust,
+ farfrust,
+ frustum
+ );
+
+ left = frustum.x1 * m_cameraZoom;
+ right = frustum.x2 * m_cameraZoom;
+ bottom = frustum.y1 * m_cameraZoom;
+ top = frustum.y2 * m_cameraZoom;
+ nearfrust = frustum.camnear;
+ farfrust = frustum.camfar;
+
+ MT_Matrix4x4 projmat = m_rasterizer->GetFrustumMatrix(
+ left, right, bottom, top, nearfrust, farfrust, focallength);
+
+ cam->SetProjectionMatrix(projmat);
+
+/* end: Code from the top */
+
+ MT_Transform camtrans_b(cam->GetWorldToCamera());
+ MT_Matrix4x4 viewmat_b(camtrans_b);
+
+ m_rasterizer->SetViewMatrix(viewmat_b, cam->NodeGetWorldPosition(),
+ cam->GetCameraLocation(), cam->GetCameraOrientation());
+
+ // camtrans = cam->GetWorldToCamera();
+ // viewmat = camtrans;
+
+ cam->SetModelviewMatrix(viewmat_b);
+
+
+ scene->CalculateVisibleMeshes(m_rasterizer,cam);
+
+ scene->UpdateMeshTransformations();
+
+ glReadBuffer(GL_BACK);
+ glDrawBuffer(GL_BACK);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ scene->RenderBuckets(camtrans, m_rasterizer, m_rendertools);
+ glFinish();
+
+
+ // save the images
+// glActiveTexture(DomeFacesTmp[i]);
+
+// drawTestTriangle(viewport, i); // test to make each texture different
+
+ glBindTexture(GL_TEXTURE_2D, DomeFacesTmp[i]);
+ glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 0, 0, viewport.GetWidth(), viewport.GetHeight(), 0);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ /*
+ unsigned char *pixels;
+
+ // Allocate memory for the pixel data //
+ if (! (pixels = (unsigned char *)malloc(viewport.GetWidth() * viewport.GetHeight() * 3))) {
+ fprintf(stderr, "not enough memory for pixel data\n");
+ exit(1);
+ }
+
+ // Read the framebuffer content and create a texture using the image data
+ // (glCopyTexImage2D does NOT work for this purpose!) //
+ glReadPixels(viewport.GetLeft(), viewport.GetBottom(), viewport.GetWidth(), viewport.GetHeight(), GL_RGB,
+ GL_UNSIGNED_BYTE, pixels);
+*/
+
+ }
+ /* Copy Color Buffer to EnvMap */
+// glBindTexture(GL_TEXTURE_CUBE_MAP, DomeFaces);
+// for (int i=0;i<6;i++){
+// glCopyTexImage2D(DomeFaceTarget[i], 0, GL_RGBA8, 0, 0, viewport.GetWidth(), viewport.GetHeight(), 0);
+// glCopyTexImage2D(DomeFaceTarget[i], 0, GL_RGBA8, 0, 0, DomeFaceSize, DomeFaceSize, 0);
+
+/*
+ unsigned char *pixels;
+
+ // Allocate memory for the pixel data //
+ if (! (pixels = (unsigned char *)malloc(viewport.GetWidth() * viewport.GetHeight() * 3))) {
+ fprintf(stderr, "not enough memory for pixel data\n");
+ exit(1);
+ }
+
+ // Read the framebuffer content and create a texture using the image data
+ // (glCopyTexImage2D does NOT work for this purpose!) //
+ glReadPixels(viewport.GetLeft(), viewport.GetBottom(), viewport.GetWidth(), viewport.GetHeight(), GL_RGB,
+ GL_UNSIGNED_BYTE, pixels);
+
+ glTexImage2D(DomeFaceTarget[i], 0, GL_RGB, viewport.GetWidth(), viewport.GetHeight(), 0, GL_RGB,
+ GL_UNSIGNED_BYTE, pixels);
+
+*/
+// }
+
+ /* TMP my test */
+ /*
+//XXX
+*/
+// for (int i=0;i<6;i++){
+// glBindTexture(GL_TEXTURE_2D, DomeFacesTmp[i]);
+// glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 0, 0, viewport.GetWidth(), viewport.GetHeight(), 0);
+// }
+//XXX
+
+ /* Drawing the Sphere on top of the screen */
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ /* Making the viewport always square */
+
+ int can_width = viewport.GetWidth();
+ int can_height = viewport.GetHeight();
+
+ float ortho_width, ortho_height;
+
+ if (can_width < can_height){
+ ortho_width = 1.0;
+ ortho_height = (float)can_height/can_width;
+ }else{
+ ortho_width = (float)can_width/can_height;
+ ortho_height = 1.0;
+ }
+ glOrtho((-ortho_width), ortho_width, (-ortho_height), ortho_height, -20.0, 10.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glDisable(GL_DEPTH_TEST);
+ glPolygonMode(GL_FRONT, GL_FILL);
+ glShadeModel(GL_SMOOTH);
+ glDisable(GL_LIGHTING);
+
+// glEnable(GL_TEXTURE_CUBE_MAP_EXT);
+// glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
+/*
+ glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
+ glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
+ glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
+*/
+ glDisable(GL_TEXTURE_2D);
+ glEnable(GL_TEXTURE_CUBE_MAP);
+ glBindTexture(GL_TEXTURE_CUBE_MAP, DomeFaces[0]);
+// glBindTexture(GL_TEXTURE_CUBE_MAP, DomeFaces); // original cubemap call
+
+// DrawDomeSphere(9.0);
+
+ glBegin(GL_TRIANGLES);
+ glColor3f(0.0f ,0.0f, 1.0f);
+ glVertex3f( 0.0f, 0.5f, 4.0f);
+ glColor3f(0.0f ,0.5f, 0.0f);
+ glVertex3f(-0.5f,-0.5f, 4.0f);
+ glColor3f(1.0f ,0.0f, 0.0f);
+ glVertex3f( 0.5f,-0.5f, 4.0f);
+ glEnd();
+
+ glDisable(GL_TEXTURE_CUBE_MAP);
+ glEnable(GL_TEXTURE_2D);
+// glBindTexture(GL_TEXTURE_2D, DomeFaces);
+// glBindTexture(GL_TEXTURE_2D, DomeFacesTmp[0]);
+// glBindTexture(GL_TEXTURE_2D, 7);
+
+// DomeFacesTmp[0] -> GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT
+ glBindTexture(GL_TEXTURE_2D, DomeFacesTmp[0]);
+ glBegin(GL_QUADS);
+ glColor3f(1.0f ,1.0f, 1.0f);
+ glTexCoord2f(1.0,1.0);
+ glVertex3f( -0.35f, 0.8f, 3.0f);
+ glTexCoord2f(0.0,1.0);
+ glVertex3f(-0.95f,0.8f, 3.0f);
+ glTexCoord2f(0.0,0.0);
+ glVertex3f(-0.95f,0.2f, 3.0f);
+ glTexCoord2f(1.0,0.0);
+ glVertex3f(-0.35f,0.2f, 3.0f);
+ glEnd();
+
+// DomeFacesTmp[1] -> GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT
+ glBindTexture(GL_TEXTURE_2D, DomeFacesTmp[1]);
+ glBegin(GL_QUADS);
+ glColor3f(1.0f ,1.0f, 1.0f);
+ glTexCoord2f(1.0,1.0);
+ glVertex3f( -0.35f, -0.2f, 3.0f);
+ glTexCoord2f(0.0,1.0);
+ glVertex3f(-0.95f,-0.2f, 3.0f);
+ glTexCoord2f(0.0,0.0);
+ glVertex3f(-0.95f,-0.8f, 3.0f);
+ glTexCoord2f(1.0,0.0);
+ glVertex3f(-0.35f,-0.8f, 3.0f);
+ glEnd();
+
+// DomeFacesTmp[2] -> GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT
+ glBindTexture(GL_TEXTURE_2D, DomeFacesTmp[2]);
+ glBegin(GL_QUADS);
+ glColor3f(1.0f ,1.0f, 1.0f);
+ glTexCoord2f(1.0,1.0);
+ glVertex3f( 0.3f, 0.8f, 3.0f);
+ glTexCoord2f(0.0,1.0);
+ glVertex3f(-0.3f,0.8f, 3.0f);
+ glTexCoord2f(0.0,0.0);
+ glVertex3f(-0.3f,0.2f, 3.0f);
+ glTexCoord2f(1.0,0.0);
+ glVertex3f(0.3f,0.2f, 3.0f);
+ glEnd();
+
+// DomeFacesTmp[3] -> GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT
+ glBindTexture(GL_TEXTURE_2D, DomeFacesTmp[3]);
+ glBegin(GL_QUADS);
+ glColor3f(1.0f ,1.0f, 1.0f);
+ glTexCoord2f(1.0,1.0);
+ glVertex3f( 0.3f, -0.2f, 3.0f);
+ glTexCoord2f(0.0,1.0);
+ glVertex3f(-0.3f,-0.2f, 3.0f);
+ glTexCoord2f(0.0,0.0);
+ glVertex3f(-0.3f,-0.8f, 3.0f);
+ glTexCoord2f(1.0,0.0);
+ glVertex3f(0.3f,-0.8f, 3.0f);
+ glEnd();
+
+// DomeFacesTmp[4] -> GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT
+ glBindTexture(GL_TEXTURE_2D, DomeFacesTmp[4]);
+ glBegin(GL_QUADS);
+ glColor3f(1.0f ,1.0f, 1.0f);
+ glTexCoord2f(1.0,1.0);
+ glVertex3f( 0.95f, 0.8f, 3.0f);
+ glTexCoord2f(0.0,1.0);
+ glVertex3f( 0.35f,0.8f, 3.0f);
+ glTexCoord2f(0.0,0.0);
+ glVertex3f( 0.35f,0.2f, 3.0f);
+ glTexCoord2f(1.0,0.0);
+ glVertex3f( 0.95f,0.2f, 3.0f);
+ glEnd();
+
+// DomeFacesTmp[5] -> GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT
+ glBindTexture(GL_TEXTURE_2D, DomeFacesTmp[5]);
+ glBegin(GL_QUADS);
+ glColor3f(1.0f ,1.0f, 1.0f);
+ glTexCoord2f(1.0,1.0);
+ glVertex3f( 0.95f, -0.2f, 3.0f);
+ glTexCoord2f(0.0,1.0);
+ glVertex3f(0.35f,-0.2f, 3.0f);
+ glTexCoord2f(0.0,0.0);
+ glVertex3f(0.35f,-0.8f, 3.0f);
+ glTexCoord2f(1.0,0.0);
+ glVertex3f( 0.95f,-0.8f, 3.0f);
+ glEnd();
+
+/*
+ glBegin(GL_QUADS);
+ glTexCoord2f(1.0,1.0);
+ glColor3f(0.0f ,0.0f, 1.0f);
+ glVertex3f( 0.8f, 0.8f, 3.0f);
+ glTexCoord2f(0.0,1.0);
+ glColor3f(0.0f ,0.5f, 0.0f);
+ glVertex3f(-0.8f,0.8f, 3.0f);
+ glTexCoord2f(0.0,0.0);
+ glColor3f(1.0f ,0.0f, 0.0f);
+ glVertex3f(-0.8f,-0.8f, 3.0f);
+ glTexCoord2f(1.0,0.0);
+ glColor3f(0.5f ,0.5f, 0.0f);
+ glVertex3f(0.8f,-0.8f, 3.0f);
+ glEnd();
+*/
+
+ glEnable(GL_DEPTH_TEST);
+
+ PostRenderFrame();
+
+ printf("\nRendering Dome\n");
+}
+
+void KX_KetsjiEngine::Render()
+{
+ KX_Scene* firstscene = *m_scenes.begin();
+ const RAS_FrameSettings &framesettings = firstscene->GetFramingType();
+
+ m_logger->StartLog(tc_rasterizer, m_kxsystem->GetTimeInSeconds(), true);
+
+ // hiding mouse cursor each frame
+ // (came back when going out of focus and then back in again)
+ if (m_hideCursor)
+ m_canvas->SetMouseState(RAS_ICanvas::MOUSE_INVISIBLE);
+
+ // clear the entire game screen with the border color
+ // only once per frame
+ m_canvas->BeginDraw();
+ if (m_drawingmode == RAS_IRasterizer::KX_TEXTURED) {
+ m_canvas->SetViewPort(0, 0, m_canvas->GetWidth(), m_canvas->GetHeight());
+ if (m_overrideFrameColor)
+ {
+ // Do not use the framing bar color set in the Blender scenes
+ m_canvas->ClearColor(
+ m_overrideFrameColorR,
+ m_overrideFrameColorG,
+ m_overrideFrameColorB,
+ 1.0
+ );
+ }
+ else
+ {
+ // Use the framing bar color set in the Blender scenes
+ m_canvas->ClearColor(
+ framesettings.BarRed(),
+ framesettings.BarGreen(),
+ framesettings.BarBlue(),
+ 1.0
+ );
+ }
+ // clear the -whole- viewport
+ m_canvas->ClearBuffer(RAS_ICanvas::COLOR_BUFFER|RAS_ICanvas::DEPTH_BUFFER);
+ }
+
+ m_rasterizer->SetEye(RAS_IRasterizer::RAS_STEREO_LEFTEYE);
+
+ // BeginFrame() sets the actual drawing area. You can use a part of the window
+ if (!BeginFrame())
+ return;
+
+ KX_SceneList::iterator sceneit;
+ for (sceneit = m_scenes.begin();sceneit != m_scenes.end(); sceneit++)
+ // for each scene, call the proceed functions
+ {
+ KX_Scene* scene = *sceneit;
+ KX_Camera* cam = scene->GetActiveCamera();
+ // pass the scene's worldsettings to the rasterizer
+ SetWorldSettings(scene->GetWorldInfo());
+
+ // shadow buffers
+ RenderShadowBuffers(scene);
+
+ // Avoid drawing the scene with the active camera twice when it's viewport is enabled
+ if(cam && !cam->GetViewport())
+ {
+ if (scene->IsClearingZBuffer())
+ m_rasterizer->ClearDepthBuffer();
+
+ m_rendertools->SetAuxilaryClientInfo(scene);
+
+ // do the rendering
+ // dome checking
+ if(m_rasterizer->GetStereoMode()==RAS_IRasterizer::RAS_STEREO_DOME)
+ RenderDomeFrame(scene,cam);
+ else
+ RenderFrame(scene, cam);
+ }
+
+ list<class KX_Camera*>* cameras = scene->GetCameras();
+
+ // Draw the scene once for each camera with an enabled viewport
+ list<KX_Camera*>::iterator it = cameras->begin();
+ while(it != cameras->end())
+ {
+ if((*it)->GetViewport())
+ {
+ if (scene->IsClearingZBuffer())
+ m_rasterizer->ClearDepthBuffer();
+
+ m_rendertools->SetAuxilaryClientInfo(scene);
+
+ // do the rendering
+ if(m_rasterizer->GetStereoMode()==RAS_IRasterizer::RAS_STEREO_DOME)
+ RenderDomeFrame(scene, (*it));
+ else
+ RenderFrame(scene, (*it));
+ }
+
+ it++;
+ }
+ }
+
+ // only one place that checks for stereo
+ if(m_rasterizer->Stereo())
+ {
+ m_rasterizer->SetEye(RAS_IRasterizer::RAS_STEREO_RIGHTEYE);
+
+ if (!BeginFrame())
+ return;
+
+ KX_SceneList::iterator sceneit;
+ for (sceneit = m_scenes.begin();sceneit != m_scenes.end(); sceneit++)
+ // for each scene, call the proceed functions
+ {
+ KX_Scene* scene = *sceneit;
+ KX_Camera* cam = scene->GetActiveCamera();
+
+ // pass the scene's worldsettings to the rasterizer
+ SetWorldSettings(scene->GetWorldInfo());
+
+ if (scene->IsClearingZBuffer())
+ m_rasterizer->ClearDepthBuffer();
+
+ //pass the scene, for picking and raycasting (shadows)
+ m_rendertools->SetAuxilaryClientInfo(scene);
+
+ // do the rendering
+ //RenderFrame(scene);
+ RenderFrame(scene, cam);
+ }
+ } // if(m_rasterizer->Stereo())
+
+ EndFrame();
+}
+
+
+
void KX_KetsjiEngine::RequestExit(int exitrequestmode)
{
m_exitcode = exitrequestmode;
Index: source/gameengine/Ketsji/KX_KetsjiEngine.h
===================================================================
--- source/gameengine/Ketsji/KX_KetsjiEngine.h (revision 18000)
+++ source/gameengine/Ketsji/KX_KetsjiEngine.h (working copy)
@@ -37,6 +37,7 @@
#include "KX_Scene.h"
#include "KX_Python.h"
#include "KX_WorldInfo.h"
+#include "RAS_IRasterizer.h"
#include <vector>
#include <set>

@@ -74,6 +75,7 @@
PyObject* m_pythondictionary;
class SCA_IInputDevice* m_keyboarddevice;
class SCA_IInputDevice* m_mousedevice;
+ class KX_Dome* m_dome; // dome stereo mode

/** Lists of scenes scheduled to be removed at the end of the frame. */
std::set<STR_String> m_removingScenes;
@@ -208,6 +210,31 @@
RAS_ICanvas* GetCanvas(){return m_canvas;};
RAS_IRenderTools* GetRenderTools(){return m_rendertools;};

+ /// Dome functions
+ void InitDome(); //recycled :)
+ void tmpInitDome();
+ void EndDome();
+
+ void RenderDomeFrame(KX_Scene* scene, KX_Camera* cam);
+
+ void DomePreRender(KX_Scene* m_scene, KX_Camera* m_cam);
+ void DomeRenderRoutine(KX_Scene* m_scene, KX_Camera* m_cam);
+ void DomePostRender(KX_Scene* m_scene, KX_Camera* m_cam, RAS_IRasterizer::StereoMode stereomode);
+
+ void DomeRotateView(KX_Camera* cam, int i, MT_Matrix4x4 cam_mat);
+
+
+ //to be deleted::
+ void oldDomeRender(KX_Scene* scene, KX_Camera* cam);
+ void DomeOriginalRender();
+ void DomeImageRender(KX_Scene* m_scene, KX_Camera* m_cam);
+ void RenderDomeCamera(KX_Scene* scene, KX_Camera* cam, MT_Matrix4x4 viewmat, MT_Transform camtrans, MT_Vector3 camrot);
+ void DomeRotateCamera(KX_Camera* cam, int i);
+// void DrawDomeVert(float theta, float phi);
+// void DrawDomeSphere(float del);
+// static const enum DomeFaceTarget;
+
+
///returns true if an update happened to indicate -> Render
bool NextFrame();
void Render();
Index: source/gameengine/Rasterizer/RAS_IRasterizer.h
===================================================================
--- source/gameengine/Rasterizer/RAS_IRasterizer.h (revision 18000)
+++ source/gameengine/Rasterizer/RAS_IRasterizer.h (working copy)
@@ -113,6 +113,7 @@
RAS_STEREO_ANAGLYPH,
RAS_STEREO_SIDEBYSIDE,
RAS_STEREO_VINTERLACE,
+ RAS_STEREO_DOME,

RAS_STEREO_MAXSTEREO
};
Index: source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
===================================================================
--- source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp (revision 18000)
+++ source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp (working copy)
@@ -419,7 +419,7 @@

bool RAS_OpenGLRasterizer::Stereo()
{
- if(m_stereomode == RAS_STEREO_NOSTEREO)
+ if(m_stereomode == RAS_STEREO_NOSTEREO || m_stereomode == RAS_STEREO_DOME)
return false;
else
return true;
  1. Index: source/blender/makesdna/DNA_scene_types.h
  2. ===================================================================
  3. --- source/blender/makesdna/DNA_scene_types.h   (revision 18000)
  4. +++ source/blender/makesdna/DNA_scene_types.h   (working copy)
  5. @@ -310,6 +310,11 @@
  6.         /* cineon */
  7.         short cineonwhite, cineonblack;
  8.         float cineongamma;
  9. +
  10. +       /* Dome variables */
  11. +       float domesize;
  12. +       short domeres, pad0;
  13. +
  14.  } RenderData;
  15.  
  16.  /* control render convert and shading engine */
  17. Index: source/blender/src/buttons_scene.c
  18. ===================================================================
  19. --- source/blender/src/buttons_scene.c  (revision 18000)
  20. +++ source/blender/src/buttons_scene.c  (working copy)
  21. @@ -1820,6 +1820,7 @@
  22.          * RAS_STEREO_ANAGLYPH          5
  23.          * RAS_STEREO_SIDEBYSIDE        6
  24.          * RAS_STEREO_VINTERLACE        7
  25. +        * RAS_STEREO_DOME                      8
  26.          */
  27.         uiBlockBeginAlign(block);
  28.         uiDefButS(block, ROW, 0, "No Stereo", xco, yco-=30, 88, 19, &(G.scene->r.stereomode), 7.0, 1.0, 0, 0, "Disables stereo");
  29. @@ -1828,7 +1829,10 @@
  30.         uiDefButS(block, ROW, 0, "Anaglyph", xco-=180, yco-=21, 88, 19, &(G.scene->r.stereomode), 7.0, 5.0, 0, 0, "Enables anaglyph (Red-Blue) stereo method");
  31.         uiDefButS(block, ROW, 0, "Side by Side", xco+=90, yco, 88, 19, &(G.scene->r.stereomode), 7.0, 6.0, 0, 0, "Enables side by side left and right images");
  32.         uiDefButS(block, ROW, 0, "V Interlace", xco+=90, yco, 88, 19, &(G.scene->r.stereomode), 7.0, 7.0, 0, 0, "Enables interlaced vertical strips for autostereo display");
  33. -       
  34. +       uiDefButS(block, ROW, 0, "Dome 180º", xco-=180, yco-=21, 88, 19, &(G.scene->r.stereomode), 7.0, 8.0, 0, 0, "Enables Dome View");
  35. +       uiDefButF(block, NUM, 0, "Size:",               xco+=90, yco, 88, 19, &G.scene->r.domesize, 1.0, 10.0, 0, 0, "Size of the ENV MAP faces");
  36. +       uiDefButS(block, NUM, 0, "Res:",                xco+=90, yco, 88, 19, &G.scene->r.domeres, 1.0, 5.0, 1.0, 0, "Resolution of the dome - 1 to 50");
  37. +
  38.         uiBlockEndAlign(block);
  39.  
  40.         uiBlockSetDirection(block, UI_TOP);
  41. Index: source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
  42. ===================================================================
  43. --- source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp   (revision 18000)
  44. +++ source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp   (working copy)
  45. @@ -366,6 +366,12 @@
  46.                         initMathutils();
  47.                         initVideoTexture();
  48.  
  49. +                       //initialize Dome Settings
  50. +                       if(blscene->r.stereomode == RAS_IRasterizer::RAS_STEREO_DOME){
  51. +                               ketsjiengine->tmpInitDome();
  52. +                               ketsjiengine->InitDome();
  53. +                       }
  54. +
  55.                         if (sceneconverter)
  56.                         {
  57.                                 // convert and add scene
  58. @@ -403,7 +409,10 @@
  59.                                         if (render)
  60.                                         {
  61.                                                 // render the frame
  62. -                                               ketsjiengine->Render();
  63. +                                               if(blscene->r.stereomode == RAS_IRasterizer::RAS_STEREO_DOME)
  64. +                                                       RenderDome();
  65. +                                               else
  66. +                                                       ketsjiengine->Render();
  67.                                         }
  68.                                        
  69.                                         // test for the ESC key
  70. @@ -430,6 +439,9 @@
  71.                                 printf("\nBlender Game Engine Finished\n\n");
  72.                                 exitstring = ketsjiengine->GetExitString();
  73.  
  74. +                               //finalize Dome Settings
  75. +                               if(blscene->r.stereomode == RAS_IRasterizer::RAS_STEREO_DOME)
  76. +                                       ketsjiengine->EndDome();
  77.  
  78.                                 // when exiting the mainloop
  79.                                
  80. Index: source/gameengine/Ketsji/KX_Camera.cpp
  81. ===================================================================
  82. --- source/gameengine/Ketsji/KX_Camera.cpp      (revision 18000)
  83. +++ source/gameengine/Ketsji/KX_Camera.cpp      (working copy)
  84. @@ -425,7 +425,12 @@
  85.  {
  86.         return m_frustum_culling;
  87.  }
  88. -
  89. +
  90. +void KX_Camera::SetFrustumCulling(bool frustum)
  91. +{
  92. +       m_frustum_culling = frustum;
  93. +}
  94. +
  95.  void KX_Camera::EnableViewport(bool viewport)
  96.  {
  97.         m_camdata.m_viewport = viewport;
  98. Index: source/gameengine/Ketsji/KX_Camera.h
  99. ===================================================================
  100. --- source/gameengine/Ketsji/KX_Camera.h        (revision 18000)
  101. +++ source/gameengine/Ketsji/KX_Camera.h        (working copy)
  102. @@ -220,6 +220,11 @@
  103.          * Gets this camera's culling status.
  104.          */
  105.         bool GetFrustumCulling() const;
  106. +
  107. +       /**
  108. +        * Sets this camera's culling status. (for debug only)
  109. +        */
  110. +       void SetFrustumCulling(bool frustum);
  111.         
  112.         /**
  113.          * Sets this camera's viewport status.
  114. Index: source/gameengine/Ketsji/KX_Dome.cpp
  115. ===================================================================
  116. --- source/gameengine/Ketsji/KX_Dome.cpp        (revision 0)
  117. +++ source/gameengine/Ketsji/KX_Dome.cpp        (revision 0)
  118. @@ -0,0 +1,1346 @@
  119. +/* $Id$
  120. +-----------------------------------------------------------------------------
  121. +
  122. +This program is free software; you can redistribute it and/or modify it under
  123. +the terms of the GNU Lesser General Public License as published by the Free Software
  124. +Foundation; either version 2 of the License, or (at your option) any later
  125. +version.
  126. +
  127. +This program is distributed in the hope that it will be useful, but WITHOUT
  128. +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  129. +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
  130. +
  131. +You should have received a copy of the GNU Lesser General Public License along with
  132. +this program; if not, write to the Free Software Foundation, Inc., 59 Temple
  133. +Place - Suite 330, Boston, MA 02111-1307, USA, or go to
  134. +http://www.gnu.org/copyleft/lesser.txt.
  135. +-----------------------------------------------------------------------------
  136. +*/
  137. +
  138. +// implementation
  139. +
  140. +#include <PyObjectPlus.h>
  141. +#include <structmember.h>
  142. +#include <float.h>
  143. +#include <math.h>
  144. +
  145. +
  146. +#include <BIF_gl.h>
  147. +
  148. +#include "KX_PythonInit.h"
  149. +#include "DNA_scene_types.h"
  150. +#include "RAS_CameraData.h"
  151. +//#include "RAS_MeshObject.h"
  152. +#include "BLI_arithb.h"
  153. +
  154. +#include "KX_Dome.h"
  155. +#include "GL/glew.h"
  156. +#include "GL/glu.h"
  157. +
  158. +//#include "ImageBase.h"
  159. +//#include "BlendType.h"
  160. +//#include "Exception.h"
  161. +//#include "Texture.h"
  162. +
  163. +// constructor
  164. +KX_Dome::KX_Dome (
  165. +       RAS_ICanvas* canvas,
  166. +    /// rasterizer
  167. +    RAS_IRasterizer* rasterizer,
  168. +    /// render tools
  169. +    RAS_IRenderTools* rendertools,
  170. +    /// engine
  171. +    KX_KetsjiEngine* engine
  172. +
  173. +)://KX_Scene * scene, KX_Camera * camera) :
  174. +//    ImageViewport(),
  175. + //   m_render(true),
  176. + //   m_scene(scene),
  177. + //   m_camera(camera),
  178. +//    m_owncamera(false),
  179. +//    m_observer(NULL),
  180. +//    m_mirror(NULL),
  181. +       m_canvas(canvas),
  182. +       m_rasterizer(rasterizer),
  183. +       m_rendertools(rendertools),
  184. +       m_engine(engine),
  185. +       m_clip(100.f)
  186. +{
  187. +       // initialize background colour
  188. +       setBackground(0, 0, 255, 255);
  189. +    // retrieve rendering objects
  190. + //   m_engine = KX_GetActiveEngine();
  191. +//    m_rasterizer = m_engine->GetRasterizer();
  192. +//    m_canvas = m_engine->GetCanvas();
  193. +//    m_rendertools = m_engine->GetRenderTools();
  194. +       cubetop.resize(1);
  195. +       cubebottom.resize(1);
  196. +       cubeleft.resize(2);
  197. +       cuberight.resize(2);
  198. +}
  199. +
  200. +static GLenum DomeFaceTarget [6] = {
  201. +       GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
  202. +       GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
  203. +       GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
  204. +       GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
  205. +       GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
  206. +       GL_TEXTURE_CUBE_MAP_POSITIVE_X
  207. +};
  208. +
  209. +//unsigned int m_DomeFaces;
  210. +unsigned int m_DomeFacesTmp[6]; // tmp to store a single render image
  211. +
  212. +int m_DomeFacesize=512;
  213. +
  214. +// destructor
  215. +KX_Dome::~KX_Dome (void)
  216. +{
  217. +//    if (m_owncamera)
  218. +//        m_camera->Release();
  219. +/*
  220. +       for (int i=0;i<nfacestop;i++){
  221. +               for (int j=0;j<3;j++){
  222. +                       for (int k=0;k<3;k++){
  223. +                               printf("cubetop[%1d].verts[%1d][%1d]:   %2.4f\n", i, j, k, cubetop[i].verts[j][k]);
  224. +//                             cout << cubetop[i].verts[j][k] << std::endl;
  225. +                       }
  226. +               }
  227. +       }
  228. +       */
  229. +}
  230. +
  231. +
  232. +// set background color/
  233. +void KX_Dome::setBackground (int red, int green, int blue, int alpha)
  234. +{
  235. +    m_background[0] = (red < 0) ? 0.f : (red > 255) ? 1.f : float(red)/255.f;
  236. +       m_background[1] = (green < 0) ? 0.f : (green > 255) ? 1.f : float(green)/255.f;
  237. +       m_background[2] = (blue < 0) ? 0.f : (blue > 255) ? 1.f : float(blue)/255.f;
  238. +       m_background[3] = (alpha < 0) ? 0.f : (alpha > 255) ? 1.f : float(alpha)/255.f;
  239. +}
  240. +
  241. +/* my code ::: */
  242. +
  243. +void KX_Dome::Dome_CubeCreate(int cubeRes){
  244. +       int i,j;
  245. +
  246. +       //creating faces for the env mapcube 180º Dome
  247. +       // Top Face - just a triangle
  248. +       cubetop[0].verts[0][0] = -sqrt(2.0) / 2.0;
  249. +       cubetop[0].verts[0][1] = 0.0;
  250. +       cubetop[0].verts[0][2] = 0.5;
  251. +       cubetop[0].u[0] = 0.0;
  252. +       cubetop[0].v[0] = 1.0;
  253. +
  254. +       cubetop[0].verts[1][0] = 0.0;
  255. +       cubetop[0].verts[1][1] = sqrt(2.0) / 2.0;
  256. +       cubetop[0].verts[1][2] = 0.5;
  257. +       cubetop[0].u[1] = 0.0;
  258. +       cubetop[0].v[1] = 0.0;
  259. +
  260. +       cubetop[0].verts[2][0] = sqrt(2.0) / 2.0;
  261. +       cubetop[0].verts[2][1] = 0.0;
  262. +       cubetop[0].verts[2][2] = 0.5;
  263. +       cubetop[0].u[2] = 1.0;
  264. +       cubetop[0].v[2] = 0.0;
  265. +
  266. +       nfacestop = 1;
  267. +
  268. +       /* Bottom face - just a triangle */
  269. +       cubebottom[0].verts[0][0] = -sqrt(2.0) / 2.0;
  270. +       cubebottom[0].verts[0][1] = 0;
  271. +       cubebottom[0].verts[0][2] = -0.5;
  272. +       cubebottom[0].u[0] = 1;
  273. +       cubebottom[0].v[0] = 0;
  274. +
  275. +       cubebottom[0].verts[1][0] = sqrt(2.0) / 2.0;
  276. +       cubebottom[0].verts[1][1] = 0;
  277. +       cubebottom[0].verts[1][2] = -0.5;
  278. +       cubebottom[0].u[1] = 0;
  279. +       cubebottom[0].v[1] = 1;
  280. +
  281. +       cubebottom[0].verts[2][0] = 0;
  282. +       cubebottom[0].verts[2][1] = sqrt(2.0) / 2.0;
  283. +       cubebottom[0].verts[2][2] = -0.5;
  284. +       cubebottom[0].u[2] = 0;
  285. +       cubebottom[0].v[2] = 0;
  286. +
  287. +       nfacesbottom = 1;       
  288. +       
  289. +       /* Left face - two triangles */
  290. +       
  291. +       cubeleft[0].verts[0][0] = -sqrt(2.0) / 2.0;
  292. +       cubeleft[0].verts[0][1] = 0;
  293. +       cubeleft[0].verts[0][2] = -0.5;
  294. +       cubeleft[0].u[0] = 0;
  295. +       cubeleft[0].v[0] = 0;
  296. +
  297. +       cubeleft[0].verts[1][0] = 0;
  298. +       cubeleft[0].verts[1][1] = sqrt(2.0) / 2.0;
  299. +       cubeleft[0].verts[1][2] = -0.5;
  300. +       cubeleft[0].u[1] = 1;
  301. +       cubeleft[0].v[1] = 0;
  302. +
  303. +       cubeleft[0].verts[2][0] = -sqrt(2.0) / 2.0;
  304. +       cubeleft[0].verts[2][1] = 0;
  305. +       cubeleft[0].verts[2][2] = 0.5;
  306. +       cubeleft[0].u[2] = 0;
  307. +       cubeleft[0].v[2] = 1;
  308. +
  309. +       cubeleft[1].verts[0][0] = -sqrt(2.0) / 2.0;
  310. +       cubeleft[1].verts[0][1] = 0;
  311. +       cubeleft[1].verts[0][2] = 0.5;
  312. +       cubeleft[1].u[0] = 0;
  313. +       cubeleft[1].v[0] = 1;
  314. +
  315. +       cubeleft[1].verts[1][0] = 0;
  316. +       cubeleft[1].verts[1][1] = sqrt(2.0) / 2.0;
  317. +       cubeleft[1].verts[1][2] = -0.5;
  318. +       cubeleft[1].u[1] = 1;
  319. +       cubeleft[1].v[1] = 0;
  320. +
  321. +       cubeleft[1].verts[2][0] = 0;
  322. +       cubeleft[1].verts[2][1] = sqrt(2.0) / 2.0;
  323. +       cubeleft[1].verts[2][2] = 0.5;
  324. +       cubeleft[1].u[2] = 1;
  325. +       cubeleft[1].v[2] = 1;
  326. +
  327. +       nfacesleft = 2;
  328. +       
  329. +       /* Right face - two triangles */
  330. +       cuberight[0].verts[0][0] = 0;
  331. +       cuberight[0].verts[0][1] = sqrt(2.0) / 2.0;
  332. +       cuberight[0].verts[0][2] = -0.5;
  333. +       cuberight[0].u[0] = 0;
  334. +       cuberight[0].v[0] = 0;
  335. +
  336. +       cuberight[0].verts[1][0] = sqrt(2.0) / 2.0;
  337. +       cuberight[0].verts[1][1] = 0;
  338. +       cuberight[0].verts[1][2] = -0.5;
  339. +       cuberight[0].u[1] = 1;
  340. +       cuberight[0].v[1] = 0;
  341. +
  342. +       cuberight[0].verts[2][0] = sqrt(2.0) / 2.0;
  343. +       cuberight[0].verts[2][1] = 0;
  344. +       cuberight[0].verts[2][2] = 0.5;
  345. +       cuberight[0].u[2] = 1;
  346. +       cuberight[0].v[2] = 1;
  347. +
  348. +       cuberight[1].verts[0][0] = 0;
  349. +       cuberight[1].verts[0][1] = sqrt(2.0) / 2.0;
  350. +       cuberight[1].verts[0][2] = -0.5;
  351. +       cuberight[1].u[0] = 0;
  352. +       cuberight[1].v[0] = 0;
  353. +
  354. +       cuberight[1].verts[1][0] = sqrt(2.0) / 2.0;
  355. +       cuberight[1].verts[1][1] = 0;
  356. +       cuberight[1].verts[1][2] = 0.5;
  357. +       cuberight[1].u[1] = 1;
  358. +       cuberight[1].v[1] = 1;
  359. +
  360. +       cuberight[1].verts[2][0] = 0;
  361. +       cuberight[1].verts[2][1] = sqrt(2.0) / 2.0;
  362. +       cuberight[1].verts[2][2] = 0.5;
  363. +       cuberight[1].u[2] = 0;
  364. +       cuberight[1].v[2] = 1;
  365. +
  366. +       nfacesright = 2;
  367. +       
  368. +       //Refine a triangular mesh by bisecting each edge forms 3 new triangles for each existing triangle on each iteration
  369. +       //Could be made more efficient for drawing if the triangles were ordered in a fan or strip!
  370. +
  371. +//     cubeRes = 3;
  372. +       for(i=0;i<cubeRes;i++){
  373. +               cubetop.resize(4*nfacestop);
  374. +               Dome_CubeSplitFace(cubetop,&nfacestop);
  375. +               cubebottom.resize(4*nfacesbottom);
  376. +               Dome_CubeSplitFace(cubebottom,&nfacesbottom);   
  377. +               cubeleft.resize(4*nfacesleft);
  378. +               Dome_CubeSplitFace(cubeleft,&nfacesleft);
  379. +               cuberight.resize(4*nfacesright);
  380. +               Dome_CubeSplitFace(cuberight,&nfacesright);
  381. +       }
  382. +
  383. +       // Turn into a hemisphere
  384. +       for(j=0;j<3;j++){
  385. +               for(i=0;i<nfacestop;i++)
  386. +                       cubetop[i].verts[j].normalize();
  387. +               for(i=0;i<nfacesbottom;i++)
  388. +                       cubebottom[i].verts[j].normalize();
  389. +               for(i=0;i<nfacesleft;i++)
  390. +                       cubeleft[i].verts[j].normalize();
  391. +               for(i=0;i<nfacesright;i++)
  392. +                       cuberight[i].verts[j].normalize();
  393. +       }
  394. +       
  395. +       //flatten onto xz plane
  396. +       for(j=0;j<3;j++){
  397. +               for(i=0;i<nfacestop;i++)
  398. +                       Dome_CubeFlatten(cubetop[i].verts[j]);
  399. +               for(i=0;i<nfacesbottom;i++)
  400. +                       Dome_CubeFlatten(cubebottom[i].verts[j]);
  401. +               for(i=0;i<nfacesleft;i++)
  402. +                       Dome_CubeFlatten(cubeleft[i].verts[j]);
  403. +               for(i=0;i<nfacesright;i++)
  404. +                       Dome_CubeFlatten(cuberight[i].verts[j]);
  405. +       }
  406. +}
  407. +
  408. +void KX_Dome::Dome_CubeSplitFace(vector <DomeFace>& face, int *nfaces)
  409. +{
  410. +       int i;
  411. +       int n1, n2;
  412. +
  413. +       n1 = n2 = *nfaces;
  414. +
  415. +       for(i=0;i<n1;i++){
  416. +
  417. +               face[n2].verts[0] = (face[i].verts[0] + face[i].verts[1]) /2;
  418. +               face[n2].verts[1] =  face[i].verts[1];
  419. +               face[n2].verts[2] = (face[i].verts[1] + face[i].verts[2]) /2;
  420. +               face[n2].u[0]     = (face[i].u[0] + face[i].u[1]) /2;
  421. +               face[n2].u[1]     =  face[i].u[1];
  422. +               face[n2].u[2]     = (face[i].u[1] + face[i].u[2]) /2;
  423. +               face[n2].v[0]     = (face[i].v[0] + face[i].v[1]) /2;
  424. +               face[n2].v[1]     =  face[i].v[1];
  425. +               face[n2].v[2]     = (face[i].v[1] + face[i].v[2]) /2;
  426. +
  427. +               face[n2+1].verts[0] = (face[i].verts[1] + face[i].verts[2]) /2;
  428. +               face[n2+1].verts[1] =  face[i].verts[2];
  429. +               face[n2+1].verts[2] = (face[i].verts[2] + face[i].verts[0]) /2;
  430. +               face[n2+1].u[0]         = (face[i].u[1] + face[i].u[2]) /2;
  431. +               face[n2+1].u[1]         =  face[i].u[2];
  432. +               face[n2+1].u[2]         = (face[i].u[2] + face[i].u[0]) /2;
  433. +               face[n2+1].v[0]         = (face[i].v[1] + face[i].v[2]) /2;
  434. +               face[n2+1].v[1]         =  face[i].v[2];
  435. +               face[n2+1].v[2]         = (face[i].v[2] + face[i].v[0]) /2;
  436. +
  437. +               face[n2+2].verts[0] = (face[i].verts[0] + face[i].verts[1]) /2;
  438. +               face[n2+2].verts[1] = (face[i].verts[1] + face[i].verts[2]) /2;
  439. +               face[n2+2].verts[2] = (face[i].verts[2] + face[i].verts[0]) /2;
  440. +               face[n2+2].u[0]   = (face[i].u[0] + face[i].u[1]) /2;
  441. +               face[n2+2].u[1]   = (face[i].u[1] + face[i].u[2]) /2;
  442. +               face[n2+2].u[2]   = (face[i].u[2] + face[i].u[0]) /2;
  443. +               face[n2+2].v[0]   = (face[i].v[0] + face[i].v[1]) /2;
  444. +               face[n2+2].v[1]   = (face[i].v[1] + face[i].v[2]) /2;
  445. +               face[n2+2].v[2]   = (face[i].v[2] + face[i].v[0]) /2;          
  446. +
  447. +               //face[i].verts[0] = face[i].verts[0] ;
  448. +               face[i].verts[1] = (face[i].verts[0] + face[i].verts[1]) /2;
  449. +               face[i].verts[2] = (face[i].verts[0] + face[i].verts[2]) /2;
  450. +               //face[i].u[0]   =  face[i].u[0];
  451. +               face[i].u[1]     = (face[i].u[0] + face[i].u[1]) /2;
  452. +               face[i].u[2]     = (face[i].u[0] + face[i].u[2]) /2;
  453. +               //face[i].v[0]   = face[i].v[0] ;
  454. +               face[i].v[1]     = (face[i].v[0] + face[i].v[1]) /2;
  455. +               face[i].v[2]     = (face[i].v[0] + face[i].v[2]) /2;           
  456. +
  457. +               n2 += 3; // number of faces
  458. +       }
  459. +       *nfaces = n2;
  460. +}
  461. +
  462. +void KX_Dome::Dome_CubeFlatten(MT_Vector3 & verts){
  463. +       double phi, r;
  464. +
  465. +       r = atan2(sqrt(verts[0]*verts[0] + verts[2]*verts[2]), verts[1]);
  466. +       r /= (MT_PI / 2);
  467. +       printf("R= %2.4f\n", r);
  468. +
  469. +       phi = atan2(verts[2], verts[0]);
  470. +       printf("Phi= %2.4f\n", phi);
  471. +       
  472. +       verts[0] = r * cos(phi);
  473. +       verts[1] = 0; // zed, I probably will need to change it to work with BGE axis
  474. +       verts[2] = r * sin(phi);
  475. +}
  476. +
  477. +void DrawDomeVert(float theta, float phi)
  478. +{
  479. +       float r = 1.0f;
  480. +       float x, y, z, nx, ny, nz;
  481. +       float dtor = 3.1416/180.0;
  482. +       float ztrans = 1.0;
  483. +
  484. +       nx = sin(dtor * theta) * cos(dtor * phi);
  485. +       ny = sin(dtor * phi);
  486. +       nz = cos(dtor * theta) * cos(dtor * phi);
  487. +       glNormal3f(nx, ny, nz);
  488. +
  489. +       x = r * sin(dtor * theta) * cos(dtor * phi);
  490. +       y = r * sin(dtor * phi);
  491. +       z = -ztrans + r * cos(dtor * theta) * cos(dtor * phi);
  492. +       glVertex4f(x, y, z, 1.0);
  493. +}
  494. +
  495. +void DrawDomeSphere(float del)
  496. +{
  497. +  float phi, phi2, theta;
  498. +
  499. +  glColor4f(1.0, 1.0, 1.0, 1.0);
  500. +  //   glBegin(GL_TRIANGLE_STRIP);
  501. +  for (phi = -90.0f; phi < 90.0f; phi += del) {
  502. +    glBegin(GL_TRIANGLE_STRIP);
  503. +
  504. +    phi2 = phi + del;
  505. +
  506. +    for (theta = -90.0f; theta <= 90.0f; theta += del) {
  507. +      DrawDomeVert(theta, phi);
  508. +      DrawDomeVert(theta, phi2);
  509. +    }
  510. +    glEnd();
  511. +  }
  512. +//  glEnd();
  513. +}
  514. +/*
  515. +void KX_Dome::Dome_CubeDraw(unsigned int viewport[4], int m_DomeFaces)
  516. +{
  517. +       //Skybox => 4 images
  518. +       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  519. +       glMatrixMode(GL_PROJECTION);
  520. +       glLoadIdentity();
  521. +
  522. +       // Making the viewport always square
  523. +
  524. +       int can_width = viewport[2];
  525. +       int can_height = viewport[3];
  526. +
  527. +       float ortho_width, ortho_height = 1.0;
  528. +
  529. +       if (can_width < can_height){
  530. +               ortho_width = 1.0;
  531. +               ortho_height = (float)can_height/can_width;
  532. +       }else{
  533. +               ortho_width = (float)can_width/can_height;
  534. +               ortho_height = 1.0;
  535. +       }
  536. +
  537. +       glOrtho((-ortho_width), ortho_width, (-ortho_height), ortho_height, -20.0, 10.0);
  538. +
  539. +       glMatrixMode(GL_MODELVIEW);
  540. +       glLoadIdentity();
  541. +       glDisable(GL_DEPTH_TEST);
  542. +       glPolygonMode(GL_FRONT, GL_FILL);
  543. +       glShadeModel(GL_SMOOTH);
  544. +       glDisable(GL_LIGHTING);
  545. +
  546. +       glBegin(GL_TRIANGLES);
  547. +               glColor3f(0.0f ,0.0f, 1.0f);
  548. +               glVertex3f( 0.0f, 0.5f, 4.0f);
  549. +               glColor3f(0.0f ,0.5f, 0.0f);
  550. +               glVertex3f(-0.5f,-0.5f, 4.0f);
  551. +               glColor3f(1.0f ,0.0f, 0.0f);
  552. +               glVertex3f( 0.5f,-0.5f, 4.0f);
  553. +       glEnd();
  554. +
  555. +       glEnable(GL_TEXTURE_2D);
  556. +
  557. +// DomeFacesTmp[0] -> LEFT
  558. +       glBindTexture(GL_TEXTURE_2D, m_DomeFaces);
  559. +       glBegin(GL_QUADS);
  560. +               glColor3f(1.0f ,1.0f, 1.0f);
  561. +               glTexCoord2f(1.0,1.0);
  562. +               glVertex3f( -0.05f, 0.3f, 3.0f);
  563. +               glTexCoord2f(0.0,1.0);
  564. +               glVertex3f(-0.65f,0.3f, 3.0f);
  565. +               glTexCoord2f(0.0,0.0);
  566. +               glVertex3f(-0.65f,-0.3f, 3.0f);
  567. +               glTexCoord2f(1.0,0.0);
  568. +               glVertex3f(-0.05f,-0.3f, 3.0f);
  569. +       glEnd();
  570. +
  571. +// DomeFacesTmp[1] -> RIGHT
  572. +       glBindTexture(GL_TEXTURE_2D, m_DomeFaces+1);
  573. +       glBegin(GL_QUADS);
  574. +               glColor3f(1.0f ,1.0f, 1.0f);
  575. +               glTexCoord2f(1.0,1.0);
  576. +               glVertex3f( 0.65f, 0.3f, 3.0f);
  577. +               glTexCoord2f(0.0,1.0);
  578. +               glVertex3f(0.05f,0.3f, 3.0f);
  579. +               glTexCoord2f(0.0,0.0);
  580. +               glVertex3f(0.05f,-0.3f, 3.0f);
  581. +               glTexCoord2f(1.0,0.0);
  582. +               glVertex3f( 0.65f,-0.3f, 3.0f);
  583. +       glEnd();
  584. +
  585. +// DomeFacesTmp[2] -> TOP
  586. +       glBindTexture(GL_TEXTURE_2D, m_DomeFaces+2);
  587. +       glBegin(GL_QUADS);
  588. +               glColor3f(1.0f ,1.0f, 1.0f);
  589. +               glTexCoord2f(1.0,1.0);
  590. +               glVertex3f( -0.05f, 0.95f, 3.0f);
  591. +               glTexCoord2f(0.0,1.0);
  592. +               glVertex3f(-0.65f,0.95f, 3.0f);
  593. +               glTexCoord2f(0.0,0.0);
  594. +               glVertex3f(-0.65f,0.35f, 3.0f);
  595. +               glTexCoord2f(1.0,0.0);
  596. +               glVertex3f(-0.05f,0.35f, 3.0f);
  597. +       glEnd();
  598. +
  599. +// DomeFacesTmp[3] -> BOTTOM
  600. +       glBindTexture(GL_TEXTURE_2D, m_DomeFaces+3);
  601. +       glBegin(GL_QUADS);
  602. +               glColor3f(1.0f ,1.0f, 1.0f);
  603. +               glTexCoord2f(1.0,1.0);
  604. +               glVertex3f( -0.05f, -0.35f, 3.0f);
  605. +               glTexCoord2f(0.0,1.0);
  606. +               glVertex3f(-0.65f,-0.35f, 3.0f);
  607. +               glTexCoord2f(0.0,0.0);
  608. +               glVertex3f(-0.65f,-0.95f, 3.0f);
  609. +               glTexCoord2f(1.0,0.0);
  610. +               glVertex3f(-0.05f,-0.95f, 3.0f);
  611. +       glEnd();
  612. +
  613. +       glDisable(GL_TEXTURE_2D);
  614. +       glEnable(GL_DEPTH_TEST);
  615. +}
  616. +*/
  617. +
  618. +void KX_Dome::Dome_CubeDraw(unsigned int viewport[4], int m_DomeFaces)
  619. +{
  620. +       //correct =>Skybox
  621. +       int i,j;
  622. +       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  623. +       glMatrixMode(GL_PROJECTION);
  624. +       glLoadIdentity();
  625. +
  626. +       // Making the viewport always square
  627. +
  628. +       int can_width = viewport[2];
  629. +       int can_height = viewport[3];
  630. +
  631. +       float ortho_width, ortho_height = 1.0;
  632. +
  633. +       if (can_width < can_height){
  634. +               ortho_width = 1.0;
  635. +               ortho_height = (float)can_height/can_width;
  636. +       }else{
  637. +               ortho_width = (float)can_width/can_height;
  638. +               ortho_height = 1.0;
  639. +       }
  640. +
  641. +       glOrtho((-ortho_width), ortho_width, (-ortho_height), ortho_height, -20.0, 10.0);
  642. +
  643. +       glMatrixMode(GL_MODELVIEW);
  644. +       glLoadIdentity();
  645. +       gluLookAt(0.0,-1.0,0.0, 0.0,0.0,0.0, 0.0,0.0,1.0);
  646. +       glDisable(GL_DEPTH_TEST);
  647. +       glPolygonMode(GL_FRONT, GL_FILL);
  648. +//     glPolygonMode(GL_FRONT, GL_LINE);
  649. +       glShadeModel(GL_SMOOTH);
  650. +       glDisable(GL_LIGHTING);
  651. +
  652. +       glEnable(GL_TEXTURE_2D);
  653. +       glColor3f(1.0,1.0,1.0);
  654. +
  655. +       glBindTexture(GL_TEXTURE_2D, m_DomeFaces);
  656. +       // top triangle
  657. +       glBegin(GL_TRIANGLES);
  658. +//             glColor3f(0.0f, 0.0f, 1.0f);
  659. +               for (i=0;i<nfacestop;i++) {
  660. +                       for (j=0;j<3;j++) {
  661. +                               glTexCoord2f(cubetop[i].u[j],cubetop[i].v[j]);
  662. +                               glVertex3f((GLfloat)cubetop[i].verts[j][0],(GLfloat)cubetop[i].verts[j][1],(GLfloat)cubetop[i].verts[j][2]);
  663. +                       }
  664. +               }
  665. +       glEnd();
  666. +
  667. +       glBindTexture(GL_TEXTURE_2D, m_DomeFaces+1);
  668. +       // bottom triangle
  669. +       glBegin(GL_TRIANGLES);
  670. +//             glColor3f(1.0f, 1.0f, 0.0f);
  671. +               for (i=0;i<nfacesbottom;i++) {
  672. +                       for (j=0;j<3;j++) {
  673. +                               glTexCoord2f(cubebottom[i].u[j],cubebottom[i].v[j]);
  674. +                               glVertex3f((GLfloat)cubebottom[i].verts[j][0],(GLfloat)cubebottom[i].verts[j][1],(GLfloat)cubebottom[i].verts[j][2]);
  675. +                       }
  676. +               }
  677. +       glEnd();
  678. +
  679. +       glBindTexture(GL_TEXTURE_2D, m_DomeFaces+2);
  680. +       // left triangle
  681. +       glBegin(GL_TRIANGLES);
  682. +//             glColor3f(0.0f, 1.0f, 0.0f);
  683. +               for (i=0;i<nfacesleft;i++) {
  684. +                       for (j=0;j<3;j++) {
  685. +                               glTexCoord2f(cubeleft[i].u[j],cubeleft[i].v[j]);
  686. +                               glVertex3f((GLfloat)cubeleft[i].verts[j][0],(GLfloat)cubeleft[i].verts[j][1],(GLfloat)cubeleft[i].verts[j][2]);
  687. +                       }
  688. +               }
  689. +       glEnd();
  690. +
  691. +       glBindTexture(GL_TEXTURE_2D, m_DomeFaces+3);
  692. +       // right triangle
  693. +       glBegin(GL_TRIANGLES);
  694. +//             glColor3f(1.0f, 0.0f, 0.0f);
  695. +               for (i=0;i<nfacesright;i++) {
  696. +                       for (j=0;j<3;j++) {
  697. +                               glTexCoord2f(cuberight[i].u[j],cuberight[i].v[j]);
  698. +                               glVertex3f((GLfloat)cuberight[i].verts[j][0],(GLfloat)cuberight[i].verts[j][1],(GLfloat)cuberight[i].verts[j][2]);
  699. +                       }
  700. +               }
  701. +       glEnd();
  702. +
  703. +       glDisable(GL_TEXTURE_2D);
  704. +       glEnable(GL_DEPTH_TEST);
  705. +}
  706. +void KX_Dome::RenderDome()
  707. +{
  708. +       m_engine->Render();
  709. +
  710. +/*
  711. +       KX_Scene* firstscene = *m_scenes.begin();
  712. +       const RAS_FrameSettings &framesettings = firstscene->GetFramingType();
  713. +
  714. +       m_logger->StartLog(tc_rasterizer, m_kxsystem->GetTimeInSeconds(), true);
  715. +
  716. +       // hiding mouse cursor each frame
  717. +       // (came back when going out of focus and then back in again)
  718. +       if (m_hideCursor)
  719. +               m_canvas->SetMouseState(RAS_ICanvas::MOUSE_INVISIBLE);
  720. +
  721. +       // clear the entire game screen with the border color
  722. +       // only once per frame
  723. +       m_canvas->BeginDraw();
  724. +       if (m_drawingmode == RAS_IRasterizer::KX_TEXTURED) {
  725. +               m_canvas->SetViewPort(0, 0, m_canvas->GetWidth(), m_canvas->GetHeight());
  726. +               if (m_overrideFrameColor)
  727. +               {
  728. +                       // Do not use the framing bar color set in the Blender scenes
  729. +                       m_canvas->ClearColor(
  730. +                               m_overrideFrameColorR,
  731. +                               m_overrideFrameColorG,
  732. +                               m_overrideFrameColorB,
  733. +                               1.0
  734. +                               );
  735. +               }
  736. +               else
  737. +               {
  738. +                       // Use the framing bar color set in the Blender scenes
  739. +                       m_canvas->ClearColor(
  740. +                               framesettings.BarRed(),
  741. +                               framesettings.BarGreen(),
  742. +                               framesettings.BarBlue(),
  743. +                               1.0
  744. +                               );
  745. +               }
  746. +               // clear the -whole- viewport
  747. +               m_canvas->ClearBuffer(RAS_ICanvas::COLOR_BUFFER|RAS_ICanvas::DEPTH_BUFFER);
  748. +       }
  749. +
  750. +       m_rasterizer->SetEye(RAS_IRasterizer::RAS_STEREO_LEFTEYE);
  751. +
  752. +       // BeginFrame() sets the actual drawing area. You can use a part of the window
  753. +       if (!BeginFrame())
  754. +               return;
  755. +
  756. +       KX_SceneList::iterator sceneit;
  757. +       for (sceneit = m_scenes.begin();sceneit != m_scenes.end(); sceneit++)
  758. +       // for each scene, call the proceed functions
  759. +       {
  760. +               KX_Scene* scene = *sceneit;
  761. +               KX_Camera* cam = scene->GetActiveCamera();
  762. +               // pass the scene's worldsettings to the rasterizer
  763. +               SetWorldSettings(scene->GetWorldInfo());
  764. +
  765. +               // shadow buffers
  766. +               RenderShadowBuffers(scene);
  767. +
  768. +               // Avoid drawing the scene with the active camera twice when it's viewport is enabled
  769. +               if(cam && !cam->GetViewport())
  770. +               {
  771. +                       if (scene->IsClearingZBuffer())
  772. +                               m_rasterizer->ClearDepthBuffer();
  773. +       
  774. +                       m_rendertools->SetAuxilaryClientInfo(scene);
  775. +       
  776. +                       // do the rendering
  777. +                       // dome checking
  778. +                       if(m_rasterizer->GetStereoMode()==RAS_IRasterizer::RAS_STEREO_DOME)
  779. +                               RenderDomeFrame(scene,cam);
  780. +                       else
  781. +                               RenderFrame(scene, cam);
  782. +               }
  783. +              
  784. +               list<class KX_Camera*>* cameras = scene->GetCameras();
  785. +              
  786. +               // Draw the scene once for each camera with an enabled viewport
  787. +               list<KX_Camera*>::iterator it = cameras->begin();
  788. +               while(it != cameras->end())
  789. +               {
  790. +                       if((*it)->GetViewport())
  791. +                       {
  792. +                               if (scene->IsClearingZBuffer())
  793. +                                       m_rasterizer->ClearDepthBuffer();
  794. +              
  795. +                               m_rendertools->SetAuxilaryClientInfo(scene);
  796. +              
  797. +                               // do the rendering
  798. +                               if(m_rasterizer->GetStereoMode()==RAS_IRasterizer::RAS_STEREO_DOME)
  799. +                                       RenderDomeFrame(scene, (*it));
  800. +                               else
  801. +                                       RenderFrame(scene, (*it));
  802. +                       }
  803. +                      
  804. +                       it++;
  805. +               }
  806. +       }
  807. +
  808. +       // only one place that checks for stereo
  809. +       if(m_rasterizer->Stereo())
  810. +       {
  811. +               m_rasterizer->SetEye(RAS_IRasterizer::RAS_STEREO_RIGHTEYE);
  812. +
  813. +               if (!BeginFrame())
  814. +                       return;
  815. +
  816. +               KX_SceneList::iterator sceneit;
  817. +               for (sceneit = m_scenes.begin();sceneit != m_scenes.end(); sceneit++)
  818. +               // for each scene, call the proceed functions
  819. +               {
  820. +                       KX_Scene* scene = *sceneit;
  821. +                       KX_Camera* cam = scene->GetActiveCamera();
  822. +
  823. +                       // pass the scene's worldsettings to the rasterizer
  824. +                       SetWorldSettings(scene->GetWorldInfo());
  825. +              
  826. +                       if (scene->IsClearingZBuffer())
  827. +                               m_rasterizer->ClearDepthBuffer();
  828. +
  829. +                       //pass the scene, for picking and raycasting (shadows)
  830. +                       m_rendertools->SetAuxilaryClientInfo(scene);
  831. +
  832. +                       // do the rendering
  833. +                       //RenderFrame(scene);
  834. +                       RenderFrame(scene, cam);
  835. +               }
  836. +       } // if(m_rasterizer->Stereo())
  837. +
  838. +       EndFrame();
  839. +*/     
  840. +}
  841. +/*
  842. +void KX_Dome::Dome_CubeDraw(unsigned int viewport[4], int m_DomeFaces)
  843. +{
  844. +//tmp, cubemap
  845. +       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  846. +       glMatrixMode(GL_PROJECTION);
  847. +       glLoadIdentity();
  848. +
  849. +       //
  850. +
  851. +       int can_width = viewport[2];
  852. +       int can_height = viewport[3];
  853. +
  854. +       float ortho_width, ortho_height;
  855. +
  856. +       if (can_width < can_height){
  857. +               ortho_width = 1.0;
  858. +               ortho_height = (float)can_height/can_width;
  859. +       }else{
  860. +               ortho_width = (float)can_width/can_height;
  861. +               ortho_height = 1.0;
  862. +       }
  863. +
  864. +       glOrtho((-ortho_width), ortho_width, (-ortho_height), ortho_height, -20.0, 10.0);
  865. +
  866. +       //Start to Draw
  867. +       glMatrixMode(GL_MODELVIEW);
  868. +       glLoadIdentity();
  869. +       glDisable(GL_DEPTH_TEST);
  870. +       glPolygonMode(GL_FRONT, GL_FILL);
  871. +       glShadeModel(GL_SMOOTH);
  872. +       glDisable(GL_LIGHTING);
  873. +
  874. +       glDisable(GL_TEXTURE_2D);
  875. +
  876. +       glBindTexture(GL_TEXTURE_CUBE_MAP, m_DomeFaces);
  877. +       // Commands to Enable EnvMap
  878. +       glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
  879. +
  880. +       glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  881. +       glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  882. +
  883. +       glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP);
  884. +       glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP);
  885. +       glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP);
  886. +       glEnable(GL_TEXTURE_CUBE_MAP);
  887. +       glEnable(GL_TEXTURE_GEN_S);
  888. +       glEnable(GL_TEXTURE_GEN_T);
  889. +       glEnable(GL_TEXTURE_GEN_R);
  890. +       glEnable(GL_NORMALIZE);
  891. +
  892. +       DrawDomeSphere(9.0);
  893. +       
  894. +       glDisable(GL_TEXTURE_CUBE_MAP);
  895. +       glEnable(GL_DEPTH_TEST);
  896. +}
  897. +*/
  898. +/*
  899. +// capture image from viewport
  900. +void KX_Dome::calcImage (unsigned int texId)
  901. +{
  902. +    if (m_rasterizer->GetDrawingMode() != RAS_IRasterizer::KX_TEXTURED ||   // no need for texture
  903. +        m_camera->GetViewport() ||        // camera must be inactive
  904. +        m_camera == m_scene->GetActiveCamera())
  905. +    {
  906. +        // no need to compute texture in non texture rendering
  907. +        m_avail = false;
  908. +        return;
  909. +    }
  910. +    // render the scene from the camera
  911. +    Render();
  912. +       // get image from viewport
  913. +       ImageViewport::calcImage(texId);
  914. +    // restore OpenGL state
  915. +    m_canvas->EndFrame();
  916. +}
  917. +*/
  918. +/*
  919. +void ImageRender::Render()
  920. +{
  921. +       RAS_FrameFrustum frustrum;
  922. +
  923. +    if (!m_render)
  924. +        return;
  925. +
  926. +    if (m_mirror)
  927. +    {
  928. +        // mirror mode, compute camera frustrum, position and orientation
  929. +        // convert mirror position and normal in world space
  930. +        const MT_Matrix3x3 & mirrorObjWorldOri = m_mirror->GetSGNode()->GetWorldOrientation();
  931. +        const MT_Point3 & mirrorObjWorldPos = m_mirror->GetSGNode()->GetWorldPosition();
  932. +        const MT_Vector3 & mirrorObjWorldScale = m_mirror->GetSGNode()->GetWorldScaling();
  933. +        MT_Point3 mirrorWorldPos =
  934. +            mirrorObjWorldPos + mirrorObjWorldScale * (mirrorObjWorldOri * m_mirrorPos);
  935. +        MT_Vector3 mirrorWorldZ = mirrorObjWorldOri * m_mirrorZ;
  936. +        // get observer world position
  937. +        const MT_Point3 & observerWorldPos = m_observer->GetSGNode()->GetWorldPosition();
  938. +        // get plane D term = mirrorPos . normal
  939. +        MT_Scalar mirrorPlaneDTerm = mirrorWorldPos.dot(mirrorWorldZ);
  940. +        // compute distance of observer to mirror = D - observerPos . normal
  941. +        MT_Scalar observerDistance = mirrorPlaneDTerm - observerWorldPos.dot(mirrorWorldZ);
  942. +        // if distance < 0.01 => observer is on wrong side of mirror, don't render
  943. +        if (observerDistance < 0.01f)
  944. +            return;
  945. +        // set camera world position = observerPos + normal * 2 * distance
  946. +        MT_Point3 cameraWorldPos = observerWorldPos + (MT_Scalar(2.0)*observerDistance)*mirrorWorldZ;
  947. +        m_camera->GetSGNode()->SetLocalPosition(cameraWorldPos);
  948. +        // set camera orientation: z=normal, y=mirror_up in world space, x= y x z
  949. +        MT_Vector3 mirrorWorldY = mirrorObjWorldOri * m_mirrorY;
  950. +        MT_Vector3 mirrorWorldX = mirrorObjWorldOri * m_mirrorX;
  951. +        MT_Matrix3x3 cameraWorldOri(
  952. +            mirrorWorldX[0], mirrorWorldY[0], mirrorWorldZ[0],
  953. +            mirrorWorldX[1], mirrorWorldY[1], mirrorWorldZ[1],
  954. +            mirrorWorldX[2], mirrorWorldY[2], mirrorWorldZ[2]);
  955. +        m_camera->GetSGNode()->SetLocalOrientation(cameraWorldOri);
  956. +        m_camera->GetSGNode()->UpdateWorldData(0.0);
  957. +        // compute camera frustrum:
  958. +        //   get position of mirror relative to camera: offset = mirrorPos-cameraPos
  959. +        MT_Vector3 mirrorOffset = mirrorWorldPos - cameraWorldPos;
  960. +        //   convert to camera orientation
  961. +        mirrorOffset = mirrorOffset * cameraWorldOri;
  962. +        //   scale mirror size to world scale:
  963. +        //     get closest local axis for mirror Y and X axis and scale height and width by local axis scale
  964. +        MT_Scalar x, y;
  965. +        x = fabs(m_mirrorY[0]);
  966. +        y = fabs(m_mirrorY[1]);
  967. +        float height = (x > y) ?
  968. +            ((x > fabs(m_mirrorY[2])) ? mirrorObjWorldScale[0] : mirrorObjWorldScale[2]):
  969. +            ((y > fabs(m_mirrorY[2])) ? mirrorObjWorldScale[1] : mirrorObjWorldScale[2]);
  970. +        x = fabs(m_mirrorX[0]);
  971. +        y = fabs(m_mirrorX[1]);
  972. +        float width = (x > y) ?
  973. +            ((x > fabs(m_mirrorX[2])) ? mirrorObjWorldScale[0] : mirrorObjWorldScale[2]):
  974. +            ((y > fabs(m_mirrorX[2])) ? mirrorObjWorldScale[1] : mirrorObjWorldScale[2]);
  975. +        width *= m_mirrorHalfWidth;
  976. +        height *= m_mirrorHalfHeight;
  977. +        //   left = offsetx-width
  978. +        //   right = offsetx+width
  979. +        //   top = offsety+height
  980. +        //   bottom = offsety-height
  981. +        //   near = -offsetz
  982. +        //   far = near+100
  983. +        frustrum.x1 = mirrorOffset[0]-width;
  984. +        frustrum.x2 = mirrorOffset[0]+width;
  985. +        frustrum.y1 = mirrorOffset[1]-height;
  986. +        frustrum.y2 = mirrorOffset[1]+height;
  987. +        frustrum.camnear = -mirrorOffset[2];
  988. +        frustrum.camfar = -mirrorOffset[2]+m_clip;
  989. +    }
  990. +    const float ortho = 100.0;
  991. +    const RAS_IRasterizer::StereoMode stereomode = m_rasterizer->GetStereoMode();
  992. +
  993. +    // The screen area that ImageViewport will copy is also the rendering zone
  994. +    m_canvas->SetViewPort(m_position[0], m_position[1], m_position[0]+m_capSize[0]-1, m_position[1]+m_capSize[1]-1);
  995. +    m_canvas->ClearColor(m_background[0], m_background[1], m_background[2], m_background[3]);
  996. +    m_canvas->ClearBuffer(RAS_ICanvas::COLOR_BUFFER|RAS_ICanvas::DEPTH_BUFFER);
  997. +    m_rasterizer->BeginFrame(RAS_IRasterizer::KX_TEXTURED,m_engine->GetClockTime());
  998. +    m_rendertools->BeginFrame(m_rasterizer);
  999. +    m_engine->SetWorldSettings(m_scene->GetWorldInfo());
  1000. +    m_rendertools->SetAuxilaryClientInfo(m_scene);
  1001. +    m_rasterizer->DisplayFog();
  1002. +    // matrix calculation, don't apply any of the stereo mode
  1003. +    m_rasterizer->SetStereoMode(RAS_IRasterizer::RAS_STEREO_NOSTEREO);
  1004. +    if (m_mirror)
  1005. +    {
  1006. +        // frustrum was computed above
  1007. +        // get frustrum matrix and set projection matrix
  1008. +               MT_Matrix4x4 projmat = m_rasterizer->GetFrustumMatrix(
  1009. +                       frustrum.x1, frustrum.x2, frustrum.y1, frustrum.y2, frustrum.camnear, frustrum.camfar);
  1010. +
  1011. +               m_camera->SetProjectionMatrix(projmat);
  1012. +    } else if (m_camera->hasValidProjectionMatrix())
  1013. +       {
  1014. +               m_rasterizer->SetProjectionMatrix(m_camera->GetProjectionMatrix());
  1015. +    } else
  1016. +    {
  1017. +               float lens = m_camera->GetLens();
  1018. +               bool orthographic = !m_camera->GetCameraData()->m_perspective;
  1019. +               float nearfrust = m_camera->GetCameraNear();
  1020. +               float farfrust = m_camera->GetCameraFar();
  1021. +        float aspect_ratio = 1.0f;
  1022. +        Scene *blenderScene = m_scene->GetBlenderScene();
  1023. +
  1024. +        if (orthographic) {
  1025. +                       lens *= ortho;
  1026. +                       nearfrust = (nearfrust + 1.0)*ortho;
  1027. +                       farfrust *= ortho;
  1028. +               }
  1029. +               // compute the aspect ratio from frame blender scene settings so that render to texture
  1030. +        // works the same in Blender and in Blender player
  1031. +        if (blenderScene->r.ysch != 0)
  1032. +            aspect_ratio = float(blenderScene->r.xsch) / float(blenderScene->r.ysch);
  1033. +
  1034. +        RAS_FramingManager::ComputeDefaultFrustum(
  1035. +            nearfrust,
  1036. +            farfrust,
  1037. +            lens,
  1038. +            aspect_ratio,
  1039. +            frustrum);
  1040. +              
  1041. +               MT_Matrix4x4 projmat = m_rasterizer->GetFrustumMatrix(
  1042. +                       frustrum.x1, frustrum.x2, frustrum.y1, frustrum.y2, frustrum.camnear, frustrum.camfar);
  1043. +
  1044. +               m_camera->SetProjectionMatrix(projmat);
  1045. +       }
  1046. +
  1047. +       MT_Transform camtrans(m_camera->GetWorldToCamera());
  1048. +       if (!m_camera->GetCameraData()->m_perspective)
  1049. +               camtrans.getOrigin()[2] *= ortho;
  1050. +       MT_Matrix4x4 viewmat(camtrans);
  1051. +       
  1052. +       m_rasterizer->SetViewMatrix(viewmat, m_camera->NodeGetWorldPosition(),
  1053. +               m_camera->GetCameraLocation(), m_camera->GetCameraOrientation());
  1054. +       m_camera->SetModelviewMatrix(viewmat);
  1055. +    // restore the stereo mode now that the matrix is computed
  1056. +    m_rasterizer->SetStereoMode(stereomode);
  1057. +
  1058. +    // do not update the mesh, we don't want to do it more than once per frame
  1059. +    //m_scene->UpdateMeshTransformations();
  1060. +
  1061. +       m_scene->CalculateVisibleMeshes(m_rasterizer,m_camera);
  1062. +
  1063. +       m_scene->RenderBuckets(camtrans, m_rasterizer, m_rendertools);
  1064. +}
  1065. +*/
  1066. +/*
  1067. +// cast Image pointer to ImageRender
  1068. +inline ImageRender * getImageRender (PyImage * self)
  1069. +{ return static_cast<ImageRender*>(self->m_image); }
  1070. +*/
  1071. +
  1072. +// python methods
  1073. +
  1074. +// Blender Scene type
  1075. +//BlendType<KX_Scene> sceneType ("KX_Scene");
  1076. +// Blender Camera type
  1077. +//BlendType<KX_Camera> cameraType ("KX_Camera");
  1078. +
  1079. +/*
  1080. +// object initialization
  1081. +static int ImageRender_init (PyObject * pySelf, PyObject * args, PyObject * kwds)
  1082. +{
  1083. +       // parameters - scene object
  1084. +       PyObject * scene;
  1085. +       // camera object
  1086. +       PyObject * camera;
  1087. +       // parameter keywords
  1088. +       static char *kwlist[] = {"sceneObj", "cameraObj", NULL};
  1089. +       // get parameters
  1090. +       if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO", kwlist, &scene, &camera))
  1091. +               return -1;
  1092. +       try
  1093. +       {
  1094. +               // get scene pointer
  1095. +               KX_Scene * scenePtr (NULL);
  1096. +               if (scene != NULL) scenePtr = sceneType.checkType(scene);
  1097. +               // throw exception if scene is not available
  1098. +               if (scenePtr == NULL) THRWEXCP(SceneInvalid, S_OK);
  1099. +
  1100. +               // get camera pointer
  1101. +               KX_Camera * cameraPtr (NULL);
  1102. +               if (camera != NULL) cameraPtr = cameraType.checkType(camera);
  1103. +               // throw exception if camera is not available
  1104. +               if (cameraPtr == NULL) THRWEXCP(CameraInvalid, S_OK);
  1105. +
  1106. +               // get pointer to image structure
  1107. +               PyImage * self = reinterpret_cast<PyImage*>(pySelf);
  1108. +               // create source object
  1109. +               if (self->m_image != NULL) delete self->m_image;
  1110. +               self->m_image = new ImageRender(scenePtr, cameraPtr);
  1111. +       }
  1112. +       catch (Exception & exp)
  1113. +       {
  1114. +               exp.report();
  1115. +               return -1;
  1116. +       }
  1117. +       // initialization succeded
  1118. +       return 0;
  1119. +}
  1120. +*/
  1121. +/*
  1122. +// get background color
  1123. +PyObject * getBackground (PyImage * self, void * closure)
  1124. +{
  1125. +       return Py_BuildValue("[BBBB]",
  1126. +        getImageRender(self)->getBackground(0),
  1127. +               getImageRender(self)->getBackground(1),
  1128. +        getImageRender(self)->getBackground(2),
  1129. +        getImageRender(self)->getBackground(3));
  1130. +}
  1131. +*/
  1132. +/*
  1133. +// set color
  1134. +static int setBackground (PyImage * self, PyObject * value, void * closure)
  1135. +{
  1136. +       // check validity of parameter
  1137. +       if (value == NULL || !PySequence_Check(value) || PySequence_Length(value) != 4
  1138. +               || !PyInt_Check(PySequence_Fast_GET_ITEM(value, 0))
  1139. +               || !PyInt_Check(PySequence_Fast_GET_ITEM(value, 1))
  1140. +               || !PyInt_Check(PySequence_Fast_GET_ITEM(value, 2))
  1141. +               || !PyInt_Check(PySequence_Fast_GET_ITEM(value, 3)))
  1142. +       {
  1143. +               PyErr_SetString(PyExc_TypeError, "The value must be a sequence of 4 integer between 0 and 255");
  1144. +               return -1;
  1145. +       }
  1146. +       // set background color
  1147. +       getImageRender(self)->setBackground((unsigned char)(PyInt_AsLong(PySequence_Fast_GET_ITEM(value, 0))),
  1148. +               (unsigned char)(PyInt_AsLong(PySequence_Fast_GET_ITEM(value, 1))),
  1149. +               (unsigned char)(PyInt_AsLong(PySequence_Fast_GET_ITEM(value, 2))),
  1150. +        (unsigned char)(PyInt_AsLong(PySequence_Fast_GET_ITEM(value, 3))));
  1151. +       // success
  1152. +       return 0;
  1153. +}
  1154. +*/
  1155. +/*
  1156. +// methods structure
  1157. +static PyMethodDef imageRenderMethods[] =
  1158. +{ // methods from ImageBase class
  1159. +       {"refresh", (PyCFunction)Image_refresh, METH_NOARGS, "Refresh image - invalidate its current content"},
  1160. +       {NULL}
  1161. +};
  1162. +// attributes structure
  1163. +static PyGetSetDef imageRenderGetSets[] =
  1164. +{
  1165. +       {(char*)"background", (getter)getBackground, (setter)setBackground, (char*)"background color", NULL},
  1166. +    // attribute from ImageViewport
  1167. +       {(char*)"capsize", (getter)ImageViewport_getCaptureSize, (setter)ImageViewport_setCaptureSize, (char*)"size of render area", NULL},
  1168. +       {(char*)"alpha", (getter)ImageViewport_getAlpha, (setter)ImageViewport_setAlpha, (char*)"use alpha in texture", NULL},
  1169. +       {(char*)"whole", (getter)ImageViewport_getWhole, (setter)ImageViewport_setWhole, (char*)"use whole viewport to render", NULL},
  1170. +       // attributes from ImageBase class
  1171. +       {(char*)"image", (getter)Image_getImage, NULL, (char*)"image data", NULL},
  1172. +       {(char*)"size", (getter)Image_getSize, NULL, (char*)"image size", NULL},
  1173. +       {(char*)"scale", (getter)Image_getScale, (setter)Image_setScale, (char*)"fast scale of image (near neighbour)", NULL},
  1174. +       {(char*)"flip", (getter)Image_getFlip, (setter)Image_setFlip, (char*)"flip image vertically", NULL},
  1175. +       {(char*)"filter", (getter)Image_getFilter, (setter)Image_setFilter, (char*)"pixel filter", NULL},
  1176. +       {NULL}
  1177. +};
  1178. +*/
  1179. +
  1180. +/*
  1181. +// object initialization
  1182. +static int ImageMirror_init (PyObject * pySelf, PyObject * args, PyObject * kwds)
  1183. +{
  1184. +       // parameters - scene object
  1185. +       PyObject * scene;
  1186. +       // reference object for mirror
  1187. +       PyObject * observer;
  1188. +    // object holding the mirror
  1189. +    PyObject * mirror;
  1190. +    // material of the mirror
  1191. +    short materialID = 0;
  1192. +       // parameter keywords
  1193. +       static char *kwlist[] = {"scene", "observer", "mirror", "material", NULL};
  1194. +       // get parameters
  1195. +       if (!PyArg_ParseTupleAndKeywords(args, kwds, "OOO|h", kwlist, &scene, &observer, &mirror, &materialID))
  1196. +               return -1;
  1197. +       try
  1198. +       {
  1199. +               // get scene pointer
  1200. +               KX_Scene * scenePtr (NULL);
  1201. +        if (scene != NULL && PyObject_TypeCheck(scene, &KX_Scene::Type))
  1202. +            scenePtr = static_cast<KX_Scene*>(scene);
  1203. +        else
  1204. +            THRWEXCP(SceneInvalid, S_OK);
  1205. +
  1206. +               // get observer pointer
  1207. +               KX_GameObject * observerPtr (NULL);
  1208. +               if (observer != NULL && PyObject_TypeCheck(observer, &KX_GameObject::Type))
  1209. +            observerPtr = static_cast<KX_GameObject*>(observer);
  1210. +        else if (observer != NULL && PyObject_TypeCheck(observer, &KX_Camera::Type))
  1211. +            observerPtr = static_cast<KX_Camera*>(observer);
  1212. +               else
  1213. +            THRWEXCP(ObserverInvalid, S_OK);
  1214. +
  1215. +               // get mirror pointer
  1216. +               KX_GameObject * mirrorPtr (NULL);
  1217. +               if (mirror != NULL && PyObject_TypeCheck(mirror, &KX_GameObject::Type))
  1218. +            mirrorPtr = static_cast<KX_GameObject*>(mirror);
  1219. +               else
  1220. +            THRWEXCP(MirrorInvalid, S_OK);
  1221. +
  1222. +        // locate the material in the mirror
  1223. +               RAS_IPolyMaterial * material = getMaterial(mirror, materialID);
  1224. +               if (material == NULL)
  1225. +            THRWEXCP(MaterialNotAvail, S_OK);
  1226. +
  1227. +               // get pointer to image structure
  1228. +               PyImage * self = reinterpret_cast<PyImage*>(pySelf);
  1229. +
  1230. +               // create source object
  1231. +               if (self->m_image != NULL)
  1232. +        {
  1233. +            delete self->m_image;
  1234. +            self->m_image = NULL;
  1235. +        }
  1236. +               self->m_image = new ImageRender(scenePtr, observerPtr, mirrorPtr, material);
  1237. +       }
  1238. +       catch (Exception & exp)
  1239. +       {
  1240. +               exp.report();
  1241. +               return -1;
  1242. +       }
  1243. +       // initialization succeded
  1244. +       return 0;
  1245. +}
  1246. +*/
  1247. +/**
  1248. +// get background color
  1249. +PyObject * getClip (PyImage * self, void * closure)
  1250. +{
  1251. +       return PyFloat_FromDouble(getImageRender(self)->getClip());
  1252. +}
  1253. +*/
  1254. +/*
  1255. +// set clip
  1256. +static int setClip (PyImage * self, PyObject * value, void * closure)
  1257. +{
  1258. +       // check validity of parameter
  1259. +       double clip;
  1260. +       if (value == NULL || !PyFloat_Check(value) || (clip = PyFloat_AsDouble(value)) < 0.01 || clip > 5000.0)
  1261. +       {
  1262. +               PyErr_SetString(PyExc_TypeError, "The value must be an float between 0.01 and 5000");
  1263. +               return -1;
  1264. +       }
  1265. +       // set background color
  1266. +       getImageRender(self)->setClip(float(clip));
  1267. +       // success
  1268. +       return 0;
  1269. +}
  1270. +*/
  1271. +/*
  1272. +// attributes structure
  1273. +static PyGetSetDef imageMirrorGetSets[] =
  1274. +{
  1275. +       {(char*)"clip", (getter)getClip, (setter)setClip, (char*)"clipping distance", NULL},
  1276. +       // attribute from ImageRender
  1277. +       {(char*)"background", (getter)getBackground, (setter)setBackground, (char*)"background color", NULL},
  1278. +    // attribute from ImageViewport
  1279. +       {(char*)"capsize", (getter)ImageViewport_getCaptureSize, (setter)ImageViewport_setCaptureSize, (char*)"size of render area", NULL},
  1280. +       {(char*)"alpha", (getter)ImageViewport_getAlpha, (setter)ImageViewport_setAlpha, (char*)"use alpha in texture", NULL},
  1281. +       {(char*)"whole", (getter)ImageViewport_getWhole, (setter)ImageViewport_setWhole, (char*)"use whole viewport to render", NULL},
  1282. +       // attributes from ImageBase class
  1283. +       {(char*)"image", (getter)Image_getImage, NULL, (char*)"image data", NULL},
  1284. +       {(char*)"size", (getter)Image_getSize, NULL, (char*)"image size", NULL},
  1285. +       {(char*)"scale", (getter)Image_getScale, (setter)Image_setScale, (char*)"fast scale of image (near neighbour)", NULL},
  1286. +       {(char*)"flip", (getter)Image_getFlip, (setter)Image_setFlip, (char*)"flip image vertically", NULL},
  1287. +       {(char*)"filter", (getter)Image_getFilter, (setter)Image_setFilter, (char*)"pixel filter", NULL},
  1288. +       {NULL}
  1289. +};
  1290. +*/
  1291. +/*
  1292. +// constructor
  1293. +ImageRender::ImageRender (KX_Scene * scene, KX_GameObject * observer, KX_GameObject * mirror, RAS_IPolyMaterial * mat) :
  1294. +    ImageViewport(),
  1295. +    m_render(false),
  1296. +    m_scene(scene),
  1297. +    m_observer(observer),
  1298. +    m_mirror(mirror),
  1299. +       m_clip(100.f)
  1300. +{
  1301. +    // this constructor is used for automatic planar mirror
  1302. +    // create a camera, take all data by default, in any case we will recompute the frustrum on each frame
  1303. +       RAS_CameraData camdata;
  1304. +    vector<RAS_TexVert*> mirrorVerts;
  1305. +    vector<RAS_TexVert*>::iterator it;
  1306. +    float mirrorArea = 0.f;
  1307. +    float mirrorNormal[3] = {0.f, 0.f, 0.f};
  1308. +    float mirrorUp[3];
  1309. +    float dist, vec[3], axis[3];
  1310. +    float zaxis[3] = {0.f, 0.f, 1.f};
  1311. +    float yaxis[3] = {0.f, 1.f, 0.f};
  1312. +    float mirrorMat[3][3];
  1313. +    float left, right, top, bottom, back;
  1314. +       
  1315. +       m_camera= new KX_Camera(scene, KX_Scene::m_callbacks, camdata);
  1316. +       m_camera->SetName("__mirror__cam__");
  1317. +    // don't add the camera to the scene object list, it doesn't need to be accessible
  1318. +    m_owncamera = true;
  1319. +    // retrieve rendering objects
  1320. +    m_engine = KX_GetActiveEngine();
  1321. +    m_rasterizer = m_engine->GetRasterizer();
  1322. +    m_canvas = m_engine->GetCanvas();
  1323. +    m_rendertools = m_engine->GetRenderTools();
  1324. +    // locate the vertex assigned to mat and do following calculation in mesh coordinates
  1325. +    for (int meshIndex = 0; meshIndex < mirror->GetMeshCount(); meshIndex++)
  1326. +    {
  1327. +        RAS_MeshObject*        mesh = mirror->GetMesh(meshIndex);
  1328. +        int numPolygons = mesh->NumPolygons();
  1329. +        for (int polygonIndex=0; polygonIndex < numPolygons; polygonIndex++)
  1330. +        {
  1331. +            RAS_Polygon* polygon = mesh->GetPolygon(polygonIndex);
  1332. +            if (polygon->GetMaterial()->GetPolyMaterial() == mat)
  1333. +            {
  1334. +                RAS_TexVert *v1, *v2, *v3, *v4;
  1335. +                float normal[3];
  1336. +                float area;
  1337. +                // this polygon is part of the mirror,
  1338. +                v1 = polygon->GetVertex(0);
  1339. +                v2 = polygon->GetVertex(1);
  1340. +                v3 = polygon->GetVertex(2);
  1341. +                mirrorVerts.push_back(v1);
  1342. +                mirrorVerts.push_back(v2);
  1343. +                mirrorVerts.push_back(v3);
  1344. +                if (polygon->VertexCount() == 4)
  1345. +                {
  1346. +                    v4 = polygon->GetVertex(3);
  1347. +                    mirrorVerts.push_back(v4);
  1348. +                    area = CalcNormFloat4((float*)v1->getXYZ(), (float*)v2->getXYZ(), (float*)v3->getXYZ(), (float*)v4->getXYZ(), normal);
  1349. +                } else
  1350. +                {
  1351. +                    area = CalcNormFloat((float*)v1->getXYZ(), (float*)v2->getXYZ(), (float*)v3->getXYZ(), normal);
  1352. +                }
  1353. +                area = fabs(area);
  1354. +                mirrorArea += area;
  1355. +                VecMulf(normal, area);
  1356. +                VecAddf(mirrorNormal, mirrorNormal, normal);
  1357. +            }
  1358. +        }
  1359. +    }
  1360. +    if (mirrorVerts.size() == 0 || mirrorArea < FLT_EPSILON)
  1361. +    {
  1362. +        // no vertex or zero size mirror
  1363. +       THRWEXCP(MirrorSizeInvalid, S_OK);
  1364. +    }
  1365. +    // compute average normal of mirror faces
  1366. +    VecMulf(mirrorNormal, 1.0f/mirrorArea);
  1367. +    if (Normalize(mirrorNormal) == 0.f)
  1368. +    {
  1369. +        // no normal
  1370. +        THRWEXCP(MirrorNormalInvalid, S_OK);
  1371. +    }
  1372. +    // the mirror plane has an equation of the type ax+by+cz = d where (a,b,c) is the normal vector
  1373. +       // if the mirror is more vertical then horizontal, the Z axis is the up direction.
  1374. +       // otherwise the Y axis is the up direction.
  1375. +       // If the mirror is not perfectly vertical(horizontal), the Z(Y) axis projection on the mirror
  1376. +       // plan by the normal will be the up direction.
  1377. +       if (fabs(mirrorNormal[2]) > fabs(mirrorNormal[1]) &&
  1378. +               fabs(mirrorNormal[2]) > fabs(mirrorNormal[0]))
  1379. +       {
  1380. +               // the mirror is more horizontal than vertical
  1381. +        VecCopyf(axis, yaxis);
  1382. +       }
  1383. +       else
  1384. +       {
  1385. +               // the mirror is more vertical than horizontal
  1386. +        VecCopyf(axis, zaxis);
  1387. +       }
  1388. +    dist = Inpf(mirrorNormal, axis);
  1389. +    if (fabs(dist) < FLT_EPSILON)
  1390. +    {
  1391. +        // the mirror is already fully aligned with up axis
  1392. +        VecCopyf(mirrorUp, axis);
  1393. +    }
  1394. +    else
  1395. +    {
  1396. +        // projection of axis to mirror plane through normal
  1397. +        VecCopyf(vec, mirrorNormal);
  1398. +        VecMulf(vec, dist);
  1399. +        VecSubf(mirrorUp, axis, vec);
  1400. +        if (Normalize(mirrorUp) == 0.f)
  1401. +        {
  1402. +            // should not happen
  1403. +            THRWEXCP(MirrorHorizontal, S_OK);
  1404. +            return;
  1405. +        }
  1406. +    }
  1407. +    // compute rotation matrix between local coord and mirror coord
  1408. +    // to match camera orientation, we select mirror z = -normal, y = up, x = y x z
  1409. +    VecCopyf(mirrorMat[2], mirrorNormal);
  1410. +    VecMulf(mirrorMat[2], -1.0f);
  1411. +    VecCopyf(mirrorMat[1], mirrorUp);
  1412. +    Crossf(mirrorMat[0], mirrorMat[1], mirrorMat[2]);
  1413. +    // transpose to make it a orientation matrix from local space to mirror space
  1414. +    Mat3Transp(mirrorMat);
  1415. +    // transform all vertex to plane coordinates and determine mirror position
  1416. +    left = FLT_MAX;
  1417. +    right = -FLT_MAX;
  1418. +    bottom = FLT_MAX;
  1419. +    top = -FLT_MAX;
  1420. +    back = -FLT_MAX; // most backward vertex (=highest Z coord in mirror space)
  1421. +    for (it = mirrorVerts.begin(); it != mirrorVerts.end(); it++)
  1422. +    {  
  1423. +        VecCopyf(vec, (float*)(*it)->getXYZ());
  1424. +        Mat3MulVecfl(mirrorMat, vec);
  1425. +        if (vec[0] < left)
  1426. +            left = vec[0];
  1427. +        if (vec[0] > right)
  1428. +            right = vec[0];
  1429. +        if (vec[1] < bottom)
  1430. +            bottom = vec[1];
  1431. +        if (vec[1] > top)
  1432. +            top = vec[1];
  1433. +        if (vec[2] > back)
  1434. +            back = vec[2];
  1435. +    }
  1436. +    // now store this information in the object for later rendering
  1437. +    m_mirrorHalfWidth = (right-left)*0.5f;
  1438. +    m_mirrorHalfHeight = (top-bottom)*0.5f;
  1439. +    if (m_mirrorHalfWidth < 0.01f || m_mirrorHalfHeight < 0.01f)
  1440. +    {
  1441. +        // mirror too small
  1442. +        THRWEXCP(MirrorTooSmall, S_OK);
  1443. +    }
  1444. +    // mirror position in mirror coord
  1445. +    vec[0] = (left+right)*0.5f;
  1446. +    vec[1] = (top+bottom)*0.5f;
  1447. +    vec[2] = back;
  1448. +    // convert it in local space: transpose again the matrix to get back to mirror to local transform
  1449. +    Mat3Transp(mirrorMat);
  1450. +    Mat3MulVecfl(mirrorMat, vec);
  1451. +    // mirror position in local space
  1452. +    m_mirrorPos.setValue(vec[0], vec[1], vec[2]);
  1453. +    // mirror normal vector (pointed towards the back of the mirror) in local space
  1454. +    m_mirrorZ.setValue(-mirrorNormal[0], -mirrorNormal[1], -mirrorNormal[2]);
  1455. +    m_mirrorY.setValue(mirrorUp[0], mirrorUp[1], mirrorUp[2]);
  1456. +    m_mirrorX = m_mirrorY.cross(m_mirrorZ);
  1457. +    m_render = true;
  1458. +
  1459. +       setBackground(0, 0, 255, 255);
  1460. +}
  1461. +
  1462. +*/
  1463. +
  1464. +
  1465. Index: source/gameengine/Ketsji/KX_Dome.h
  1466. ===================================================================
  1467. --- source/gameengine/Ketsji/KX_Dome.h  (revision 0)
  1468. +++ source/gameengine/Ketsji/KX_Dome.h  (revision 0)
  1469. @@ -0,0 +1,145 @@
  1470. +/* $Id: KX_Dome.h
  1471. +-----------------------------------------------------------------------------
  1472. +
  1473. +
  1474. +This program is free software; you can redistribute it and/or modify it under
  1475. +the terms of the GNU Lesser General Public License as published by the Free Software
  1476. +Foundation; either version 2 of the License, or (at your option) any later
  1477. +version.
  1478. +
  1479. +This program is distributed in the hope that it will be useful, but WITHOUT
  1480. +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  1481. +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
  1482. +
  1483. +You should have received a copy of the GNU Lesser General Public License along with
  1484. +this program; if not, write to the Free Software Foundation, Inc., 59 Temple
  1485. +Place - Suite 330, Boston, MA 02111-1307, USA, or go to
  1486. +http://www.gnu.org/copyleft/lesser.txt.
  1487. +-----------------------------------------------------------------------------
  1488. +*/
  1489. +
  1490. +#if !defined KX_DOME_H
  1491. +#define KX_DOME_H
  1492. +
  1493. +
  1494. +//#include "Common.h"
  1495. +
  1496. +#include "KX_Scene.h"
  1497. +#include "KX_Camera.h"
  1498. +#include "DNA_screen_types.h"
  1499. +#include "RAS_ICanvas.h"
  1500. +#include "RAS_IRasterizer.h"
  1501. +#include "RAS_IRenderTools.h"
  1502. +#include "KX_KetsjiEngine.h"
  1503. +
  1504. +//#include "ImageViewport.h"
  1505. +//#include "GL/glew.h"
  1506. +#include <BIF_gl.h>
  1507. +#include <vector>
  1508. +
  1509. +/// class for render 3d scene
  1510. +class KX_Dome
  1511. +{
  1512. +public:
  1513. +       /// constructor
  1514. +       KX_Dome (
  1515. +       RAS_ICanvas* m_canvas,
  1516. +    /// rasterizer
  1517. +    RAS_IRasterizer* m_rasterizer,
  1518. +    /// render tools
  1519. +    RAS_IRenderTools* m_rendertools,
  1520. +    /// engine
  1521. +    KX_KetsjiEngine* m_engine
  1522. +       );
  1523. +//     KX_Scene * scene, KX_Camera * camera);
  1524. +//     ImageRender (KX_Scene * scene, KX_GameObject * observer, KX_GameObject * mirror, RAS_IPolyMaterial * mat);
  1525. +
  1526. +       /// destructor
  1527. +       virtual ~KX_Dome (void);
  1528. +
  1529. +       typedef struct {
  1530. +               double u[3], v[3];
  1531. +               MT_Vector3 verts[3]; //three verts
  1532. +       } DomeFace;
  1533. +       
  1534. +       vector <DomeFace> cubetop, cubebottom, cubefront, cuberight, cubeleft;
  1535. +
  1536. +       int nfacestop, nfacesbottom, nfacesleft, nfacesright;
  1537. +       double aperture;
  1538. +
  1539. +       //old
  1540. +       void DrawDomeVert(float theta, float phi);
  1541. +       void DrawDomeSphere(float del);
  1542. +
  1543. +       //from initTexture
  1544. +       void setBackground (int red, int green, int blue, int alpha);
  1545. +
  1546. +       void RenderDome(void);
  1547. +
  1548. +       // Paul Bourke functions
  1549. +       void Dome_CubeCreate(int cubeRes);
  1550. +       void Dome_CubeSplitFace(vector <DomeFace>& face, int *nfaces);
  1551. +       void Dome_CubeFlatten(MT_Vector3& verts);
  1552. +       void Dome_CubeDraw(unsigned int viewport[4], int m_DomeFaces);
  1553. +
  1554. +       /// get background color
  1555. +//    int getBackground (int idx) { return (idx < 0 || idx > 3) ? 0 : int(m_background[idx]*255.f); }
  1556. +       /// set background color
  1557. +//     void setBackground (int red, int green, int blue, int alpha);
  1558. +
  1559. +       /// clipping distance
  1560. +//     float getClip (void) { return m_clip; }
  1561. +       /// set whole buffer use
  1562. +//    void setClip (float clip) { m_clip = clip; }
  1563. +
  1564. +protected:
  1565. +    /// true if ready to render
  1566. +//    bool m_render;
  1567. +       /// rendered scene
  1568. +       KX_Scene * m_scene;
  1569. +       /// camera for render
  1570. +       KX_Camera * m_camera;
  1571. +    /// do we own the camera?
  1572. +  //  bool m_owncamera; // ????
  1573. +    /// for mirror operation
  1574. +
  1575. +       float m_clip;                                           // clipping distance
  1576. +    /// canvas
  1577. +    RAS_ICanvas* m_canvas;
  1578. +    /// rasterizer
  1579. +    RAS_IRasterizer* m_rasterizer;
  1580. +    /// render tools
  1581. +    RAS_IRenderTools* m_rendertools;
  1582. +    /// engine
  1583. +    KX_KetsjiEngine* m_engine;
  1584. +
  1585. +       /// background colour
  1586. +       float  m_background[4];
  1587. +
  1588. +
  1589. +       /// render 3d scene to image
  1590. +//     virtual void calcImage (unsigned int texId);
  1591. +
  1592. +//     void Render();
  1593. +//     void SetupRenderFrame(KX_Scene *scene, KX_Camera* cam);
  1594. +//     void RenderFrame(KX_Scene* scene, KX_Camera* cam);
  1595. +//     void SetBackGround(KX_WorldInfo* wi);
  1596. +//     void SetWorldSettings(KX_WorldInfo* wi);
  1597. +};
  1598. +
  1599. +/* my function here. I don't want to use a class unless I need it */
  1600. +
  1601. +//void DomeDraw(unsigned int viewport[4], int m_DomeFaces);
  1602. +
  1603. +/* functions from Paul Bourke */
  1604. +
  1605. +//void Dome_CubeSplitFace(KX_Dome::DomeFace* face, int *nfaces);
  1606. +
  1607. +//void Dome_CubeDraw(void);
  1608. +
  1609. +//KX_Dome::DomeFace* cubetop, cubebottom, cubefront, cuberight, cubeleft;
  1610. +//int nfacestop, nfacesbottom, nfacesleft, nfacesright;
  1611. +//double aperture;
  1612. +
  1613. +#endif
  1614. +
  1615. Index: source/gameengine/Ketsji/KX_GameObject.cpp
  1616. ===================================================================
  1617. --- source/gameengine/Ketsji/KX_GameObject.cpp  (revision 18000)
  1618. +++ source/gameengine/Ketsji/KX_GameObject.cpp  (working copy)
  1619. @@ -884,7 +884,28 @@
  1620.         }
  1621.  }
  1622.  
  1623. +void KX_GameObject::NodeSetWorldOrientation(const MT_Matrix3x3& rot){
  1624.  
  1625. +       // check on valid node in case a python controller holds a reference to a deleted object
  1626. +       if (!GetSGNode())
  1627. +               return;
  1628. +
  1629. +       if (m_pPhysicsController1 && !GetSGNode()->GetSGParent())
  1630. +       {
  1631. +               // see note above
  1632. +               m_pPhysicsController1->setOrientation(rot);
  1633. +       }
  1634. +
  1635. +//     SG_Node* parent = m_pSGNode->GetSGParent();
  1636. +//     if (parent != NULL){
  1637. +               //set worldposition of the parent instead
  1638. +//             parent->SetWorldOrientation(rot);
  1639. +//             GetSGNode()->SetWorldOrientation(rot);
  1640. +//     }
  1641. +//     else
  1642. +               GetSGNode()->SetWorldOrientation(rot);
  1643. +}
  1644. +
  1645.  void KX_GameObject::NodeUpdateGS(double time,bool bInitiator)
  1646.  {
  1647.         if (GetSGNode())
  1648. Index: source/gameengine/Ketsji/KX_GameObject.h
  1649. ===================================================================
  1650. --- source/gameengine/Ketsji/KX_GameObject.h    (revision 18000)
  1651. +++ source/gameengine/Ketsji/KX_GameObject.h    (working copy)
  1652. @@ -365,6 +365,8 @@
  1653.         // adapt local position so that world position is set to desired position
  1654.         void    NodeSetWorldPosition(const MT_Point3& trans);
  1655.  
  1656. +       void    NodeSetWorldOrientation(const MT_Matrix3x3& rot );
  1657. +
  1658.                 void                                           
  1659.         NodeUpdateGS(
  1660.                 double time,
  1661. Index: source/gameengine/Ketsji/KX_KetsjiEngine.cpp
  1662. ===================================================================
  1663. --- source/gameengine/Ketsji/KX_KetsjiEngine.cpp        (revision 18000)
  1664. +++ source/gameengine/Ketsji/KX_KetsjiEngine.cpp        (working copy)
  1665. @@ -74,6 +74,11 @@
  1666.  #include "RAS_FramingManager.h"
  1667.  #include "stdio.h"
  1668.  
  1669. +#include "KX_Dome.h"
  1670. +
  1671. +#include "GL/glew.h"
  1672. +#include "GL/glu.h"
  1673. +
  1674.  // If define: little test for Nzc: guarded drawing. If the canvas is
  1675.  // not valid, skip rendering this frame.
  1676.  //#define NZC_GUARDED_OUTPUT
  1677. @@ -97,8 +102,40 @@
  1678.  double KX_KetsjiEngine::m_suspendedtime = 0.0;
  1679.  double KX_KetsjiEngine::m_suspendeddelta = 0.0;
  1680.  double KX_KetsjiEngine::m_average_framerate = 0.0;
  1681. +/*
  1682. +static const enum KX_KetsjiEngine::DomeFaceTarget {
  1683. +  GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT,
  1684. +  GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT,
  1685. +  GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT,
  1686. +  GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT,
  1687. +  GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT,
  1688. +  GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT
  1689. +};
  1690. +*/
  1691. +static GLenum DomeFaceTarget [6] = {
  1692. +       GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
  1693. +       GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
  1694. +       GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
  1695. +       GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
  1696. +       GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
  1697. +       GL_TEXTURE_CUBE_MAP_POSITIVE_X
  1698. +};
  1699. +/*
  1700. +static GLenum DomeFaceTarget [6] = {
  1701. +  GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT,
  1702. +  GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT,
  1703. +  GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT,
  1704. +  GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT,
  1705. +  GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT,
  1706. +  GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT
  1707. +};
  1708. +*/
  1709.  
  1710. +unsigned int DomeFaces[4];
  1711. +unsigned int DomeFacesTmp[6]; // tmp to store a single render image
  1712.  
  1713. +int DomeFaceSize=512;
  1714. +
  1715.  /**
  1716.   *     Constructor of the Ketsji Engine
  1717.   */
  1718. @@ -165,7 +202,9 @@
  1719.  
  1720.         for (int i = tc_first; i < tc_numCategories; i++)
  1721.                 m_logger->AddCategory((KX_TimeCategory)i);
  1722. -              
  1723. +       
  1724. +       //Initialize the dome
  1725. +//     m_dome = new KX_Dome(m_canvas, m_rasterizer, m_rendertools,this);
  1726.  }
  1727.  
  1728.  
  1729. @@ -176,6 +215,7 @@
  1730.  KX_KetsjiEngine::~KX_KetsjiEngine()
  1731.  {
  1732.         delete m_logger;
  1733. +       delete m_dome;
  1734.  }
  1735.  
  1736.  
  1737. @@ -253,8 +293,12 @@
  1738.         m_sceneconverter = sceneconverter;
  1739.  }
  1740.  
  1741. +void KX_KetsjiEngine::InitDome()
  1742. +{
  1743. +       m_dome = new KX_Dome(m_canvas, m_rasterizer, m_rendertools,this);
  1744. +       m_dome->Dome_CubeCreate(4);
  1745. +}
  1746.  
  1747. -
  1748.  /**
  1749.   * Ketsji Init(), Initializes datastructures and converts data from
  1750.   * Blender into Ketsji native (realtime) format also sets up the
  1751. @@ -610,11 +654,822 @@
  1752.         
  1753.         return doRender;
  1754.  }
  1755. +void KX_KetsjiEngine::tmpInitDome()
  1756. +{
  1757. +//     KX_Dome my_dome = KX_Dome(scene,cam);
  1758. +//     KX_Dome *kx_dome = &my_dome;
  1759. +//     m_dome = new KX_Dome();
  1760. +       //create 6 images
  1761. +       glGenTextures(4, (GLuint*)&DomeFaces);
  1762. +       
  1763. +       for (int i=0;i<4;i++){
  1764. +               //create tmp texture
  1765. +//             glGenTextures(1, (GLuint*)&DomeFaces[i]);
  1766. +               glBindTexture(GL_TEXTURE_2D, DomeFaces[i]);
  1767. +               glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16, DomeFaceSize, DomeFaceSize, 0, GL_RGBA,
  1768. +                               GL_UNSIGNED_BYTE, 0);
  1769. +               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  1770. +               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  1771. +               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  1772. +               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  1773. +       }
  1774. +       
  1775. +//     glBindTexture(GL_TEXTURE_CUBE_MAP, DomeFaces);
  1776.  
  1777. +//     glGenTextures(1, (GLuint*)&DomeFaces);
  1778. +//     glBindTexture(GL_TEXTURE_CUBE_MAP, DomeFaces);
  1779.  
  1780. +       for (int i=0;i<6;i++){
  1781. +               glTexImage2D(DomeFaceTarget[i], 0, GL_RGBA, DomeFaceSize, DomeFaceSize, 0, GL_RGBA,
  1782. +                       GL_UNSIGNED_BYTE, 0);
  1783. +               glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  1784. +               glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  1785. +               glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP);
  1786. +               glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP);
  1787. +       }
  1788.  
  1789. -void KX_KetsjiEngine::Render()
  1790. +       for (int i=0;i<6;i++){
  1791. +               //create tmp texture
  1792. +               glGenTextures(1, (GLuint*)&DomeFacesTmp[i]);
  1793. +               glBindTexture(GL_TEXTURE_2D, DomeFacesTmp[i]);
  1794. +               glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, DomeFaceSize, DomeFaceSize, 0, GL_RGBA,
  1795. +                               GL_UNSIGNED_BYTE, 0);
  1796. +               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  1797. +               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  1798. +               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
  1799. +               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
  1800. +       }
  1801. +
  1802. +       printf("\nInitializing Dome\n\n");
  1803. +       return;
  1804. +}
  1805. +void KX_KetsjiEngine::EndDome(){
  1806. +//     delete m_dome;
  1807. +       //delete the six envmap images created
  1808. +       glDeleteTextures(6, (GLuint*)&DomeFaces);
  1809. +       glDeleteTextures(6, (GLuint*)&DomeFacesTmp);
  1810. +
  1811. +       printf("\nEnding Dome\n\n");
  1812. +       return;
  1813. +}
  1814. +/*
  1815. +void DomeDraw(GLuint viewport[4], KX_Dome* dome)
  1816.  {
  1817. +       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  1818. +       glMatrixMode(GL_PROJECTION);
  1819. +       glLoadIdentity();
  1820. +
  1821. +       // Making the viewport always square
  1822. +
  1823. +       int can_width = viewport[2];
  1824. +       int can_height = viewport[3];
  1825. +
  1826. +       float ortho_width, ortho_height;
  1827. +
  1828. +       if (can_width < can_height){
  1829. +               ortho_width = 1.0;
  1830. +               ortho_height = (float)can_height/can_width;
  1831. +       }else{
  1832. +               ortho_width = (float)can_width/can_height;
  1833. +               ortho_height = 1.0;
  1834. +       }
  1835. +
  1836. +       glOrtho((-ortho_width), ortho_width, (-ortho_height), ortho_height, -20.0, 10.0);
  1837. +
  1838. +       //Start to Draw
  1839. +       glMatrixMode(GL_MODELVIEW);
  1840. +       glLoadIdentity();
  1841. +       glDisable(GL_DEPTH_TEST);
  1842. +       glPolygonMode(GL_FRONT, GL_FILL);
  1843. +       glShadeModel(GL_SMOOTH);
  1844. +       glDisable(GL_LIGHTING);
  1845. +
  1846. +       glDisable(GL_TEXTURE_2D);
  1847. +
  1848. +       glBindTexture(GL_TEXTURE_CUBE_MAP, DomeFaces);
  1849. +       // Commands to Enable EnvMap
  1850. +       glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
  1851. +
  1852. +       glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  1853. +       glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  1854. +
  1855. +       glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP);
  1856. +       glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP);
  1857. +       glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP);
  1858. +       glEnable(GL_TEXTURE_CUBE_MAP);
  1859. +       glEnable(GL_TEXTURE_GEN_S);
  1860. +       glEnable(GL_TEXTURE_GEN_T);
  1861. +       glEnable(GL_TEXTURE_GEN_R);
  1862. +       glEnable(GL_NORMALIZE);
  1863. +
  1864. +       dome->DrawDomeSphere(9.0);
  1865. +       
  1866. +       
  1867. +       glDisable(GL_TEXTURE_CUBE_MAP);
  1868. +       glEnable(GL_DEPTH_TEST);
  1869. +}
  1870. +*/
  1871. +void DomeDrawTmp2(GLuint viewport[4])
  1872. +{
  1873. +       //6 faces tmp
  1874. +       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  1875. +       glMatrixMode(GL_PROJECTION);
  1876. +       glLoadIdentity();
  1877. +
  1878. +       /* Making the viewport always square */
  1879. +
  1880. +       int can_width = viewport[2];
  1881. +       int can_height = viewport[3];
  1882. +
  1883. +       float ortho_width, ortho_height = 1.0;
  1884. +
  1885. +       if (can_width < can_height){
  1886. +               ortho_width = 1.0;
  1887. +               ortho_height = (float)can_height/can_width;
  1888. +       }else{
  1889. +               ortho_width = (float)can_width/can_height;
  1890. +               ortho_height = 1.0;
  1891. +       }
  1892. +
  1893. +       glOrtho((-ortho_width), ortho_width, (-ortho_height), ortho_height, -20.0, 10.0);
  1894. +
  1895. +       glMatrixMode(GL_MODELVIEW);
  1896. +       glLoadIdentity();
  1897. +       glDisable(GL_DEPTH_TEST);
  1898. +       glPolygonMode(GL_FRONT, GL_FILL);
  1899. +       glShadeModel(GL_SMOOTH);
  1900. +       glDisable(GL_LIGHTING);
  1901. +
  1902. +       glBegin(GL_TRIANGLES);
  1903. +               glColor3f(0.0f ,0.0f, 1.0f);
  1904. +               glVertex3f( 0.0f, 0.5f, 4.0f);
  1905. +               glColor3f(0.0f ,0.5f, 0.0f);
  1906. +               glVertex3f(-0.5f,-0.5f, 4.0f);
  1907. +               glColor3f(1.0f ,0.0f, 0.0f);
  1908. +               glVertex3f( 0.5f,-0.5f, 4.0f);
  1909. +       glEnd();
  1910. +
  1911. +       glEnable(GL_TEXTURE_2D);
  1912. +// DomeFacesTmp[0] -> GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT
  1913. +       glBindTexture(GL_TEXTURE_2D, DomeFacesTmp[0]);
  1914. +       glBegin(GL_QUADS);
  1915. +               glColor3f(1.0f ,1.0f, 1.0f);
  1916. +               glTexCoord2f(1.0,1.0);
  1917. +               glVertex3f( -0.35f, 0.8f, 3.0f);
  1918. +               glTexCoord2f(0.0,1.0);
  1919. +               glVertex3f(-0.95f,0.8f, 3.0f);
  1920. +               glTexCoord2f(0.0,0.0);
  1921. +               glVertex3f(-0.95f,0.2f, 3.0f);
  1922. +               glTexCoord2f(1.0,0.0);
  1923. +               glVertex3f(-0.35f,0.2f, 3.0f);
  1924. +       glEnd();
  1925. +
  1926. +// DomeFacesTmp[1] -> GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT
  1927. +       glBindTexture(GL_TEXTURE_2D, DomeFacesTmp[1]);
  1928. +       glBegin(GL_QUADS);
  1929. +               glColor3f(1.0f ,1.0f, 1.0f);
  1930. +               glTexCoord2f(1.0,1.0);
  1931. +               glVertex3f( -0.35f, -0.2f, 3.0f);
  1932. +               glTexCoord2f(0.0,1.0);
  1933. +               glVertex3f(-0.95f,-0.2f, 3.0f);
  1934. +               glTexCoord2f(0.0,0.0);
  1935. +               glVertex3f(-0.95f,-0.8f, 3.0f);
  1936. +               glTexCoord2f(1.0,0.0);
  1937. +               glVertex3f(-0.35f,-0.8f, 3.0f);
  1938. +       glEnd();
  1939. +
  1940. +// DomeFacesTmp[2] -> GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT
  1941. +       glBindTexture(GL_TEXTURE_2D, DomeFacesTmp[2]);
  1942. +       glBegin(GL_QUADS);
  1943. +               glColor3f(1.0f ,1.0f, 1.0f);
  1944. +               glTexCoord2f(1.0,1.0);
  1945. +               glVertex3f( 0.3f, 0.8f, 3.0f);
  1946. +               glTexCoord2f(0.0,1.0);
  1947. +               glVertex3f(-0.3f,0.8f, 3.0f);
  1948. +               glTexCoord2f(0.0,0.0);
  1949. +               glVertex3f(-0.3f,0.2f, 3.0f);
  1950. +               glTexCoord2f(1.0,0.0);
  1951. +               glVertex3f(0.3f,0.2f, 3.0f);
  1952. +       glEnd();
  1953. +
  1954. +// DomeFacesTmp[3] -> GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT
  1955. +       glBindTexture(GL_TEXTURE_2D, DomeFacesTmp[3]);
  1956. +       glBegin(GL_QUADS);
  1957. +               glColor3f(1.0f ,1.0f, 1.0f);
  1958. +               glTexCoord2f(1.0,1.0);
  1959. +               glVertex3f( 0.3f, -0.2f, 3.0f);
  1960. +               glTexCoord2f(0.0,1.0);
  1961. +               glVertex3f(-0.3f,-0.2f, 3.0f);
  1962. +               glTexCoord2f(0.0,0.0);
  1963. +               glVertex3f(-0.3f,-0.8f, 3.0f);
  1964. +               glTexCoord2f(1.0,0.0);
  1965. +               glVertex3f(0.3f,-0.8f, 3.0f);
  1966. +       glEnd();
  1967. +
  1968. +// DomeFacesTmp[4] -> GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT
  1969. +       glBindTexture(GL_TEXTURE_2D, DomeFacesTmp[4]);
  1970. +       glBegin(GL_QUADS);
  1971. +               glColor3f(1.0f ,1.0f, 1.0f);
  1972. +               glTexCoord2f(1.0,1.0);
  1973. +               glVertex3f( 0.95f, 0.8f, 3.0f);
  1974. +               glTexCoord2f(0.0,1.0);
  1975. +               glVertex3f( 0.35f,0.8f, 3.0f);
  1976. +               glTexCoord2f(0.0,0.0);
  1977. +               glVertex3f( 0.35f,0.2f, 3.0f);
  1978. +               glTexCoord2f(1.0,0.0);
  1979. +               glVertex3f( 0.95f,0.2f, 3.0f);
  1980. +       glEnd();
  1981. +
  1982. +// DomeFacesTmp[5] -> GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT
  1983. +       glBindTexture(GL_TEXTURE_2D, DomeFacesTmp[5]);
  1984. +       glBegin(GL_QUADS);
  1985. +               glColor3f(1.0f ,1.0f, 1.0f);
  1986. +               glTexCoord2f(1.0,1.0);
  1987. +               glVertex3f( 0.95f, -0.2f, 3.0f);
  1988. +               glTexCoord2f(0.0,1.0);
  1989. +               glVertex3f(0.35f,-0.2f, 3.0f);
  1990. +               glTexCoord2f(0.0,0.0);
  1991. +               glVertex3f(0.35f,-0.8f, 3.0f);
  1992. +               glTexCoord2f(1.0,0.0);
  1993. +               glVertex3f( 0.95f,-0.8f, 3.0f);
  1994. +       glEnd();
  1995. +
  1996. +       glDisable(GL_TEXTURE_2D);
  1997. +       glEnable(GL_DEPTH_TEST);
  1998. +}
  1999. +void KX_KetsjiEngine::DomeRotateCamera(KX_Camera* cam, int i){
  2000. +
  2001. +       MT_Matrix3x3 locRot [6] = {
  2002. +                                       MT_Matrix3x3( 0.0, 1.0, 0.0, // 90º - Left
  2003. +                                                                -1.0, 0.0, 0.0,
  2004. +                                                                 0.0, 0.0, 1.0),
  2005. +                                       MT_Matrix3x3( 0.0,-1.0, 0.0, // 90º - Right
  2006. +                                                                 1.0, 0.0, 0.0,
  2007. +                                                                 0.0, 0.0, 1.0),
  2008. +                                       MT_Matrix3x3( 0.0, 0.0, 1.0, // 90º - Bottom
  2009. +                                                                 0.0,-1.0, 0.0,
  2010. +                                                                 1.0, 0.0, 0.0),
  2011. +                                       MT_Matrix3x3( 0.0, 0.0,-1.0, // 90º - Top
  2012. +                                                                 0.0,-1.0, 0.0,
  2013. +                                                                -1.0, 0.0, 0.0),
  2014. +                                       MT_Matrix3x3( 1.0, 0.0, 0.0, // 0º - Front
  2015. +                                                                 0.0, 1.0, 0.0,
  2016. +                                                                 0.0, 0.0, 1.0),
  2017. +                                       MT_Matrix3x3(-1.0, 0.0, 0.0, // 180º - Back
  2018. +                                                                 0.0,-1.0, 0.0,
  2019. +                                                                 0.0, 0.0, 1.0)
  2020. +                                                       };
  2021. +
  2022. +       MT_Quaternion cam_ori = cam->GetCameraOrientation();
  2023. +       MT_Matrix3x3 cam_node_ori = cam->GetSGNode()->GetLocalOrientation();
  2024. +       MT_Matrix3x3 gloOri = cam->NodeGetWorldOrientation().inverse();
  2025. +
  2026. +//     cam->NodeSetWorldOrientation(locRot[i]*cam_node_ori);
  2027. +
  2028. +       MT_Matrix4x4 cam_mat = cam->GetModelviewMatrix();
  2029. +
  2030. +       MT_Vector3 vu = MT_Vector3 (cam_mat[1][0], cam_mat[1][1], cam_mat[1][2]); // view up vector
  2031. +       MT_Vector3 vd = MT_Vector3 (cam_mat[2][0], cam_mat[2][1], cam_mat[2][2]); // view direction
  2032. +       MT_Vector3 vp = MT_Vector3 (cam_mat[3][0], cam_mat[3][1], cam_mat[3][2]); // view position
  2033. +
  2034. +       cam_mat[3][0] += 10.0;
  2035. +
  2036. +//     cam->SetModelviewMatrix(cam_mat);
  2037. +
  2038. +//     m_rasterizer->SetViewMatrix(cam_mat);
  2039. +
  2040. +//     m_rasterizer->SetProjectionMatrix(cam->GetProjectionMatrix());
  2041. +//     cam->NodeSetLocalOrientation(locRot[i]*cam_node_ori);
  2042. +//     cam->GetSGNode()->RelativeRotate(locRot[i],true);
  2043. +//     cam->NodeUpdateGS(0,true);
  2044. +//     MT_Matrix4x4 cam_MM = cam->GetModelviewMatrix();
  2045. +//     cam_MM *= locRot_4[i];
  2046. +//     cam->SetModelviewMatrix(cam_MM);
  2047. +//     printf("Rotating Camera !!!!!!\n");
  2048. +
  2049. +}
  2050. +void KX_KetsjiEngine::DomeRotateView(KX_Camera* cam, int i, MT_Matrix4x4 cam_mat){
  2051. +//Mix MatrixMethod
  2052. +//changing camera
  2053. +//     MT_Matrix4x4 cam_mat = cam->GetModelviewMatrix();
  2054. +       cam_mat = cam->GetModelviewMatrix();
  2055. +
  2056. +
  2057. +       MT_Vector3 vu = MT_Vector3 (cam_mat[1][0], cam_mat[1][1], cam_mat[1][2]); // view up vector
  2058. +       MT_Vector3 vd = MT_Vector3 (cam_mat[2][0], cam_mat[2][1], cam_mat[2][2]); // view direction
  2059. +       MT_Vector3 vp = MT_Vector3 (cam_mat[3][0], cam_mat[3][1], cam_mat[3][2]); // view position
  2060. +
  2061. +       vp = cam->NodeGetWorldPosition();
  2062. +
  2063. +//     cam->SetModelviewMatrix(cam_mat);
  2064. +
  2065. +       MT_Vector3 vr; // view right vector
  2066. +       MT_Vector3 vl; // view left vector
  2067. +
  2068. +       MT_Vector3 vright;
  2069. +       MT_Vector3 vleft;
  2070. +
  2071. +       vd.normalize();
  2072. +       vu.normalize()
  2073. +
  2074. +       vr = MT_cross(vu, vd);
  2075. +       vr.normalize();
  2076. +       
  2077. +       vl = MT_cross(vd, vu);
  2078. +       vl.normalize();
  2079. +
  2080. +       vright = vr - vd;
  2081. +       vleft = vl - vd;
  2082. +       
  2083. +       glMatrixMode(GL_PROJECTION);
  2084. +       glLoadIdentity();
  2085. +       gluPerspective(90.0,1.0,cam->GetCameraNear(),cam->GetCameraFar());
  2086. +
  2087. +       glMatrixMode(GL_MODELVIEW);
  2088. +       glLoadIdentity();
  2089. +
  2090. +       MT_Matrix3x3 m_lookAt;
  2091. +       switch (i){
  2092. +               case 0: //top
  2093. +                       m_lookAt = MT_Matrix3x3(vp[0],vp[1],vp[2],(vp[0]+vu[0]),(vp[1]+vu[1]),(vp[2]+vu[2]),-vright[0],-vright[1],-vright[2]);
  2094. +                       gluLookAt(vp[0],vp[1],vp[2],(vp[0]+vu[0]),(vp[1]+vu[1]),(vp[2]+vu[2]),-vright[0],-vright[1],-vright[2]);
  2095. +                       break;
  2096. +               case 1: //bottom
  2097. +                       m_lookAt = MT_Matrix3x3(vp[0],vp[1],vp[2],(vp[0]-vu[0]),(vp[1]-vu[1]),(vp[2]-vu[2]),-vleft[0],-vleft[1],-vleft[2]);
  2098. +                       gluLookAt(vp[0],vp[1],vp[2],(vp[0]-vu[0]),(vp[1]-vu[1]),(vp[2]-vu[2]),-vleft[0],-vleft[1],-vleft[2]);
  2099. +                       break;
  2100. +               case 2: // left
  2101. +                       m_lookAt = MT_Matrix3x3(vp[0],vp[1],vp[2],(vp[0] +vleft[0]),(vp[1] +vleft[1]),(vp[2]+vleft[2]),vu[0], vu[1], vu[2]);
  2102. +                       gluLookAt(vp[0],vp[1],vp[2],(vp[0] +vleft[0]),(vp[1] +vleft[1]),(vp[2]+vleft[2]),vu[0], vu[1], vu[2]);
  2103. +                       break;
  2104. +               case 3: // right
  2105. +                       m_lookAt = MT_Matrix3x3(vp[0],vp[1],vp[2],(vp[0]+vright[0]),(vp[1]+vright[1]),(vp[2]+vright[2]),vu[0],vu[1],vu[2]);
  2106. +                       gluLookAt(vp[0],vp[1],vp[2],(vp[0]+vright[0]),(vp[1]+vright[1]),(vp[2]+vright[2]),vu[0],vu[1],vu[2]);
  2107. +                       break;
  2108. +               default:
  2109. +                       gluLookAt(vp[0],vp[1],vp[2],(vp[0]+vd[0]),(vp[1]+vd[1]),(vp[2]+vd[2]),vu[0],vu[1],vu[2]);
  2110. +                       break;
  2111. +       };
  2112. +       
  2113. +       // implementing a manual gluLookAt()
  2114. +       MT_Vector3 m_vd = m_lookAt[1];
  2115. +       MT_Vector3 m_vu = m_lookAt[2];
  2116. +
  2117. +       MT_Vector3 f = m_vd - vp;
  2118. +       MT_Vector3 s = f * m_vu;
  2119. +       MT_Vector3 u = s * f;
  2120. +
  2121. +       MT_Matrix4x4 n_cam_mat = MT_Matrix4x4(s[0], s[1], s[2], 0.0,
  2122. +                                                                                 u[0], u[1], u[2], 0.0,
  2123. +                                                                                -f[0],-f[1],-f[2], 0.0,
  2124. +                                                                                  0.0,  0.0,  0.0, 0.0);
  2125. +       n_cam_mat = cam_mat * n_cam_mat;
  2126. +       
  2127. +//     glMatrixMode(GL_MODELVIEW);
  2128. +//     glLoadIdentity();
  2129. +//     glMultMatrixfv(n_cam_mat);
  2130. +//
  2131. +//     cam->SetModelviewMatrix(n_cam_mat);
  2132. +//     m_rasterizer->SetViewMatrix(n_cam_mat, cam->NodeGetWorldPosition(), cam->GetCameraLocation(), cam->GetCameraOrientation());
  2133. +       
  2134. +}
  2135. +/*
  2136. +void DomeRotateView(KX_Camera* cam, int i){
  2137. +//Mix MatrixMethod
  2138. +       MT_Matrix4x4 cam_mat = cam->GetModelviewMatrix();
  2139. +
  2140. +       MT_Vector3 vu = MT_Vector3 (cam_mat[1][0], cam_mat[1][1], cam_mat[1][2]); // view up vector
  2141. +       MT_Vector3 vd = MT_Vector3 (cam_mat[2][0], cam_mat[2][1], cam_mat[2][2]); // view direction
  2142. +       MT_Vector3 vp = MT_Vector3 (cam_mat[3][0], cam_mat[3][1], cam_mat[3][2]); // view position
  2143. +       MT_Vector3 aup = MT_Vector3 (0.0,0.0,1.0);
  2144. +
  2145. +       vp = cam->NodeGetWorldPosition();
  2146. +
  2147. +//     cam->SetModelviewMatrix(cam_mat);
  2148. +
  2149. +       MT_Vector3 vr; // view right vector
  2150. +       MT_Vector3 vl; // view left vector
  2151. +
  2152. +       MT_Vector3 vright;
  2153. +       MT_Vector3 vleft;
  2154. +
  2155. +       vd.normalize();
  2156. +       vu.normalize()
  2157. +
  2158. +       vr = MT_cross(vu, vd);
  2159. +       vr.normalize();
  2160. +       
  2161. +       vl = MT_cross(vd, vu);
  2162. +       vl.normalize();
  2163. +
  2164. +       vright = vr - vd;
  2165. +       vleft = vl - vd;
  2166. +
  2167. +       glMatrixMode(GL_PROJECTION);
  2168. +       glLoadIdentity();
  2169. +       gluPerspective(90.0,1.0,cam->GetCameraNear(),cam->GetCameraFar());
  2170. +
  2171. +       glMatrixMode(GL_MODELVIEW);
  2172. +       glLoadIdentity();
  2173. +       switch (i){
  2174. +               case 0: //top
  2175. +                       gluLookAt(vp[0],vp[1],vp[2],(vp[0]+vu[0]),(vp[1]+vu[1]),(vp[2]+vu[2]),-vright[0],-vright[1],-vright[2]);
  2176. +                       break;
  2177. +               case 1: //bottom
  2178. +                       gluLookAt(vp[0],vp[1],vp[2],(vp[0]-vu[0]),(vp[1]-vu[1]),(vp[2]-vu[2]),-vleft[0],-vleft[1],-vleft[2]);
  2179. +                       break;
  2180. +               case 2: // left
  2181. +                       gluLookAt(vp[0],vp[1],vp[2],(vp[0] +vleft[0]),(vp[1] +vleft[1]),(vp[2]+vleft[2]),vu[0], vu[1], vu[2]);
  2182. +                       break;
  2183. +               case 3: // right
  2184. +                       gluLookAt(vp[0],vp[1],vp[2],(vp[0]+vright[0]),(vp[1]+vright[1]),(vp[2]+vright[2]),vu[0],vu[1],vu[2]);
  2185. +                       break;
  2186. +               default:
  2187. +                       gluLookAt(vp[0],vp[1],vp[2],(vp[0]+vd[0]),(vp[1]+vd[1]),(vp[2]+vd[2]),vu[0],vu[1],vu[2]);
  2188. +                       break;
  2189. +       };
  2190. +}
  2191. +*/
  2192. +void DomeRotateViewPaul(KX_Camera* cam, int i){
  2193. +//PaulBourke
  2194. +//     SetViewMatrix(viewmat, m_camera->NodeGetWorldPosition(),
  2195. +//             m_camera->GetCameraLocation(), m_camera->GetCameraOrientation());
  2196. +
  2197. +       MT_Matrix3x3 camOrientMat3x3(cam->GetCameraOrientation());
  2198. +
  2199. +//     MT_Matrix3x3 camOrientMat3x3(cam->NodeGetWorldOrientation());
  2200. +
  2201. +//     MT_Vector3 unitViewDir(0.0, -1.0, 0.0);  // minus y direction, Blender convention
  2202. +       MT_Vector3 unitViewDir(0.0, -1.0, 0.0);  // minus y direction, Blender convention
  2203. +       MT_Vector3 unitViewupVec(0.0, 0.0, 1.0);
  2204. +       MT_Vector3 viewDir, viewupVec;
  2205. +       MT_Vector3 viewcrossleftVec, viewcrossrightVec;
  2206. +       MT_Vector3 viewleftVec, viewrightVec;
  2207. +       MT_Vector3 viewPos = cam->NodeGetWorldPosition();
  2208. +
  2209. +       // actual viewDir
  2210. +       viewDir = camOrientMat3x3 * unitViewDir;  // this is the moto convention, vector on right hand side
  2211. +       // actual viewup vec
  2212. +       viewupVec = camOrientMat3x3 * unitViewupVec;
  2213. +
  2214. +       // vector left to the camera
  2215. +       viewcrossleftVec = viewupVec.cross(viewDir);
  2216. +
  2217. +       // vector right to the camera
  2218. +       viewcrossrightVec = viewDir.cross(viewupVec);
  2219. +
  2220. +       //I don't think I really need a safe_normalized here (a regular normalized should work)
  2221. +       viewDir.safe_normalized();
  2222. +       viewupVec.safe_normalized();
  2223. +       viewcrossrightVec.safe_normalized();
  2224. +       viewcrossleftVec.safe_normalized();
  2225. +
  2226. +       viewrightVec = viewcrossrightVec + viewDir;
  2227. +       viewleftVec = viewcrossleftVec + viewDir;
  2228. +
  2229. +       glMatrixMode(GL_PROJECTION);
  2230. +       glLoadIdentity();
  2231. +       gluPerspective(90.0,1.0,cam->GetCameraNear(),cam->GetCameraFar());
  2232. +
  2233. +       glMatrixMode(GL_MODELVIEW);
  2234. +       glLoadIdentity();
  2235. +       switch (i){
  2236. +               case 0:
  2237. +                       gluLookAt(viewPos[0],viewPos[1],viewPos[2],(viewPos[0] +viewleftVec[0]),(viewPos[1] +viewleftVec[1]),(viewPos[2]+viewleftVec[2]),viewupVec[0], viewupVec[1], viewupVec[2]);
  2238. +                       break;
  2239. +               case 1:
  2240. +                       gluLookAt(viewPos[0],viewPos[1],viewPos[2],(viewPos[0]+viewrightVec[0]),(viewPos[1]+viewrightVec[1]),(viewPos[2]+viewrightVec[2]),viewupVec[0],viewupVec[1],viewupVec[2]);
  2241. +                       break;
  2242. +               case 2:
  2243. +                       gluLookAt(viewPos[0],viewPos[1],viewPos[2],(viewPos[0]+viewupVec[0]),(viewPos[1]+viewupVec[1]),(viewPos[2]+viewupVec[2]),-viewrightVec[0],-viewrightVec[1],-viewrightVec[2]);
  2244. +                       break;
  2245. +               case 3:
  2246. +                       gluLookAt(viewPos[0],viewPos[1],viewPos[2],(viewPos[0]-viewupVec[0]),(viewPos[1]-viewupVec[1]),(viewPos[2]-viewupVec[2]),-viewleftVec[0],-viewleftVec[1],-viewleftVec[2]);
  2247. +                       break;
  2248. +               case 4:
  2249. +                       gluLookAt(viewPos[0],viewPos[1],viewPos[2],(viewPos[0]-viewupVec[0]),(viewPos[1]-viewupVec[1]),(viewPos[2]-viewupVec[2]),-viewleftVec[0],-viewleftVec[1],-viewleftVec[2]);
  2250. +                       break;
  2251. +               case 5:
  2252. +                       gluLookAt(viewPos[0],viewPos[1],viewPos[2],(viewPos[0] +viewDir[0]),(viewPos[1] +viewDir[1]),(viewPos[2]+viewDir[2]),viewupVec[0], viewupVec[1], viewupVec[2]);
  2253. +                       break;
  2254. +       };
  2255. +
  2256. +
  2257. +//     MT_Scalar glviewmat[16];
  2258. +//     m_viewmatrix.getValue(glviewmat);
  2259. +
  2260. +//     glMatrixMode(GL_MODELVIEW);
  2261. +//     glLoadMatrixd(glviewmat);
  2262. +}
  2263. +void DomeRotateViewOld(KX_Camera* cam, int i){
  2264. +
  2265. +       MT_Matrix4x4 cam_mat = cam->GetModelviewMatrix();
  2266. +
  2267. +       MT_Vector3 vu = MT_Vector3 (cam_mat[1][0], cam_mat[1][1], cam_mat[1][2]); // view up vector
  2268. +       MT_Vector3 vd = MT_Vector3 (cam_mat[2][0], cam_mat[2][1], cam_mat[2][2]); // view direction
  2269. +       MT_Vector3 vp = MT_Vector3 (cam_mat[3][0], cam_mat[3][1], cam_mat[3][2]); // view position
  2270. +
  2271. +//     cam_mat[3][0] += 10.0;
  2272. +
  2273. +//     cam->SetModelviewMatrix(cam_mat);
  2274. +
  2275. +       MT_Vector3 vr; // view right vector
  2276. +       MT_Vector3 vl; // view left vector
  2277. +
  2278. +       MT_Vector3 vright;
  2279. +       MT_Vector3 vleft;
  2280. +
  2281. +       /* vp = view position */
  2282. +       MT_Point3 pos = cam->NodeGetWorldPosition();
  2283. +       MT_Point3 ori = MT_Point3 (0.0, 0.0, 0.0);
  2284. +//     vp = pos - ori;
  2285. +//     vp = cam->GetCameraLocation()
  2286. +//     vp = cam->NodeGetWorldPosition();
  2287. +
  2288. +       /* vu - view up vector */
  2289. +//     MT_Matrix3x3 worldori = cam->NodeGetWorldOrientation();
  2290. +//     vu = cam->PyGetAxisVect(0.0,0.0,1.0);
  2291. +//     vu = worldori * (pos - ori);
  2292. +
  2293. +       /* vd - view direction */
  2294. +//     vd = pos - ori;
  2295. +
  2296. +       vd.safe_normalized();
  2297. +       vu.safe_normalized();
  2298. +
  2299. +       vr = MT_cross(vd, vu);
  2300. +       vr.safe_normalized();
  2301. +
  2302. +       vl = MT_cross(vu, vd);
  2303. +       vl.safe_normalized();
  2304. +
  2305. +       vright = vr + vd;
  2306. +       vleft = vl + vd;
  2307. +
  2308. +       glMatrixMode(GL_PROJECTION);
  2309. +       glLoadIdentity();
  2310. +       gluPerspective(90.0,1.0,cam->GetCameraNear(),cam->GetCameraFar());
  2311. +
  2312. +//     GLdouble vp_x = (GLdouble *)vp.x;
  2313. +
  2314. +       MT_Matrix3x3 locRot [6] = {
  2315. +                               MT_Matrix3x3( 0.0, 1.0, 0.0, // 90º - Left
  2316. +                                                        -1.0, 0.0, 0.0,
  2317. +                                                         0.0, 0.0, 1.0),
  2318. +                               MT_Matrix3x3( 0.0,-1.0, 0.0, // 90º - Right
  2319. +                                                         1.0, 0.0, 0.0,
  2320. +                                                         0.0, 0.0, 1.0),
  2321. +                               MT_Matrix3x3( 0.0, 0.0, 1.0, // 90º - Bottom
  2322. +                                                         0.0,-1.0, 0.0,
  2323. +                                                         1.0, 0.0, 0.0),
  2324. +                               MT_Matrix3x3( 0.0, 0.0,-1.0, // 90º - Top
  2325. +                                                         0.0,-1.0, 0.0,
  2326. +                                                        -1.0, 0.0, 0.0),
  2327. +                               MT_Matrix3x3( 1.0, 0.0, 0.0, // 0º - Front
  2328. +                                                         0.0, 1.0, 0.0,
  2329. +                                                         0.0, 0.0, 1.0),
  2330. +                               MT_Matrix3x3(-1.0, 0.0, 0.0, // 180º - Back
  2331. +                                                         0.0,-1.0, 0.0,
  2332. +                                                         0.0, 0.0, 1.0)
  2333. +                                                       };
  2334. +       GLfloat directions[] = {
  2335. +                0.0,  0.0, -1.0,
  2336. +                0.0,  0.0,  1.0,
  2337. +                0.0, -1.0,  0.0,
  2338. +                0.0,  1.0,  0.0,
  2339. +               -1.0,  0.0,  0.0,
  2340. +                1.0,  0.0,  0.0
  2341. +       };
  2342. +       GLfloat ups[] = {
  2343. +                0.0, -1.0,  0.0,
  2344. +                0.0, -1.0,  0.0,
  2345. +                0.0,  0.0, -1.0,
  2346. +                0.0,  0.0,  1.0,
  2347. +                0.0, -1.0,  0.0,
  2348. +                0.0, -1.0,  0.0
  2349. +       };/*
  2350. +       GLfloat ups[] = {
  2351. +                0.0, 1.0,  0.0,
  2352. +                0.0, 1.0,  0.0,
  2353. +                0.0,  0.0, 1.0,
  2354. +                0.0,  0.0,  -1.0,
  2355. +                0.0, 1.0,  0.0,
  2356. +                0.0, 1.0,  0.0
  2357. +       };*/
  2358. +       //hand-rotating the camera
  2359. +//     gluLookAt(locRot[i][0][0],locRot[i][0][1],locRot[i][0][2],locRot[i][1][0],locRot[i][1][1],locRot[i][1][2],locRot[i][2][0],locRot[i][2][1],locRot[i][2][2]);
  2360. +
  2361. +       GLfloat *direction = directions;
  2362. +       GLfloat *up = ups;
  2363. +
  2364. +       //counter
  2365. +       direction += 3*i;
  2366. +       up += 3*i;
  2367. +
  2368. +       gluLookAt(0.0, 0.0, 0.0, direction[0], direction[1], direction[2],
  2369. +                         up[0], up[1], up[2]);
  2370. +
  2371. +       float vp_x = vp[0];
  2372. +/*
  2373. +       switch (i){
  2374. +               case 0:
  2375. +//                     gluLookAt(locRot[0][0],locRot[0][1],locRot[0][3],locRot[0][4],locRot[0][5],locRot[0][6],locRot[0][7],locRot[0][8]);
  2376. +                       gluLookAt(vp[0],vp[1],vp[2],(vp[0] +vleft[0]),(vp[1] +vleft[1]),(vp[2]+vleft[2]),vu[0], vu[1], vu[2]);
  2377. +                       break;
  2378. +               case 1:
  2379. +                       gluLookAt(vp[0],vp[1],vp[2],(vp[0]+vright[0]),(vp[1]+vright[1]),(vp[2]+vright[2]),vu[0],vu[1],vu[2]);
  2380. +                       break;
  2381. +               case 2:
  2382. +                       gluLookAt(vp[0],vp[1],vp[2],(vp[0]+vu[0]),(vp[1]+vu[1]),(vp[2]+vu[2]),-vright[0],-vright[1],-vright[2]);
  2383. +                       break;
  2384. +               case 3:
  2385. +                       gluLookAt(vp[0],vp[1],vp[2],(vp[0]-vu[0]),(vp[1]-vu[1]),(vp[2]-vu[2]),-vleft[0],-vleft[1],-vleft[2]);
  2386. +                       break;
  2387. +       };*/
  2388. +}
  2389. +void DomeBindImages(GLuint viewport[4], int i){
  2390. +
  2391. +       // Storing the cubemap image
  2392. +//     glBindTexture(GL_TEXTURE_CUBE_MAP, DomeFaces);
  2393. +//     glCopyTexImage2D(DomeFaceTarget[i], 0, GL_RGBA8, 0, 0, DomeFaceSize, DomeFaceSize, 0);
  2394. +
  2395. +       //storing the plane image (for tests)
  2396. +       glBindTexture(GL_TEXTURE_2D, DomeFaces[i]);
  2397. +//     glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 0, 0, viewport[2], viewport[3], 0);
  2398. +       glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 0, 0, DomeFaceSize, DomeFaceSize, 0);
  2399. +}
  2400. +void KX_KetsjiEngine::RenderDomeFrame(KX_Scene* scene, KX_Camera* cam)
  2401. +{
  2402. +       //routine to render the dome
  2403. +       const RAS_IRasterizer::StereoMode stereomode = m_rasterizer->GetStereoMode();
  2404. +       GLuint  viewport[4]={0};
  2405. +       glGetIntegerv(GL_VIEWPORT,(GLint *)viewport);
  2406. +       unsigned int m_viewport[4] = {viewport[0], viewport[1], viewport[2], viewport[3]};
  2407. +
  2408. +       //tmp disabling culling
  2409. +       cam->SetFrustumCulling(false);
  2410. +//     KX_Dome my_dome = KX_Dome(scene,cam);
  2411. +//     KX_Dome *kx_dome = &my_dome;
  2412. +
  2413. +       //the initial orientation of the camera
  2414. +       MT_Matrix4x4 cam_mat = cam->GetModelviewMatrix();
  2415. +//     cam->SetModelviewMatrix(cam_mat);
  2416. +       MT_Matrix4x4 cam_mat_b = cam->GetModelviewMatrix();
  2417. +       
  2418. +       DomePreRender(scene,cam);
  2419. +       for (int i=0;i<4;i++){
  2420. +               DomeRotateView(cam, i, cam_mat);
  2421. +//             DomeRotateCamera(cam, i);
  2422. +               DomeRenderRoutine(scene, cam);
  2423. +               DomeBindImages(viewport, i);
  2424. +       }
  2425. +//     cam->SetModelviewMatrix(cam_mat);
  2426. +       DomePostRender(scene,cam,stereomode);
  2427. +       m_canvas->EndFrame();
  2428. +//     m_dome->Dome_CubeCreate(1); // in Dome.cpp
  2429. +       m_dome->Dome_CubeDraw(m_viewport,DomeFaces[0]);
  2430. +       //DomeDraw(m_viewport, DomeFaces);
  2431. +}
  2432. +void KX_KetsjiEngine::DomePreRender(KX_Scene* m_scene, KX_Camera* m_camera)
  2433. +{
  2434. +       // The final one
  2435. +       RAS_FrameFrustum frustrum;
  2436. +//     const RAS_IRasterizer::StereoMode stereomode = m_rasterizer->GetStereoMode();
  2437. +
  2438. +       //Set the viewport to be of the size of the Dome face
  2439. +       m_canvas->SetViewPort(0,0, DomeFaceSize, DomeFaceSize);
  2440. +       m_canvas->ClearColor(m_overrideFrameColorR,m_overrideFrameColorB,m_overrideFrameColorB,1.0);
  2441. +
  2442. +       m_rasterizer->BeginFrame(RAS_IRasterizer::KX_TEXTURED,GetClockTime());
  2443. +       m_rendertools->BeginFrame(m_rasterizer);
  2444. +       SetWorldSettings(m_scene->GetWorldInfo());
  2445. +    m_rendertools->SetAuxilaryClientInfo(m_scene);
  2446. +    m_rasterizer->SetStereoMode(RAS_IRasterizer::RAS_STEREO_NOSTEREO);
  2447. +
  2448. +       m_rasterizer->DisplayFog();
  2449. +
  2450. +       if (m_camera->hasValidProjectionMatrix())
  2451. +       {
  2452. +               m_rasterizer->SetProjectionMatrix(m_camera->GetProjectionMatrix());
  2453. +    } else
  2454. +    {
  2455. +               float lens = m_camera->GetLens();
  2456. +               bool orthographic = !m_camera->GetCameraData()->m_perspective;
  2457. +               float nearfrust = m_camera->GetCameraNear();
  2458. +               float farfrust = m_camera->GetCameraFar();
  2459. +        float aspect_ratio = 1.0f;
  2460. +
  2461. +
  2462. +        RAS_FramingManager::ComputeDefaultFrustum(
  2463. +            nearfrust,
  2464. +            farfrust,
  2465. +            lens,
  2466. +            aspect_ratio,
  2467. +            frustrum);
  2468. +              
  2469. +               MT_Matrix4x4 projmat = m_rasterizer->GetFrustumMatrix(
  2470. +                       frustrum.x1, frustrum.x2, frustrum.y1, frustrum.y2, frustrum.camnear, frustrum.camfar);
  2471. +
  2472. +               m_camera->SetProjectionMatrix(projmat);
  2473. +       }
  2474. +
  2475. +       MT_Transform camtrans(m_camera->GetWorldToCamera());
  2476. +       MT_Matrix4x4 viewmat(camtrans);
  2477. +       
  2478. +       m_rasterizer->SetViewMatrix(viewmat, m_camera->NodeGetWorldPosition(),
  2479. +               m_camera->GetCameraLocation(), m_camera->GetCameraOrientation());
  2480. +       m_camera->SetModelviewMatrix(viewmat);
  2481. +
  2482. +       m_scene->UpdateMeshTransformations();
  2483. +}
  2484. +void KX_KetsjiEngine::DomeRenderRoutine(KX_Scene* m_scene, KX_Camera* m_camera)
  2485. +{
  2486. +       MT_Transform camtrans(m_camera->GetWorldToCamera());
  2487. +       m_canvas->ClearColor(m_overrideFrameColorR,m_overrideFrameColorB,m_overrideFrameColorB,1.0);
  2488. +       m_canvas->ClearBuffer(RAS_ICanvas::COLOR_BUFFER|RAS_ICanvas::DEPTH_BUFFER);
  2489. +
  2490. +       m_scene->CalculateVisibleMeshes(m_rasterizer,m_camera);
  2491. +       m_scene->RenderBuckets(camtrans, m_rasterizer, m_rendertools);
  2492. +}
  2493. +void KX_KetsjiEngine::DomePostRender(KX_Scene* m_scene, KX_Camera* m_camera, RAS_IRasterizer::StereoMode stereomode)
  2494. +{
  2495. +    m_rasterizer->SetStereoMode(stereomode);
  2496. +       //restore glViewport();
  2497. +       //restore glScissor();
  2498. +//     m_canvas->SetViewport(viewport[0], viewport[1], viewport[2], viewport[3]);
  2499. +}
  2500. +void KX_KetsjiEngine::DomeImageRender(KX_Scene* m_scene, KX_Camera* m_camera)
  2501. +{
  2502. +       RAS_FrameFrustum frustrum;
  2503. +       const RAS_IRasterizer::StereoMode stereomode = m_rasterizer->GetStereoMode();
  2504. +
  2505. +    // The screen area that ImageViewport will copy is also the rendering zone
  2506. +//    m_canvas->SetViewPort(m_position[0], m_position[1], m_position[0]+m_capSize[0]-1, m_position[1]+m_capSize[1]-1);
  2507. + //   m_canvas->ClearColor(m_background[0], m_background[1], m_background[2], m_background[3]);
  2508. +       m_canvas->SetViewPort(0, 0, m_canvas->GetWidth(), m_canvas->GetHeight());
  2509. +       m_canvas->ClearColor(m_overrideFrameColorR,m_overrideFrameColorB,m_overrideFrameColorB,1.0);
  2510. +
  2511. +       m_canvas->ClearBuffer(RAS_ICanvas::COLOR_BUFFER|RAS_ICanvas::DEPTH_BUFFER);
  2512. +//    m_rasterizer->BeginFrame(RAS_IRasterizer::KX_TEXTURED,m_engine->GetClockTime());
  2513. +    m_rasterizer->BeginFrame(RAS_IRasterizer::KX_TEXTURED,GetClockTime());
  2514. +       m_rendertools->BeginFrame(m_rasterizer);
  2515. +//    m_engine->SetWorldSettings(m_scene->GetWorldInfo());
  2516. +       SetWorldSettings(m_scene->GetWorldInfo());
  2517. +    m_rendertools->SetAuxilaryClientInfo(m_scene);
  2518. +    m_rasterizer->DisplayFog();
  2519. +    // matrix calculation, don't apply any of the stereo mode
  2520. +    m_rasterizer->SetStereoMode(RAS_IRasterizer::RAS_STEREO_NOSTEREO);
  2521. +
  2522. +       if (m_camera->hasValidProjectionMatrix())
  2523. +       {
  2524. +               m_rasterizer->SetProjectionMatrix(m_camera->GetProjectionMatrix());
  2525. +    } else
  2526. +    {
  2527. +               float lens = m_camera->GetLens();
  2528. +               bool orthographic = !m_camera->GetCameraData()->m_perspective;
  2529. +               float nearfrust = m_camera->GetCameraNear();
  2530. +               float farfrust = m_camera->GetCameraFar();
  2531. +        float aspect_ratio = 1.0f;
  2532. +//        Scene *blenderScene = m_scene->GetBlenderScene();
  2533. +
  2534. +               // compute the aspect ratio from frame blender scene settings so that render to texture
  2535. +        // works the same in Blender and in Blender player
  2536. + //       if (blenderScene->r.ysch != 0)
  2537. +   //         aspect_ratio = float(blenderScene->r.xsch) / float(blenderScene->r.ysch);
  2538. +
  2539. +        RAS_FramingManager::ComputeDefaultFrustum(
  2540. +            nearfrust,
  2541. +            farfrust,
  2542. +            lens,
  2543. +            aspect_ratio,
  2544. +            frustrum);
  2545. +              
  2546. +               MT_Matrix4x4 projmat = m_rasterizer->GetFrustumMatrix(
  2547. +                       frustrum.x1, frustrum.x2, frustrum.y1, frustrum.y2, frustrum.camnear, frustrum.camfar);
  2548. +
  2549. +               m_camera->SetProjectionMatrix(projmat);
  2550. +       }
  2551. +
  2552. +       MT_Transform camtrans(m_camera->GetWorldToCamera());
  2553. +//     if (!m_camera->GetCameraData()->m_perspective)
  2554. +//             camtrans.getOrigin()[2] *= ortho;
  2555. +       MT_Matrix4x4 viewmat(camtrans);
  2556. +
  2557. +       m_rasterizer->SetViewMatrix(viewmat, m_camera->NodeGetWorldPosition(),
  2558. +               m_camera->GetCameraLocation(), m_camera->GetCameraOrientation());
  2559. +       m_camera->SetModelviewMatrix(viewmat);
  2560. +    // restore the stereo mode now that the matrix is computed
  2561. +    m_rasterizer->SetStereoMode(stereomode);
  2562. +
  2563. +    // do not update the mesh, we don't want to do it more than once per frame
  2564. +    //m_scene->UpdateMeshTransformations();
  2565. +
  2566. +       m_scene->CalculateVisibleMeshes(m_rasterizer,m_camera);
  2567. +
  2568. +       m_scene->RenderBuckets(camtrans, m_rasterizer, m_rendertools);
  2569. +}
  2570. +void KX_KetsjiEngine::DomeOriginalRender()
  2571. +{
  2572.         KX_Scene* firstscene = *m_scenes.begin();
  2573.         const RAS_FrameSettings &framesettings = firstscene->GetFramingType();
  2574.  
  2575. @@ -737,9 +1592,567 @@
  2576.  
  2577.         EndFrame();
  2578.  }
  2579. +void KX_KetsjiEngine::oldDomeRender(KX_Scene* scene, KX_Camera* cam)
  2580. +{
  2581. +       //old file
  2582. +       /*
  2583. +       Render (call Render)
  2584. +       copy (Bind);
  2585. +       rotate;
  2586. +       Render (call Render)
  2587. +       copy (Bind);
  2588. +       Render (call Render)
  2589. +       copy (Bind);
  2590. +       Draw
  2591. +       */
  2592.  
  2593. +       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  2594.  
  2595. +       bool override_camera;
  2596. +       RAS_Rect viewport, area;
  2597. +       float left, right, bottom, top, nearfrust, farfrust, focallength;
  2598. +       const float ortho = 100.0;
  2599. +//     KX_Camera* cam = scene->GetActiveCamera();
  2600. +       
  2601. +       if (!cam)
  2602. +               return;
  2603.  
  2604. +       GetSceneViewport(scene, cam, area, viewport);
  2605. +
  2606. +       // store the computed viewport in the scene
  2607. +       scene->SetSceneViewport(viewport);     
  2608. +
  2609. +       // set the viewport for this frame and scene
  2610. +       m_canvas->SetViewPort(viewport.GetLeft(), viewport.GetBottom(),
  2611. +               viewport.GetRight(), viewport.GetTop());       
  2612. +       
  2613. +       // see KX_BlenderMaterial::Activate
  2614. +       //m_rasterizer->SetAmbient();
  2615. +       m_rasterizer->DisplayFog();
  2616. +
  2617. +       override_camera = m_overrideCam && (scene->GetName() == m_overrideSceneName);
  2618. +       override_camera = override_camera && (cam->GetName() == "__default__cam__");
  2619. +
  2620. +       if (override_camera && m_overrideCamUseOrtho) {
  2621. +               MT_CmMatrix4x4 projmat = m_overrideCamProjMat;
  2622. +               m_rasterizer->SetProjectionMatrix(projmat);
  2623. +       } else if (cam->hasValidProjectionMatrix() && !cam->GetViewport() )
  2624. +       {
  2625. +               m_rasterizer->SetProjectionMatrix(cam->GetProjectionMatrix());
  2626. +       } else
  2627. +       {
  2628. +               RAS_FrameFrustum frustum;
  2629. +               float lens = cam->GetLens();
  2630. +               nearfrust = cam->GetCameraNear();
  2631. +               farfrust = cam->GetCameraFar();
  2632. +               focallength = cam->GetFocalLength();
  2633. +
  2634. +               if(override_camera) {
  2635. +                       nearfrust = m_overrideCamNear;
  2636. +                       farfrust = m_overrideCamFar;
  2637. +               }
  2638. +              
  2639. +               RAS_FramingManager::ComputeFrustum(
  2640. +                       scene->GetFramingType(),
  2641. +                       area,
  2642. +                       viewport,
  2643. +                       lens,
  2644. +                       nearfrust,
  2645. +                       farfrust,
  2646. +                       frustum
  2647. +               );
  2648. +
  2649. +               left = frustum.x1 * m_cameraZoom;
  2650. +               right = frustum.x2 * m_cameraZoom;
  2651. +               bottom = frustum.y1 * m_cameraZoom;
  2652. +               top = frustum.y2 * m_cameraZoom;
  2653. +               nearfrust = frustum.camnear;
  2654. +               farfrust = frustum.camfar;
  2655. +
  2656. +               MT_Matrix4x4 projmat = m_rasterizer->GetFrustumMatrix(
  2657. +                       left, right, bottom, top, nearfrust, farfrust, focallength);
  2658. +
  2659. +               cam->SetProjectionMatrix(projmat);
  2660. +              
  2661. +       }
  2662. +
  2663. +       MT_Transform camtrans(cam->GetWorldToCamera());
  2664. +       if (!cam->GetCameraData()->m_perspective)
  2665. +               camtrans.getOrigin()[2] *= ortho;
  2666. +       MT_Matrix4x4 viewmat(camtrans);
  2667. +
  2668. +       scene->UpdateMeshTransformations();
  2669. +
  2670. +       MT_Quaternion cam_ori = cam->GetCameraOrientation();
  2671. +       MT_Matrix3x3 cam_node_ori = cam->GetSGNode()->GetLocalOrientation();
  2672. +       MT_Matrix3x3 gloOri = cam->NodeGetWorldOrientation().inverse();
  2673. +//     MT_Matrix3x3 gloOri = cam->NodeGetWorldOrientation();
  2674. +
  2675. +
  2676. +       MT_Matrix3x3 locRot [6] = {
  2677. +                                               MT_Matrix3x3( 1.0, 0.0, 0.0, // 0º - Front
  2678. +                                                                         0.0, 1.0, 0.0,
  2679. +                                                                         0.0, 0.0, 1.0),
  2680. +                                               MT_Matrix3x3(-1.0, 0.0, 0.0, // 180º - Back
  2681. +                                                                         0.0,-1.0, 0.0,
  2682. +                                                                         0.0, 0.0, 1.0),
  2683. +                                               MT_Matrix3x3( 0.0, 1.0, 0.0, // 90º - Left
  2684. +                                                                        -1.0, 0.0, 0.0,
  2685. +                                                                         0.0, 0.0, 1.0),
  2686. +                                               MT_Matrix3x3( 0.0,-1.0, 0.0, // 90º - Right
  2687. +                                                                         1.0, 0.0, 0.0,
  2688. +                                                                         0.0, 0.0, 1.0),
  2689. +                                               MT_Matrix3x3( 0.0, 0.0,-1.0, // 90º - Top
  2690. +                                                                         0.0, 1.0, 0.0,
  2691. +                                                                         1.0, 0.0, 0.0),
  2692. +                                               MT_Matrix3x3( 0.0, 0.0, 1.0, // 90º - Bottom
  2693. +                                                                         0.0, 1.0, 0.0,
  2694. +                                                                        -1.0, 0.0, 0.0)
  2695. +                                                               };
  2696. +
  2697. +       glEnable(GL_TEXTURE_2D);
  2698. +       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  2699. +
  2700. +       for (int i = 0;i<6;i++){
  2701. +
  2702. +       //      cam->NodeSetLocalOrientation(locRot*gloOri);
  2703. +
  2704. +       //      cam->NodeSetLocalOrientation(locRot[i]*cam->GetSGNode()->GetLocalOrientation());
  2705. +               cam->NodeSetLocalOrientation(locRot[i]*cam_node_ori);
  2706. +       //      scene->UpdateMeshTransformations();
  2707. +
  2708. +       ////    RenderDomeCamera(scene, cam, viewmat, camtrans, rotn180);
  2709. +
  2710. +/* Code from the top */
  2711. +
  2712. +               GetSceneViewport(scene, cam, area, viewport);
  2713. +
  2714. +       // store the computed viewport in the scene
  2715. +               scene->SetSceneViewport(viewport);     
  2716. +
  2717. +       // set the viewport for this frame and scene
  2718. +               m_canvas->SetViewPort(viewport.GetLeft(), viewport.GetBottom(),
  2719. +               viewport.GetRight(), viewport.GetTop());       
  2720. +
  2721. +               RAS_FrameFrustum frustum;
  2722. +               float lens = cam->GetLens();
  2723. +               nearfrust = cam->GetCameraNear();
  2724. +               farfrust = cam->GetCameraFar();
  2725. +               focallength = cam->GetFocalLength();
  2726. +
  2727. +               if(override_camera) {
  2728. +                       nearfrust = m_overrideCamNear;
  2729. +                       farfrust = m_overrideCamFar;
  2730. +               }
  2731. +              
  2732. +               RAS_FramingManager::ComputeFrustum(
  2733. +                       scene->GetFramingType(),
  2734. +                       area,
  2735. +                       viewport,
  2736. +                       lens,
  2737. +                       nearfrust,
  2738. +                       farfrust,
  2739. +                       frustum
  2740. +               );
  2741. +
  2742. +               left = frustum.x1 * m_cameraZoom;
  2743. +               right = frustum.x2 * m_cameraZoom;
  2744. +               bottom = frustum.y1 * m_cameraZoom;
  2745. +               top = frustum.y2 * m_cameraZoom;
  2746. +               nearfrust = frustum.camnear;
  2747. +               farfrust = frustum.camfar;
  2748. +
  2749. +               MT_Matrix4x4 projmat = m_rasterizer->GetFrustumMatrix(
  2750. +                       left, right, bottom, top, nearfrust, farfrust, focallength);
  2751. +
  2752. +               cam->SetProjectionMatrix(projmat);
  2753. +
  2754. +/* end: Code from the top */
  2755. +
  2756. +               MT_Transform camtrans_b(cam->GetWorldToCamera());
  2757. +               MT_Matrix4x4 viewmat_b(camtrans_b);
  2758. +
  2759. +               m_rasterizer->SetViewMatrix(viewmat_b, cam->NodeGetWorldPosition(),
  2760. +               cam->GetCameraLocation(), cam->GetCameraOrientation());
  2761. +
  2762. +       //      camtrans = cam->GetWorldToCamera();
  2763. +       //      viewmat = camtrans;
  2764. +
  2765. +               cam->SetModelviewMatrix(viewmat_b);
  2766. +
  2767. +
  2768. +               scene->CalculateVisibleMeshes(m_rasterizer,cam);
  2769. +
  2770. +               scene->UpdateMeshTransformations();
  2771. +
  2772. +               glReadBuffer(GL_BACK);
  2773. +               glDrawBuffer(GL_BACK);
  2774. +               glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  2775. +
  2776. +               scene->RenderBuckets(camtrans, m_rasterizer, m_rendertools);
  2777. +               glFinish();
  2778. +
  2779. +
  2780. +               // save the images
  2781. +//             glActiveTexture(DomeFacesTmp[i]);
  2782. +
  2783. +//             drawTestTriangle(viewport, i); // test to make each texture different
  2784. +
  2785. +               glBindTexture(GL_TEXTURE_2D, DomeFacesTmp[i]);
  2786. +               glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 0, 0, viewport.GetWidth(), viewport.GetHeight(), 0);
  2787. +               glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  2788. +
  2789. +               /*
  2790. +               unsigned char *pixels;
  2791. +
  2792. +               // Allocate memory for the pixel data //
  2793. +               if (! (pixels = (unsigned char *)malloc(viewport.GetWidth() * viewport.GetHeight() * 3))) {
  2794. +                       fprintf(stderr, "not enough memory for pixel data\n");
  2795. +                       exit(1);
  2796. +               }
  2797. +
  2798. +               // Read the framebuffer content and create a texture using the image data
  2799. +                // (glCopyTexImage2D does NOT work for this purpose!) //
  2800. +               glReadPixels(viewport.GetLeft(), viewport.GetBottom(), viewport.GetWidth(), viewport.GetHeight(), GL_RGB,
  2801. +                                        GL_UNSIGNED_BYTE, pixels);
  2802. +*/
  2803. +
  2804. +       }
  2805. +       /* Copy Color Buffer to EnvMap */
  2806. +//     glBindTexture(GL_TEXTURE_CUBE_MAP, DomeFaces);
  2807. +//     for (int i=0;i<6;i++){
  2808. +//             glCopyTexImage2D(DomeFaceTarget[i], 0, GL_RGBA8, 0, 0, viewport.GetWidth(), viewport.GetHeight(), 0);
  2809. +//             glCopyTexImage2D(DomeFaceTarget[i], 0, GL_RGBA8, 0, 0, DomeFaceSize, DomeFaceSize, 0);
  2810. +
  2811. +/*
  2812. +               unsigned char *pixels;
  2813. +
  2814. +               // Allocate memory for the pixel data //
  2815. +               if (! (pixels = (unsigned char *)malloc(viewport.GetWidth() * viewport.GetHeight() * 3))) {
  2816. +                       fprintf(stderr, "not enough memory for pixel data\n");
  2817. +                       exit(1);
  2818. +               }
  2819. +
  2820. +               // Read the framebuffer content and create a texture using the image data
  2821. +                // (glCopyTexImage2D does NOT work for this purpose!) //
  2822. +               glReadPixels(viewport.GetLeft(), viewport.GetBottom(), viewport.GetWidth(), viewport.GetHeight(), GL_RGB,
  2823. +                                        GL_UNSIGNED_BYTE, pixels);
  2824. +
  2825. +               glTexImage2D(DomeFaceTarget[i], 0, GL_RGB, viewport.GetWidth(), viewport.GetHeight(), 0, GL_RGB,
  2826. +                                        GL_UNSIGNED_BYTE, pixels);
  2827. +
  2828. +*/     
  2829. +//     }
  2830. +
  2831. +       /* TMP my test */
  2832. +       /*
  2833. +//XXX
  2834. +*/
  2835. +//     for (int i=0;i<6;i++){
  2836. +//             glBindTexture(GL_TEXTURE_2D, DomeFacesTmp[i]);
  2837. +//             glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 0, 0, viewport.GetWidth(), viewport.GetHeight(), 0);
  2838. +//     }
  2839. +//XXX
  2840. +
  2841. +       /* Drawing the Sphere on top of the screen */
  2842. +       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  2843. +       glMatrixMode(GL_PROJECTION);
  2844. +       glLoadIdentity();
  2845. +
  2846. +       /* Making the viewport always square */
  2847. +
  2848. +       int can_width = viewport.GetWidth();
  2849. +       int can_height = viewport.GetHeight();
  2850. +
  2851. +       float ortho_width, ortho_height;
  2852. +
  2853. +       if (can_width < can_height){
  2854. +               ortho_width = 1.0;
  2855. +               ortho_height = (float)can_height/can_width;
  2856. +       }else{
  2857. +               ortho_width = (float)can_width/can_height;
  2858. +               ortho_height = 1.0;
  2859. +       }
  2860. +       glOrtho((-ortho_width), ortho_width, (-ortho_height), ortho_height, -20.0, 10.0);
  2861. +
  2862. +       glMatrixMode(GL_MODELVIEW);
  2863. +       glLoadIdentity();
  2864. +       glDisable(GL_DEPTH_TEST);
  2865. +       glPolygonMode(GL_FRONT, GL_FILL);
  2866. +       glShadeModel(GL_SMOOTH);
  2867. +       glDisable(GL_LIGHTING);
  2868. +
  2869. +//     glEnable(GL_TEXTURE_CUBE_MAP_EXT);
  2870. +//     glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
  2871. +/*
  2872. +       glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
  2873. +       glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
  2874. +       glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
  2875. +*/
  2876. +       glDisable(GL_TEXTURE_2D);
  2877. +       glEnable(GL_TEXTURE_CUBE_MAP);
  2878. +       glBindTexture(GL_TEXTURE_CUBE_MAP, DomeFaces[0]);
  2879. +//     glBindTexture(GL_TEXTURE_CUBE_MAP, DomeFaces); // original cubemap call
  2880. +       
  2881. +//     DrawDomeSphere(9.0);
  2882. +
  2883. +       glBegin(GL_TRIANGLES);
  2884. +               glColor3f(0.0f ,0.0f, 1.0f);
  2885. +               glVertex3f( 0.0f, 0.5f, 4.0f);
  2886. +               glColor3f(0.0f ,0.5f, 0.0f);
  2887. +               glVertex3f(-0.5f,-0.5f, 4.0f);
  2888. +               glColor3f(1.0f ,0.0f, 0.0f);
  2889. +               glVertex3f( 0.5f,-0.5f, 4.0f);
  2890. +       glEnd();
  2891. +
  2892. +       glDisable(GL_TEXTURE_CUBE_MAP);
  2893. +       glEnable(GL_TEXTURE_2D);
  2894. +//     glBindTexture(GL_TEXTURE_2D, DomeFaces);
  2895. +//     glBindTexture(GL_TEXTURE_2D, DomeFacesTmp[0]);
  2896. +//     glBindTexture(GL_TEXTURE_2D, 7);
  2897. +
  2898. +// DomeFacesTmp[0] -> GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT
  2899. +       glBindTexture(GL_TEXTURE_2D, DomeFacesTmp[0]);
  2900. +       glBegin(GL_QUADS);
  2901. +               glColor3f(1.0f ,1.0f, 1.0f);
  2902. +               glTexCoord2f(1.0,1.0);
  2903. +               glVertex3f( -0.35f, 0.8f, 3.0f);
  2904. +               glTexCoord2f(0.0,1.0);
  2905. +               glVertex3f(-0.95f,0.8f, 3.0f);
  2906. +               glTexCoord2f(0.0,0.0);
  2907. +               glVertex3f(-0.95f,0.2f, 3.0f);
  2908. +               glTexCoord2f(1.0,0.0);
  2909. +               glVertex3f(-0.35f,0.2f, 3.0f);
  2910. +       glEnd();
  2911. +
  2912. +// DomeFacesTmp[1] -> GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT
  2913. +       glBindTexture(GL_TEXTURE_2D, DomeFacesTmp[1]);
  2914. +       glBegin(GL_QUADS);
  2915. +               glColor3f(1.0f ,1.0f, 1.0f);
  2916. +               glTexCoord2f(1.0,1.0);
  2917. +               glVertex3f( -0.35f, -0.2f, 3.0f);
  2918. +               glTexCoord2f(0.0,1.0);
  2919. +               glVertex3f(-0.95f,-0.2f, 3.0f);
  2920. +               glTexCoord2f(0.0,0.0);
  2921. +               glVertex3f(-0.95f,-0.8f, 3.0f);
  2922. +               glTexCoord2f(1.0,0.0);
  2923. +               glVertex3f(-0.35f,-0.8f, 3.0f);
  2924. +       glEnd();
  2925. +
  2926. +// DomeFacesTmp[2] -> GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT
  2927. +       glBindTexture(GL_TEXTURE_2D, DomeFacesTmp[2]);
  2928. +       glBegin(GL_QUADS);
  2929. +               glColor3f(1.0f ,1.0f, 1.0f);
  2930. +               glTexCoord2f(1.0,1.0);
  2931. +               glVertex3f( 0.3f, 0.8f, 3.0f);
  2932. +               glTexCoord2f(0.0,1.0);
  2933. +               glVertex3f(-0.3f,0.8f, 3.0f);
  2934. +               glTexCoord2f(0.0,0.0);
  2935. +               glVertex3f(-0.3f,0.2f, 3.0f);
  2936. +               glTexCoord2f(1.0,0.0);
  2937. +               glVertex3f(0.3f,0.2f, 3.0f);
  2938. +       glEnd();
  2939. +
  2940. +// DomeFacesTmp[3] -> GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT
  2941. +       glBindTexture(GL_TEXTURE_2D, DomeFacesTmp[3]);
  2942. +       glBegin(GL_QUADS);
  2943. +               glColor3f(1.0f ,1.0f, 1.0f);
  2944. +               glTexCoord2f(1.0,1.0);
  2945. +               glVertex3f( 0.3f, -0.2f, 3.0f);
  2946. +               glTexCoord2f(0.0,1.0);
  2947. +               glVertex3f(-0.3f,-0.2f, 3.0f);
  2948. +               glTexCoord2f(0.0,0.0);
  2949. +               glVertex3f(-0.3f,-0.8f, 3.0f);
  2950. +               glTexCoord2f(1.0,0.0);
  2951. +               glVertex3f(0.3f,-0.8f, 3.0f);
  2952. +       glEnd();
  2953. +
  2954. +// DomeFacesTmp[4] -> GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT
  2955. +       glBindTexture(GL_TEXTURE_2D, DomeFacesTmp[4]);
  2956. +       glBegin(GL_QUADS);
  2957. +               glColor3f(1.0f ,1.0f, 1.0f);
  2958. +               glTexCoord2f(1.0,1.0);
  2959. +               glVertex3f( 0.95f, 0.8f, 3.0f);
  2960. +               glTexCoord2f(0.0,1.0);
  2961. +               glVertex3f( 0.35f,0.8f, 3.0f);
  2962. +               glTexCoord2f(0.0,0.0);
  2963. +               glVertex3f( 0.35f,0.2f, 3.0f);
  2964. +               glTexCoord2f(1.0,0.0);
  2965. +               glVertex3f( 0.95f,0.2f, 3.0f);
  2966. +       glEnd();
  2967. +
  2968. +// DomeFacesTmp[5] -> GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT
  2969. +       glBindTexture(GL_TEXTURE_2D, DomeFacesTmp[5]);
  2970. +       glBegin(GL_QUADS);
  2971. +               glColor3f(1.0f ,1.0f, 1.0f);
  2972. +               glTexCoord2f(1.0,1.0);
  2973. +               glVertex3f( 0.95f, -0.2f, 3.0f);
  2974. +               glTexCoord2f(0.0,1.0);
  2975. +               glVertex3f(0.35f,-0.2f, 3.0f);
  2976. +               glTexCoord2f(0.0,0.0);
  2977. +               glVertex3f(0.35f,-0.8f, 3.0f);
  2978. +               glTexCoord2f(1.0,0.0);
  2979. +               glVertex3f( 0.95f,-0.8f, 3.0f);
  2980. +       glEnd();
  2981. +
  2982. +/*
  2983. +       glBegin(GL_QUADS);
  2984. +               glTexCoord2f(1.0,1.0);
  2985. +               glColor3f(0.0f ,0.0f, 1.0f);
  2986. +               glVertex3f( 0.8f, 0.8f, 3.0f);
  2987. +               glTexCoord2f(0.0,1.0);
  2988. +               glColor3f(0.0f ,0.5f, 0.0f);
  2989. +               glVertex3f(-0.8f,0.8f, 3.0f);
  2990. +               glTexCoord2f(0.0,0.0);
  2991. +               glColor3f(1.0f ,0.0f, 0.0f);
  2992. +               glVertex3f(-0.8f,-0.8f, 3.0f);
  2993. +               glTexCoord2f(1.0,0.0);
  2994. +               glColor3f(0.5f ,0.5f, 0.0f);
  2995. +               glVertex3f(0.8f,-0.8f, 3.0f);
  2996. +       glEnd();
  2997. +*/
  2998. +
  2999. +       glEnable(GL_DEPTH_TEST);
  3000. +
  3001. +       PostRenderFrame();
  3002. +
  3003. +       printf("\nRendering Dome\n");
  3004. +}
  3005. +
  3006. +void KX_KetsjiEngine::Render()
  3007. +{
  3008. +       KX_Scene* firstscene = *m_scenes.begin();
  3009. +       const RAS_FrameSettings &framesettings = firstscene->GetFramingType();
  3010. +
  3011. +       m_logger->StartLog(tc_rasterizer, m_kxsystem->GetTimeInSeconds(), true);
  3012. +
  3013. +       // hiding mouse cursor each frame
  3014. +       // (came back when going out of focus and then back in again)
  3015. +       if (m_hideCursor)
  3016. +               m_canvas->SetMouseState(RAS_ICanvas::MOUSE_INVISIBLE);
  3017. +
  3018. +       // clear the entire game screen with the border color
  3019. +       // only once per frame
  3020. +       m_canvas->BeginDraw();
  3021. +       if (m_drawingmode == RAS_IRasterizer::KX_TEXTURED) {
  3022. +               m_canvas->SetViewPort(0, 0, m_canvas->GetWidth(), m_canvas->GetHeight());
  3023. +               if (m_overrideFrameColor)
  3024. +               {
  3025. +                       // Do not use the framing bar color set in the Blender scenes
  3026. +                       m_canvas->ClearColor(
  3027. +                               m_overrideFrameColorR,
  3028. +                               m_overrideFrameColorG,
  3029. +                               m_overrideFrameColorB,
  3030. +                               1.0
  3031. +                               );
  3032. +               }
  3033. +               else
  3034. +               {
  3035. +                       // Use the framing bar color set in the Blender scenes
  3036. +                       m_canvas->ClearColor(
  3037. +                               framesettings.BarRed(),
  3038. +                               framesettings.BarGreen(),
  3039. +                               framesettings.BarBlue(),
  3040. +                               1.0
  3041. +                               );
  3042. +               }
  3043. +               // clear the -whole- viewport
  3044. +               m_canvas->ClearBuffer(RAS_ICanvas::COLOR_BUFFER|RAS_ICanvas::DEPTH_BUFFER);
  3045. +       }
  3046. +
  3047. +       m_rasterizer->SetEye(RAS_IRasterizer::RAS_STEREO_LEFTEYE);
  3048. +
  3049. +       // BeginFrame() sets the actual drawing area. You can use a part of the window
  3050. +       if (!BeginFrame())
  3051. +               return;
  3052. +
  3053. +       KX_SceneList::iterator sceneit;
  3054. +       for (sceneit = m_scenes.begin();sceneit != m_scenes.end(); sceneit++)
  3055. +       // for each scene, call the proceed functions
  3056. +       {
  3057. +               KX_Scene* scene = *sceneit;
  3058. +               KX_Camera* cam = scene->GetActiveCamera();
  3059. +               // pass the scene's worldsettings to the rasterizer
  3060. +               SetWorldSettings(scene->GetWorldInfo());
  3061. +
  3062. +               // shadow buffers
  3063. +               RenderShadowBuffers(scene);
  3064. +
  3065. +               // Avoid drawing the scene with the active camera twice when it's viewport is enabled
  3066. +               if(cam && !cam->GetViewport())
  3067. +               {
  3068. +                       if (scene->IsClearingZBuffer())
  3069. +                               m_rasterizer->ClearDepthBuffer();
  3070. +       
  3071. +                       m_rendertools->SetAuxilaryClientInfo(scene);
  3072. +       
  3073. +                       // do the rendering
  3074. +                       // dome checking
  3075. +                       if(m_rasterizer->GetStereoMode()==RAS_IRasterizer::RAS_STEREO_DOME)
  3076. +                               RenderDomeFrame(scene,cam);
  3077. +                       else
  3078. +                               RenderFrame(scene, cam);
  3079. +               }
  3080. +              
  3081. +               list<class KX_Camera*>* cameras = scene->GetCameras();
  3082. +              
  3083. +               // Draw the scene once for each camera with an enabled viewport
  3084. +               list<KX_Camera*>::iterator it = cameras->begin();
  3085. +               while(it != cameras->end())
  3086. +               {
  3087. +                       if((*it)->GetViewport())
  3088. +                       {
  3089. +                               if (scene->IsClearingZBuffer())
  3090. +                                       m_rasterizer->ClearDepthBuffer();
  3091. +              
  3092. +                               m_rendertools->SetAuxilaryClientInfo(scene);
  3093. +              
  3094. +                               // do the rendering
  3095. +                               if(m_rasterizer->GetStereoMode()==RAS_IRasterizer::RAS_STEREO_DOME)
  3096. +                                       RenderDomeFrame(scene, (*it));
  3097. +                               else
  3098. +                                       RenderFrame(scene, (*it));
  3099. +                       }
  3100. +                      
  3101. +                       it++;
  3102. +               }
  3103. +       }
  3104. +
  3105. +       // only one place that checks for stereo
  3106. +       if(m_rasterizer->Stereo())
  3107. +       {
  3108. +               m_rasterizer->SetEye(RAS_IRasterizer::RAS_STEREO_RIGHTEYE);
  3109. +
  3110. +               if (!BeginFrame())
  3111. +                       return;
  3112. +
  3113. +               KX_SceneList::iterator sceneit;
  3114. +               for (sceneit = m_scenes.begin();sceneit != m_scenes.end(); sceneit++)
  3115. +               // for each scene, call the proceed functions
  3116. +               {
  3117. +                       KX_Scene* scene = *sceneit;
  3118. +                       KX_Camera* cam = scene->GetActiveCamera();
  3119. +
  3120. +                       // pass the scene's worldsettings to the rasterizer
  3121. +                       SetWorldSettings(scene->GetWorldInfo());
  3122. +              
  3123. +                       if (scene->IsClearingZBuffer())
  3124. +                               m_rasterizer->ClearDepthBuffer();
  3125. +
  3126. +                       //pass the scene, for picking and raycasting (shadows)
  3127. +                       m_rendertools->SetAuxilaryClientInfo(scene);
  3128. +
  3129. +                       // do the rendering
  3130. +                       //RenderFrame(scene);
  3131. +                       RenderFrame(scene, cam);
  3132. +               }
  3133. +       } // if(m_rasterizer->Stereo())
  3134. +
  3135. +       EndFrame();
  3136. +}
  3137. +
  3138. +
  3139. +
  3140.  void KX_KetsjiEngine::RequestExit(int exitrequestmode)
  3141.  {
  3142.         m_exitcode = exitrequestmode;
  3143. Index: source/gameengine/Ketsji/KX_KetsjiEngine.h
  3144. ===================================================================
  3145. --- source/gameengine/Ketsji/KX_KetsjiEngine.h  (revision 18000)
  3146. +++ source/gameengine/Ketsji/KX_KetsjiEngine.h  (working copy)
  3147. @@ -37,6 +37,7 @@
  3148.  #include "KX_Scene.h"
  3149.  #include "KX_Python.h"
  3150.  #include "KX_WorldInfo.h"
  3151. +#include "RAS_IRasterizer.h"
  3152.  #include <vector>
  3153.  #include <set>
  3154.  
  3155. @@ -74,6 +75,7 @@
  3156.         PyObject*                                       m_pythondictionary;
  3157.         class SCA_IInputDevice*                         m_keyboarddevice;
  3158.         class SCA_IInputDevice*                         m_mousedevice;
  3159. +       class KX_Dome*                                          m_dome; // dome stereo mode
  3160.  
  3161.         /** Lists of scenes scheduled to be removed at the end of the frame. */
  3162.         std::set<STR_String> m_removingScenes;
  3163. @@ -208,6 +210,31 @@
  3164.         RAS_ICanvas*                GetCanvas(){return m_canvas;};
  3165.         RAS_IRenderTools*           GetRenderTools(){return m_rendertools;};
  3166.  
  3167. +       /// Dome functions
  3168. +       void                    InitDome(); //recycled :)
  3169. +       void                    tmpInitDome();
  3170. +       void                    EndDome();
  3171. +
  3172. +       void                    RenderDomeFrame(KX_Scene* scene, KX_Camera* cam);
  3173. +
  3174. +       void                    DomePreRender(KX_Scene* m_scene, KX_Camera* m_cam);
  3175. +       void                    DomeRenderRoutine(KX_Scene* m_scene, KX_Camera* m_cam);
  3176. +       void                    DomePostRender(KX_Scene* m_scene, KX_Camera* m_cam, RAS_IRasterizer::StereoMode stereomode);
  3177. +
  3178. +       void                    DomeRotateView(KX_Camera* cam, int i, MT_Matrix4x4 cam_mat);
  3179. +
  3180. +       
  3181. +       //to be deleted::
  3182. +       void                    oldDomeRender(KX_Scene* scene, KX_Camera* cam);
  3183. +       void                    DomeOriginalRender();
  3184. +       void                    DomeImageRender(KX_Scene* m_scene, KX_Camera* m_cam);
  3185. +       void                    RenderDomeCamera(KX_Scene* scene, KX_Camera* cam, MT_Matrix4x4 viewmat, MT_Transform camtrans, MT_Vector3 camrot);
  3186. +       void                    DomeRotateCamera(KX_Camera* cam, int i);
  3187. +//     void                    DrawDomeVert(float theta, float phi);
  3188. +//     void                    DrawDomeSphere(float del);
  3189. +//     static const enum DomeFaceTarget;
  3190. +
  3191. +
  3192.         ///returns true if an update happened to indicate -> Render
  3193.         bool                    NextFrame();
  3194.         void                    Render();
  3195. Index: source/gameengine/Rasterizer/RAS_IRasterizer.h
  3196. ===================================================================
  3197. --- source/gameengine/Rasterizer/RAS_IRasterizer.h      (revision 18000)
  3198. +++ source/gameengine/Rasterizer/RAS_IRasterizer.h      (working copy)
  3199. @@ -113,6 +113,7 @@
  3200.                         RAS_STEREO_ANAGLYPH,
  3201.                         RAS_STEREO_SIDEBYSIDE,
  3202.                         RAS_STEREO_VINTERLACE,
  3203. +                       RAS_STEREO_DOME,
  3204.                        
  3205.                         RAS_STEREO_MAXSTEREO
  3206.         };
  3207. Index: source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
  3208. ===================================================================
  3209. --- source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp  (revision 18000)
  3210. +++ source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp  (working copy)
  3211. @@ -419,7 +419,7 @@
  3212.  
  3213.  bool RAS_OpenGLRasterizer::Stereo()
  3214.  {
  3215. -       if(m_stereomode == RAS_STEREO_NOSTEREO)
  3216. +       if(m_stereomode == RAS_STEREO_NOSTEREO || m_stereomode == RAS_STEREO_DOME)
  3217.                 return false;
  3218.         else
  3219.                 return true;
  3220.  
go to heaven