2012-06-08 15:28:29 +00:00
|
|
|
#include "explorerchunksky.h"
|
|
|
|
|
|
|
|
#include <math.h>
|
|
|
|
#include "baseexplorerchunk.h"
|
|
|
|
#include "../lib_paysages/camera.h"
|
|
|
|
|
2012-06-17 09:40:40 +00:00
|
|
|
ExplorerChunkSky::ExplorerChunkSky(Renderer* renderer, SkyDefinition* sky, double size, SkyboxOrientation orientation) : BaseExplorerChunk(renderer)
|
2012-06-08 15:28:29 +00:00
|
|
|
{
|
|
|
|
_sky = sky;
|
|
|
|
_box_size = size;
|
|
|
|
_orientation = orientation;
|
|
|
|
|
|
|
|
setMaxTextureSize(256);
|
|
|
|
maintain();
|
|
|
|
}
|
|
|
|
|
|
|
|
void ExplorerChunkSky::onRenderEvent(QGLWidget* widget)
|
|
|
|
{
|
2012-06-17 09:40:40 +00:00
|
|
|
double size = _box_size;
|
2012-06-08 15:28:29 +00:00
|
|
|
Vector3 camera = renderer()->camera_location;
|
|
|
|
|
|
|
|
glBegin(GL_QUADS);
|
|
|
|
switch(_orientation)
|
|
|
|
{
|
|
|
|
case SKYBOX_NORTH:
|
|
|
|
glTexCoord2d(0.0, 0.0);
|
|
|
|
glVertex3d(camera.x - size, camera.y + size, camera.z - size);
|
|
|
|
glTexCoord2d(0.0, 1.0);
|
|
|
|
glVertex3d(camera.x - size, camera.y - size, camera.z - size);
|
|
|
|
glTexCoord2d(1.0, 1.0);
|
|
|
|
glVertex3d(camera.x + size, camera.y - size, camera.z - size);
|
|
|
|
glTexCoord2d(1.0, 0.0);
|
|
|
|
glVertex3d(camera.x + size, camera.y + size, camera.z - size);
|
|
|
|
break;
|
|
|
|
case SKYBOX_SOUTH:
|
|
|
|
glTexCoord2d(0.0, 0.0);
|
|
|
|
glVertex3d(camera.x + size, camera.y + size, camera.z + size);
|
|
|
|
glTexCoord2d(0.0, 1.0);
|
|
|
|
glVertex3d(camera.x + size, camera.y - size, camera.z + size);
|
|
|
|
glTexCoord2d(1.0, 1.0);
|
|
|
|
glVertex3d(camera.x - size, camera.y - size, camera.z + size);
|
|
|
|
glTexCoord2d(1.0, 0.0);
|
|
|
|
glVertex3d(camera.x - size, camera.y + size, camera.z + size);
|
|
|
|
break;
|
|
|
|
case SKYBOX_EAST:
|
|
|
|
glTexCoord2d(0.0, 0.0);
|
|
|
|
glVertex3d(camera.x + size, camera.y + size, camera.z - size);
|
|
|
|
glTexCoord2d(0.0, 1.0);
|
|
|
|
glVertex3d(camera.x + size, camera.y - size, camera.z - size);
|
|
|
|
glTexCoord2d(1.0, 1.0);
|
|
|
|
glVertex3d(camera.x + size, camera.y - size, camera.z + size);
|
|
|
|
glTexCoord2d(1.0, 0.0);
|
|
|
|
glVertex3d(camera.x + size, camera.y + size, camera.z + size);
|
|
|
|
break;
|
|
|
|
case SKYBOX_WEST:
|
|
|
|
glTexCoord2d(0.0, 0.0);
|
|
|
|
glVertex3d(camera.x - size, camera.y + size, camera.z + size);
|
|
|
|
glTexCoord2d(0.0, 1.0);
|
|
|
|
glVertex3d(camera.x - size, camera.y - size, camera.z + size);
|
|
|
|
glTexCoord2d(1.0, 1.0);
|
|
|
|
glVertex3d(camera.x - size, camera.y - size, camera.z - size);
|
|
|
|
glTexCoord2d(1.0, 0.0);
|
|
|
|
glVertex3d(camera.x - size, camera.y + size, camera.z - size);
|
|
|
|
break;
|
|
|
|
case SKYBOX_TOP:
|
|
|
|
glTexCoord2d(0.0, 0.0);
|
|
|
|
glVertex3d(camera.x - size, camera.y + size, camera.z + size);
|
|
|
|
glTexCoord2d(0.0, 1.0);
|
|
|
|
glVertex3d(camera.x - size, camera.y + size, camera.z - size);
|
|
|
|
glTexCoord2d(1.0, 1.0);
|
|
|
|
glVertex3d(camera.x + size, camera.y + size, camera.z - size);
|
|
|
|
glTexCoord2d(1.0, 0.0);
|
|
|
|
glVertex3d(camera.x + size, camera.y + size, camera.z + size);
|
|
|
|
break;
|
|
|
|
case SKYBOX_BOTTOM:
|
|
|
|
glTexCoord2d(0.0, 0.0);
|
|
|
|
glVertex3d(camera.x - size, camera.y - size, camera.z - size);
|
|
|
|
glTexCoord2d(0.0, 1.0);
|
|
|
|
glVertex3d(camera.x - size, camera.y - size, camera.z + size);
|
|
|
|
glTexCoord2d(1.0, 1.0);
|
|
|
|
glVertex3d(camera.x + size, camera.y - size, camera.z + size);
|
|
|
|
glTexCoord2d(1.0, 0.0);
|
|
|
|
glVertex3d(camera.x + size, camera.y - size, camera.z - size);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
glEnd();
|
|
|
|
}
|
|
|
|
|
2012-06-17 09:40:40 +00:00
|
|
|
double ExplorerChunkSky::getDisplayedSizeHint(CameraDefinition* camera)
|
2012-06-08 15:28:29 +00:00
|
|
|
{
|
|
|
|
return 1000.0;
|
|
|
|
}
|
|
|
|
|
2012-06-17 09:40:40 +00:00
|
|
|
Color ExplorerChunkSky::getTextureColor(double x, double y)
|
2012-06-08 15:28:29 +00:00
|
|
|
{
|
|
|
|
Vector3 location;
|
|
|
|
|
|
|
|
x -= 0.5;
|
|
|
|
y -= 0.5;
|
|
|
|
|
|
|
|
switch(_orientation)
|
|
|
|
{
|
|
|
|
case SKYBOX_NORTH:
|
|
|
|
location.x = x;
|
|
|
|
location.y = -y;
|
|
|
|
location.z = -0.5;
|
|
|
|
break;
|
|
|
|
case SKYBOX_SOUTH:
|
|
|
|
location.x = -x;
|
|
|
|
location.y = -y;
|
|
|
|
location.z = 0.5;
|
|
|
|
break;
|
|
|
|
case SKYBOX_EAST:
|
|
|
|
location.x = 0.5;
|
|
|
|
location.y = -y;
|
|
|
|
location.z = x;
|
|
|
|
break;
|
|
|
|
case SKYBOX_WEST:
|
|
|
|
location.x = -0.5;
|
|
|
|
location.y = -y;
|
|
|
|
location.z = -x;
|
|
|
|
break;
|
|
|
|
case SKYBOX_TOP:
|
|
|
|
location.x = x;
|
|
|
|
location.y = 0.5;
|
|
|
|
location.z = -y;
|
|
|
|
break;
|
|
|
|
case SKYBOX_BOTTOM:
|
|
|
|
location.x = x;
|
|
|
|
location.y = -0.5;
|
|
|
|
location.z = y;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return skyGetColor(_sky, renderer(), VECTOR_ZERO, v3Normalize(location));
|
|
|
|
}
|