#include "SkyBoxSceneNode.h"
SkyBoxSceneNode::SkyBoxSceneNode(ID3D10ShaderResourceView* pTop, ID3D10ShaderResourceView* pBottom,
ID3D10ShaderResourceView* pLeft, ID3D10ShaderResourceView* pRight,
ID3D10ShaderResourceView* pFront, ID3D10ShaderResourceView* pBack) :
m_pFrontVB(nullptr),
m_pLeftVB(nullptr),
m_pBackVB(nullptr),
m_pRightVB(nullptr),
m_pTopVB(nullptr),
m_pBottomVB(nullptr),
m_pFrontTex(pFront),
m_pLeftTex(pLeft),
m_pBackTex(pBack),
m_pRightTex(pRight),
m_pTopTex(pTop),
m_pBottomTex(pBottom)
{
SetVertexType(VertexLayoutType::PTN_VERTEX);
SetDrawMethod(DrawMethod::DRAW_INDEXED);
SetTopology(D3D_PRIMITIVE_TOPOLOGY::D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
SetShaderTechnique( SHADER_MANAGER->GetShader("SkyBox") );
}
SkyBoxSceneNode::~SkyBoxSceneNode()
{
}
PTNVertex SkyBoxSceneNode::SetVertex(D3DXVECTOR3 p, D3DXVECTOR2 t, D3DXVECTOR3 n)
{
PTNVertex vertex;
vertex.position = p;
vertex.texture = t;
vertex.normal = n;
return vertex;
}
bool SkyBoxSceneNode::Initialize()
{
std::vector<unsigned short> indices;
indices.push_back(3);
indices.push_back(1);
indices.push_back(0);
indices.push_back(2);
indices.push_back(1);
indices.push_back(3);
BuildIB(indices);
// On redecoupe les bords des textures pour éviter
// d'afficher les arrêtes du cube
float fTextureWidth = GetShaderTextureViewSize(m_pBottomTex).x;
float onepixel = 1.0f / (fTextureWidth * 1.5f);
float t = 1.0f - onepixel;
float o = 0.0f + onepixel;
std::vector<PTNVertex> vertices;
// Front side
vertices.push_back( SetVertex(D3DXVECTOR3(-1,-1,-1), D3DXVECTOR2(t, t), D3DXVECTOR3(0, 0, 1.0f)));
vertices.push_back( SetVertex(D3DXVECTOR3(1,-1,-1), D3DXVECTOR2(o, t), D3DXVECTOR3(0, 0, 1.0f)));
vertices.push_back( SetVertex(D3DXVECTOR3(1, 1,-1), D3DXVECTOR2(o, o), D3DXVECTOR3(0, 0, 1.0f)));
vertices.push_back( SetVertex(D3DXVECTOR3(-1, 1,-1), D3DXVECTOR2(t, o), D3DXVECTOR3(0, 0, 1.0f)));
BuildVB(vertices);
m_pFrontVB = GetVertexBuffer();
// Left side
vertices.clear();
vertices.push_back( SetVertex(D3DXVECTOR3(1,-1,-1), D3DXVECTOR2(t, t), D3DXVECTOR3(-1, 0, 0)));
vertices.push_back( SetVertex(D3DXVECTOR3(1,-1, 1), D3DXVECTOR2(o, t), D3DXVECTOR3(-1, 0, 0)));
vertices.push_back( SetVertex(D3DXVECTOR3(1, 1, 1), D3DXVECTOR2(o, o), D3DXVECTOR3(-1, 0, 0)));
vertices.push_back( SetVertex(D3DXVECTOR3(1, 1,-1), D3DXVECTOR2(t, o), D3DXVECTOR3(-1, 0, 0)));
BuildVB(vertices);
m_pLeftVB = GetVertexBuffer();
// Back side
vertices.clear();
vertices.push_back( SetVertex(D3DXVECTOR3( 1,-1, 1), D3DXVECTOR2(t, t), D3DXVECTOR3(0, 0, -1.0f)));
vertices.push_back( SetVertex(D3DXVECTOR3(-1,-1, 1), D3DXVECTOR2(o, t), D3DXVECTOR3(0, 0, -1.0f)));
vertices.push_back( SetVertex(D3DXVECTOR3(-1, 1, 1), D3DXVECTOR2(o, o), D3DXVECTOR3(0, 0, -1.0f)));
vertices.push_back( SetVertex(D3DXVECTOR3( 1, 1, 1), D3DXVECTOR2(t, o), D3DXVECTOR3(0, 0, -1.0f)));
BuildVB(vertices);
m_pBackVB = GetVertexBuffer();
// Right side
vertices.clear();
vertices.push_back( SetVertex(D3DXVECTOR3(-1,-1, 1), D3DXVECTOR2(t, t), D3DXVECTOR3(1, 0, 0)));
vertices.push_back( SetVertex(D3DXVECTOR3(-1,-1,-1), D3DXVECTOR2(o, t), D3DXVECTOR3(1, 0, 0)));
vertices.push_back( SetVertex(D3DXVECTOR3(-1, 1,-1), D3DXVECTOR2(o, o), D3DXVECTOR3(1, 0, 0)));
vertices.push_back( SetVertex(D3DXVECTOR3(-1, 1, 1), D3DXVECTOR2(t, o), D3DXVECTOR3(1, 0, 0)));
BuildVB(vertices);
m_pRightVB = GetVertexBuffer();
// Top side
vertices.clear();
vertices.push_back( SetVertex(D3DXVECTOR3( 1, 1,-1), D3DXVECTOR2(t, t), D3DXVECTOR3(0, -1, 0)));
vertices.push_back( SetVertex(D3DXVECTOR3( 1, 1, 1), D3DXVECTOR2(o, t), D3DXVECTOR3(0, -1, 0)));
vertices.push_back( SetVertex(D3DXVECTOR3(-1, 1, 1), D3DXVECTOR2(o, o), D3DXVECTOR3(0, -1, 0)));
vertices.push_back( SetVertex(D3DXVECTOR3(-1, 1,-1), D3DXVECTOR2(t, o), D3DXVECTOR3(0, -1, 0)));
BuildVB(vertices);
m_pTopVB = GetVertexBuffer();
// Bottom side
vertices.clear();
vertices.push_back( SetVertex(D3DXVECTOR3( 1,-1, 1), D3DXVECTOR2(t, t), D3DXVECTOR3(0, 1, 0)));
vertices.push_back( SetVertex(D3DXVECTOR3( 1,-1,-1), D3DXVECTOR2(o, t), D3DXVECTOR3(0, 1, 0)));
vertices.push_back( SetVertex(D3DXVECTOR3(-1,-1,-1), D3DXVECTOR2(o, o), D3DXVECTOR3(0, 1, 0)));
vertices.push_back( SetVertex(D3DXVECTOR3(-1,-1, 1), D3DXVECTOR2(t, o), D3DXVECTOR3(0, 1, 0)));
BuildVB(vertices);
m_pBottomVB = GetVertexBuffer();
return true;
}
void SkyBoxSceneNode::Render(float fTimeSinceLastFrame)
{
D3D10_RENDERER->EnableZBuffer(false);
SetVertexBuffer(m_pFrontVB);
GetShaderTechnique()->SetTextureRV("txFace", m_pFrontTex);
Renderable::Render(fTimeSinceLastFrame);
SetVertexBuffer(m_pLeftVB);
GetShaderTechnique()->SetTextureRV("txFace", m_pLeftTex);
Renderable::Render(fTimeSinceLastFrame);
SetVertexBuffer(m_pBackVB);
GetShaderTechnique()->SetTextureRV("txFace", m_pBackTex);
Renderable::Render(fTimeSinceLastFrame);
SetVertexBuffer(m_pRightVB);
GetShaderTechnique()->SetTextureRV("txFace", m_pRightTex);
Renderable::Render(fTimeSinceLastFrame);
SetVertexBuffer(m_pTopVB);
GetShaderTechnique()->SetTextureRV("txFace", m_pTopTex);
Renderable::Render(fTimeSinceLastFrame);
SetVertexBuffer(m_pBottomVB);
GetShaderTechnique()->SetTextureRV("txFace", m_pBottomTex);
Renderable::Render(fTimeSinceLastFrame);
D3D10_RENDERER->EnableZBuffer(true);
}
void SkyBoxSceneNode::OnPreRender(float fTimeSinceLastFrame)
{
Camera* pCamera = SCENE_MANAGER->GetActiveCamera();
D3DXMATRIX finalMatrix;
D3DXMATRIX translate;
D3DXVECTOR3 cameraPos = pCamera->GetPosition();
// On centre toujours la skybox autour de la position de la caméra
D3DXMatrixTranslation(&translate, cameraPos.x, cameraPos.y, cameraPos.z);
float viewDistance = (pCamera->GerNearValue() + pCamera->GetFarValue()) * 0.5f;
// On agrandie la skybox pour qu'elle est une bonne taille
D3DXMATRIX scale;
D3DXMatrixScaling(&scale, viewDistance, viewDistance, viewDistance);
finalMatrix = scale * translate;
SCENE_MANAGER->PushAndSetMatrix(finalMatrix);
}
void SkyBoxSceneNode::OnPostRender(float fTimeSinceLastFrame)
{
SCENE_MANAGER->PopMatrix();
}