BGE Dome: removing of size option and adding tilt option.
- Size adjustments can be accomplished with warp mesh data now. So we get a free spot in the GUI for a tilt option. - Tilt option to tilt the camera (for planetarium domes). Angle is in degree from -180 to +180. It's needed for planetarium domes (as this one http://domejunky.blogspot.com/2009/05/dome-corrected-bge.html ). - This is the last commit regarding dome code I expected to 2.49. I consider this feature full implemented now. (working on docs now)
This commit is contained in:
@@ -232,9 +232,9 @@ Scene *add_scene(char *name)
|
||||
sce->r.stereomode = 1; // no stereo
|
||||
sce->r.domeangle = 180;
|
||||
sce->r.domemode = 1;
|
||||
sce->r.domesize = 1.0f;
|
||||
sce->r.domeres = 4;
|
||||
sce->r.domeresbuf = 1.0f;
|
||||
sce->r.dometilt = 0;
|
||||
|
||||
sce->r.simplify_subsurf= 6;
|
||||
sce->r.simplify_particles= 1.0f;
|
||||
|
@@ -8082,9 +8082,9 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
|
||||
for (sce= main->scene.first; sce; sce= sce->id.next) {
|
||||
sce->r.domeangle = 180;
|
||||
sce->r.domemode = 1;
|
||||
sce->r.domesize = 1.0f;
|
||||
sce->r.domeres = 4;
|
||||
sce->r.domeresbuf = 1.0f;
|
||||
sce->r.dometilt = 0;
|
||||
}
|
||||
/* DBVT culling by default */
|
||||
for(wrld=main->world.first; wrld; wrld= wrld->id.next) {
|
||||
|
@@ -318,9 +318,9 @@ typedef struct RenderData {
|
||||
|
||||
/* Dome variables */
|
||||
short domeres, domemode;
|
||||
short domeangle, pad9;
|
||||
float domesize;
|
||||
short domeangle, dometilt;
|
||||
float domeresbuf;
|
||||
float pad2;
|
||||
struct Text *dometext;
|
||||
|
||||
} RenderData;
|
||||
|
@@ -1832,11 +1832,11 @@ static uiBlock *framing_render_menu(void *arg_unused)
|
||||
xco = 8;
|
||||
uiBlockBeginAlign(block);
|
||||
uiDefButS(block, ROW, 0, "Dome", xco, yco-=30, 88, 19, &(G.scene->r.stereomode), 7.0, 8.0, 0, 0, "Enables dome camera");
|
||||
uiDefButS(block, NUM, 0, "Ang:", xco+90, yco, 88, 19, &G.scene->r.domeangle, 90.0, 250.0, 0, 0, "Angle (Aperture) of the Dome - it only works in mode 1");
|
||||
uiDefButS(block, NUM, 0, "Mode:", xco+180, yco, 88, 19, &G.scene->r.domemode, 1.0, 3.0, 0, 0, "1 fisheye, 2 environment map, 3 spherical panoramic");
|
||||
uiDefButS(block, NUM, 0, "Ang:", xco+90, yco, 88, 19, &G.scene->r.domeangle, 90.0, 250.0, 0, 0, "Angle (Aperture) of the Dome - it only works in mode 1 to 3");
|
||||
uiDefButS(block, NUM, 0, "Mode:", xco+180, yco, 88, 19, &G.scene->r.domemode, 1.0, 5.0, 0, 0, "1 fulldome, 2 front-truncated, 3 rear-truncated, 4 environment map, 5 spherical panoramic");
|
||||
|
||||
uiDefButF(block, NUM, 0, "Size:", xco, yco-=21, 88, 19, &G.scene->r.domesize, 0.5, 3.5, 0, 0, "Size adjustments");
|
||||
uiDefButS(block, NUM, 0, "Tes:", xco+90, yco, 88, 19, &G.scene->r.domeres, 1.0, 8.0, 0, 0, "Tesselation level - 1 to 8");
|
||||
uiDefButS(block, NUM, 0, "Tilt:", xco, yco-=21, 88, 19, &G.scene->r.dometilt, -180.0, 180.0, 0, 0, "Dome tilt - camera rotation in horizontal axis");
|
||||
uiDefButS(block, NUM, 0, "Tes:", xco+90, yco, 88, 19, &G.scene->r.domeres, 0.0, 8.0, 0, 0, "Tesselation level - check the generated mesh in wireframe mode");
|
||||
uiDefButF(block, NUM, 0, "Res:", xco+180, yco, 88, 19, &G.scene->r.domeresbuf, 0.1, 1.0, 0, 0, "Buffer Resolution - decrease it to increase speed");
|
||||
|
||||
uiDefIDPoinBut(block, test_scriptpoin_but, ID_SCRIPT, 1, "Warp Data: ", xco,yco-=21,268, 19, &G.scene->r.dometext, "Custom Warp Mesh data file");
|
||||
|
@@ -376,7 +376,7 @@ extern "C" void StartKetsjiShell(struct ScrArea *area,
|
||||
|
||||
//initialize Dome Settings
|
||||
if(blscene->r.stereomode == RAS_IRasterizer::RAS_STEREO_DOME)
|
||||
ketsjiengine->InitDome(blscene->r.domesize, blscene->r.domeres, blscene->r.domemode, blscene->r.domeangle, blscene->r.domeresbuf, blscene->r.dometext);
|
||||
ketsjiengine->InitDome(blscene->r.domeres, blscene->r.domemode, blscene->r.domeangle, blscene->r.domeresbuf, blscene->r.dometilt, blscene->r.dometext);
|
||||
|
||||
if (sceneconverter)
|
||||
{
|
||||
|
@@ -701,7 +701,7 @@ bool GPG_Application::startEngine(void)
|
||||
|
||||
//initialize Dome Settings
|
||||
if(m_startScene->r.stereomode == RAS_IRasterizer::RAS_STEREO_DOME)
|
||||
m_ketsjiengine->InitDome(m_startScene->r.domesize, m_startScene->r.domeres, m_startScene->r.domemode, m_startScene->r.domeangle, m_startScene->r.domeresbuf, m_startScene->r.dometext);
|
||||
m_ketsjiengine->InitDome(m_startScene->r.domeres, m_startScene->r.domemode, m_startScene->r.domeangle, m_startScene->r.domeresbuf, m_startScene->r.dometilt, m_startScene->r.dometext);
|
||||
|
||||
// Set the GameLogic.globalDict from marshal'd data, so we can
|
||||
// load new blend files and keep data in GameLogic.globalDict
|
||||
|
@@ -43,23 +43,23 @@ KX_Dome::KX_Dome (
|
||||
RAS_IRenderTools* rendertools,
|
||||
/// engine
|
||||
KX_KetsjiEngine* engine,
|
||||
|
||||
float size, //size for adjustments
|
||||
|
||||
short res, //resolution of the mesh
|
||||
short mode, //mode - fisheye, truncated, warped, panoramic, ...
|
||||
short angle,
|
||||
float resbuf, //size adjustment of the buffer
|
||||
short tilt,
|
||||
struct Text* warptext
|
||||
|
||||
):
|
||||
dlistSupported(false),
|
||||
canvaswidth(-1), canvasheight(-1),
|
||||
m_drawingmode(engine->GetDrawType()),
|
||||
m_size(size),
|
||||
m_resolution(res),
|
||||
m_mode(mode),
|
||||
m_angle(angle),
|
||||
m_resbuffer(resbuf),
|
||||
m_tilt(tilt),
|
||||
m_canvas(canvas),
|
||||
m_rasterizer(rasterizer),
|
||||
m_rendertools(rendertools),
|
||||
@@ -124,7 +124,7 @@ KX_Dome::KX_Dome (
|
||||
CreateMeshPanorama();
|
||||
m_numfaces = 6;
|
||||
break;
|
||||
default: //DOME_TRUNCATED_DOWN and DOME_TRUNCATED_UP
|
||||
default: //DOME_TRUNCATED_FRONT and DOME_TRUNCATED_REAR
|
||||
if (m_angle <= 180){
|
||||
cubetop.resize(1);
|
||||
cubebottom.resize(1);
|
||||
@@ -269,7 +269,7 @@ http://projects.blender.org/tracker/?func=detail&aid=18655&group_id=9&atid=125
|
||||
bool KX_Dome::CreateDL(){
|
||||
dlistId = glGenLists((GLsizei) m_numimages);
|
||||
if (dlistId != 0) {
|
||||
if(m_mode == DOME_FISHEYE || m_mode == DOME_TRUNCATED_UP || m_mode == DOME_TRUNCATED_DOWN){
|
||||
if(m_mode == DOME_FISHEYE || m_mode == DOME_TRUNCATED_FRONT || m_mode == DOME_TRUNCATED_REAR){
|
||||
glNewList(dlistId, GL_COMPILE);
|
||||
GLDrawTriangles(cubetop, nfacestop);
|
||||
glEndList();
|
||||
@@ -1485,13 +1485,14 @@ Uses 4 cameras for angles up to 180
|
||||
Uses 5 cameras for angles up to 250<35>
|
||||
Uses 6 cameras for angles up to 360<36>
|
||||
*/
|
||||
int i;
|
||||
float deg45 = MT_PI / 4;
|
||||
MT_Scalar c = cos(deg45);
|
||||
MT_Scalar s = sin(deg45);
|
||||
|
||||
if (m_angle <= 180 && (m_mode == DOME_FISHEYE
|
||||
|| m_mode == DOME_TRUNCATED_UP
|
||||
|| m_mode == DOME_TRUNCATED_DOWN)){
|
||||
|| m_mode == DOME_TRUNCATED_FRONT
|
||||
|| m_mode == DOME_TRUNCATED_REAR)){
|
||||
|
||||
m_locRot[0] = MT_Matrix3x3( // 90<39> - Top
|
||||
c, -s, 0.0,
|
||||
@@ -1514,8 +1515,8 @@ Uses 6 cameras for angles up to 360
|
||||
s, 0.0, c);
|
||||
|
||||
} else if (m_mode == DOME_ENVMAP || (m_angle > 180 && (m_mode == DOME_FISHEYE
|
||||
|| m_mode == DOME_TRUNCATED_UP
|
||||
|| m_mode == DOME_TRUNCATED_DOWN))){
|
||||
|| m_mode == DOME_TRUNCATED_FRONT
|
||||
|| m_mode == DOME_TRUNCATED_REAR))){
|
||||
|
||||
m_locRot[0] = MT_Matrix3x3( // 90<39> - Top
|
||||
1.0, 0.0, 0.0,
|
||||
@@ -1579,6 +1580,23 @@ Uses 6 cameras for angles up to 360
|
||||
0.0, 1.0, 0.0,
|
||||
s, 0.0, c);
|
||||
}
|
||||
|
||||
// rotating the camera in horizontal axis
|
||||
if (m_tilt)
|
||||
{
|
||||
float tiltdeg = ((m_tilt % 360) * 2 * MT_PI) / 360;
|
||||
c = cos(tiltdeg);
|
||||
s = sin(tiltdeg);
|
||||
|
||||
MT_Matrix3x3 tilt_mat = MT_Matrix3x3(
|
||||
1.0, 0.0, 0.0,
|
||||
0.0, c, -s,
|
||||
0.0, s, c
|
||||
);
|
||||
|
||||
for (i =0;i<6;i++)
|
||||
m_locRot[i] = tilt_mat * m_locRot[i];
|
||||
}
|
||||
}
|
||||
|
||||
void KX_Dome::RotateCamera(KX_Camera* cam, int i)
|
||||
@@ -1621,10 +1639,10 @@ void KX_Dome::Draw(void)
|
||||
case DOME_PANORAM_SPH:
|
||||
DrawPanorama();
|
||||
break;
|
||||
case DOME_TRUNCATED_UP:
|
||||
case DOME_TRUNCATED_FRONT:
|
||||
DrawDomeFisheye();
|
||||
break;
|
||||
case DOME_TRUNCATED_DOWN:
|
||||
case DOME_TRUNCATED_REAR:
|
||||
DrawDomeFisheye();
|
||||
break;
|
||||
}
|
||||
@@ -1670,9 +1688,6 @@ void KX_Dome::DrawEnvMap(void)
|
||||
ortho_width = (float)can_width/can_height * ortho_height;
|
||||
}
|
||||
|
||||
ortho_width /= m_size;
|
||||
ortho_height /= m_size;
|
||||
|
||||
glOrtho((-ortho_width), ortho_width, (-ortho_height), ortho_height, -20.0, 10.0);
|
||||
}
|
||||
|
||||
@@ -1803,20 +1818,17 @@ void KX_Dome::DrawDomeFisheye(void)
|
||||
ortho_height = 1.0;
|
||||
}
|
||||
|
||||
ortho_width /= m_size;
|
||||
ortho_height /= m_size;
|
||||
|
||||
glOrtho((-ortho_width), ortho_width, (-ortho_height), ortho_height, -20.0, 10.0);
|
||||
}
|
||||
}
|
||||
else if(m_mode == DOME_TRUNCATED_UP)
|
||||
else if(m_mode == DOME_TRUNCATED_FRONT)
|
||||
{
|
||||
ortho_width = 1.0;
|
||||
ortho_height = 2 * ((float)can_height/can_width) - 1.0 ;
|
||||
|
||||
glOrtho((-ortho_width), ortho_width, (-ortho_height), ortho_width, -20.0, 10.0);
|
||||
}
|
||||
else { //m_mode == DOME_TRUNCATED_DOWN
|
||||
else { //m_mode == DOME_TRUNCATED_REAR
|
||||
ortho_width = 1.0;
|
||||
ortho_height = 2 * ((float)can_height/can_width) - 1.0 ;
|
||||
|
||||
@@ -1901,9 +1913,6 @@ void KX_Dome::DrawPanorama(void)
|
||||
ortho_width = (float)can_width/can_height * 0.5;
|
||||
ortho_height = 0.5;
|
||||
}
|
||||
|
||||
ortho_width /= m_size;
|
||||
ortho_height /= m_size;
|
||||
|
||||
glOrtho((-ortho_width), ortho_width, (-ortho_height), ortho_height, -20.0, 10.0);
|
||||
}
|
||||
@@ -1972,7 +1981,6 @@ void KX_Dome::DrawDomeWarped(void)
|
||||
int can_height = m_viewport.GetTop();
|
||||
|
||||
double screen_ratio = can_width/ (double) can_height;
|
||||
screen_ratio /= m_size;
|
||||
|
||||
glOrtho(-screen_ratio,screen_ratio,-1.0,1.0,-20.0,10.0);
|
||||
|
||||
|
@@ -40,12 +40,12 @@ Developed as part of a Research and Development project for SAT - La Soci
|
||||
#include "BKE_text.h"
|
||||
|
||||
//Dome modes: limit hardcoded in buttons_scene.c
|
||||
#define DOME_FISHEYE 1
|
||||
#define DOME_ENVMAP 2
|
||||
#define DOME_PANORAM_SPH 3
|
||||
#define DOME_TRUNCATED_UP 4
|
||||
#define DOME_TRUNCATED_DOWN 5
|
||||
#define DOME_NUM_MODES 6
|
||||
#define DOME_FISHEYE 1
|
||||
#define DOME_TRUNCATED_FRONT 2
|
||||
#define DOME_TRUNCATED_REAR 3
|
||||
#define DOME_ENVMAP 4
|
||||
#define DOME_PANORAM_SPH 5
|
||||
#define DOME_NUM_MODES 6
|
||||
|
||||
|
||||
/// class for render 3d scene
|
||||
@@ -61,12 +61,12 @@ public:
|
||||
RAS_IRenderTools* m_rendertools,
|
||||
/// engine
|
||||
KX_KetsjiEngine* m_engine,
|
||||
|
||||
float size,
|
||||
|
||||
short res,
|
||||
short mode,
|
||||
short angle,
|
||||
float resbuf,
|
||||
short tilt,
|
||||
struct Text* warptext
|
||||
);
|
||||
|
||||
@@ -159,13 +159,13 @@ protected:
|
||||
int m_buffersize; // canvas small dimension
|
||||
int m_numfaces; // 4 to 6 depending on the kind of dome image
|
||||
int m_numimages; //numfaces +1 if we have warp mesh
|
||||
|
||||
float m_size; // size to adjust
|
||||
|
||||
short m_resolution; //resolution to tesselate the mesh
|
||||
short m_mode; // the mode (truncated, warped, panoramic,...)
|
||||
short m_angle; //the angle of the fisheye
|
||||
float m_radangle; //the angle of the fisheye in radians
|
||||
float m_resbuffer; //the resolution of the buffer
|
||||
short m_tilt; //the dome tilt (camera rotation on horizontal axis)
|
||||
|
||||
RAS_Rect m_viewport;
|
||||
|
||||
|
@@ -262,9 +262,9 @@ void KX_KetsjiEngine::SetSceneConverter(KX_ISceneConverter* sceneconverter)
|
||||
m_sceneconverter = sceneconverter;
|
||||
}
|
||||
|
||||
void KX_KetsjiEngine::InitDome(float size, short res, short mode, short angle, float resbuf, struct Text* text)
|
||||
void KX_KetsjiEngine::InitDome(short res, short mode, short angle, float resbuf, short tilt, struct Text* text)
|
||||
{
|
||||
m_dome = new KX_Dome(m_canvas, m_rasterizer, m_rendertools,this, size, res, mode, angle, resbuf, text);
|
||||
m_dome = new KX_Dome(m_canvas, m_rasterizer, m_rendertools,this, res, mode, angle, resbuf, tilt, text);
|
||||
m_usedome = true;
|
||||
}
|
||||
|
||||
@@ -272,7 +272,6 @@ void KX_KetsjiEngine::RenderDome()
|
||||
{
|
||||
GLuint viewport[4]={0};
|
||||
glGetIntegerv(GL_VIEWPORT,(GLint *)viewport);
|
||||
// unsigned int m_viewport[4] = {viewport[0], viewport[1], viewport[2], viewport[3]};
|
||||
|
||||
m_dome->SetViewPort(viewport);
|
||||
|
||||
@@ -297,13 +296,6 @@ void KX_KetsjiEngine::RenderDome()
|
||||
|
||||
KX_SceneList::iterator sceneit;
|
||||
|
||||
// This is now done incrementally in KX_Scene::CalculateVisibleMeshes()
|
||||
//for (sceneit = m_scenes.begin();sceneit != m_scenes.end(); sceneit++)
|
||||
//{
|
||||
// // do this only once per scene
|
||||
// (*sceneit)->UpdateMeshTransformations();
|
||||
//}
|
||||
|
||||
int n_renders=m_dome->GetNumberRenders();// usually 4 or 6
|
||||
for (int i=0;i<n_renders;i++){
|
||||
m_canvas->ClearBuffer(RAS_ICanvas::COLOR_BUFFER|RAS_ICanvas::DEPTH_BUFFER);
|
||||
|
@@ -211,7 +211,7 @@ public:
|
||||
RAS_IRenderTools* GetRenderTools(){return m_rendertools;};
|
||||
|
||||
/// Dome functions
|
||||
void InitDome(float size, short res, short mode, short angle, float resbuf, struct Text* text);
|
||||
void InitDome(short res, short mode, short angle, float resbuf, short tilt, struct Text* text);
|
||||
void EndDome();
|
||||
void RenderDome();
|
||||
bool m_usedome;
|
||||
|
Reference in New Issue
Block a user