Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
4316 lines
120 KiB
C++
4316 lines
120 KiB
C++
// RBspScene.cpp: implementation of the RBspScene class.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#include "RBspScene.h"
|
|
#include "SceneManager.h"
|
|
#include "Sphere.h"
|
|
#include "BaseGraphicsLayer.h"
|
|
#include "SceneStateMgr.h"
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Construction/Destruction
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
D3DXVECTOR3 g_vecCube[8] = {
|
|
D3DXVECTOR3(-5.0f,-5.0f,-5.0f), // 0
|
|
D3DXVECTOR3(-5.0f,5.0f,-5.0f), // 1
|
|
D3DXVECTOR3(5.0f,-5.0f,-5.0f), // 2
|
|
D3DXVECTOR3(5.0f,5.0f,-5.0f), // 3
|
|
|
|
D3DXVECTOR3(-5.0f,-5.0f,5.0f), // 4
|
|
D3DXVECTOR3(-5.0f,5.0f,5.0f), // 5
|
|
D3DXVECTOR3(5.0f,-5.0f,5.0f), // 6
|
|
D3DXVECTOR3(5.0f,5.0f,5.0f), // 7
|
|
|
|
};
|
|
WORD g_vecCubeIndex[36] = {
|
|
0,1,2,2,1,3, // 앞면
|
|
6,5,4,7,5,6, // 뒷면
|
|
1,5,3,3,5,7, // 윗면
|
|
2,4,0,6,4,2, // 아랫면
|
|
2,3,6,6,3,7, // 오른면
|
|
4,5,0,0,5,1, // 왼면
|
|
};
|
|
|
|
RBspScene::RBspScene()
|
|
{
|
|
memset(m_strBspName,0,sizeof(char) * RBSPBUF_SIZE);
|
|
m_vecStartPos = vector3(0.0f,0.0f,0.0f);
|
|
m_bVisible = false;
|
|
|
|
m_pDotVertex = NULL;
|
|
|
|
// Leaf Faces
|
|
m_iLeafFacesNum = 0;
|
|
m_pLeafFaces = NULL;
|
|
|
|
// Plane
|
|
m_iPlanesNum = 0;
|
|
m_pPlanes = NULL;
|
|
// Leaf Brush
|
|
m_iLeafBrushesNum = 0;
|
|
m_pLeafBrushes = NULL; // The index into the brush array
|
|
// Brush
|
|
m_iBrushesNum = 0;
|
|
m_pBrushes = NULL;
|
|
// Brush Side
|
|
m_iBrusheSidesNum = 0;
|
|
m_pBrusheSides = NULL;
|
|
|
|
|
|
// Leaf Node
|
|
m_iLeafsNum = 0;
|
|
m_pLeafs = NULL;
|
|
// Node
|
|
m_iNodesNum = 0;
|
|
m_pNodes = NULL;
|
|
// Lightmap
|
|
m_iLightMapsNum = 0;
|
|
m_pLightMaps = NULL;
|
|
m_pLightTextures = NULL;
|
|
// Texture Def
|
|
m_iTextureDefsNum = 0;
|
|
m_pTextureDefs = NULL;
|
|
m_pTextures = NULL;
|
|
m_pNTextures = NULL;
|
|
m_pFrustum = NULL;
|
|
|
|
// Faces
|
|
m_iFacesNum = 0;
|
|
m_pFaces = NULL;
|
|
// Vertexs
|
|
m_iVertsNum = 0;
|
|
m_pBeforeVerts = NULL; // 원래 bsp 에서 사용하는 vertex class
|
|
m_pVerts = NULL; // 최적화를 위한 vertex class
|
|
|
|
m_iVisLeafNodeNum = 0;
|
|
|
|
// Triangle List
|
|
|
|
// Base Texture Vertex Buffer
|
|
m_pBaseVertexBuffer = NULL;
|
|
// LightMap Vertex Buffer
|
|
m_pLightVertexBuffer = NULL;
|
|
m_pBaseVertexNum = NULL;
|
|
m_pBaseVertexUseNum = NULL;
|
|
|
|
// Base Index Buffer
|
|
m_pBaseIndexBuffer = NULL;
|
|
m_pBaseIndexNum = NULL;
|
|
m_pBaseIndexUseNum = NULL;
|
|
|
|
|
|
|
|
m_pIndexArr.clear();
|
|
m_pVertexArr.clear();
|
|
m_pLightUnit = NULL;
|
|
|
|
// Current Camera Position
|
|
m_vecCamera = D3DXVECTOR3(0.0f,0.0f,0.0f);
|
|
|
|
m_iShaderVersion = RBSPSHADER_GF2;
|
|
m_iRBspLeafIndex = -1;
|
|
|
|
m_pVisLeafs = NULL; // Visible Leaf
|
|
m_iVisLeafs = 0; // Visible Leaf 갯수
|
|
|
|
m_pBVisLeafs = NULL; // Visible Leaf
|
|
m_iBVisLeafs = 0; // Visible Leaf 갯수
|
|
|
|
|
|
m_pLeafExs = NULL;
|
|
m_D3Device = NULL;
|
|
|
|
|
|
m_bVisEffectBox = true;
|
|
m_bVisSoundBox = true;
|
|
m_bVisAObjectBox = true;
|
|
m_bVisLightBox = true;
|
|
|
|
m_vecScale = D3DXVECTOR3(4.0f,4.0f,4.0f);
|
|
|
|
|
|
}
|
|
|
|
RBspScene::~RBspScene()
|
|
{
|
|
int i;
|
|
|
|
if(m_pDotVertex != NULL)
|
|
{
|
|
delete[] m_pDotVertex;
|
|
m_pDotVertex = NULL;
|
|
}
|
|
// Leaf Faces
|
|
if(m_pLeafFaces != NULL)
|
|
{
|
|
delete[] m_pLeafFaces;
|
|
m_pLeafFaces = NULL;
|
|
}
|
|
// Plane
|
|
if(m_pPlanes != NULL)
|
|
{
|
|
delete[] m_pPlanes;
|
|
m_pPlanes = NULL;
|
|
}
|
|
// Leaf Brush
|
|
if(m_pLeafBrushes != NULL)
|
|
{
|
|
delete[] m_pLeafBrushes;
|
|
m_pLeafBrushes = NULL; // The index into the brush array
|
|
}
|
|
// Brush
|
|
if(m_pBrushes != NULL)
|
|
{
|
|
delete[] m_pBrushes;
|
|
m_pBrushes = NULL;
|
|
}
|
|
// Brush Side
|
|
if(m_pBrusheSides != NULL)
|
|
{
|
|
delete[] m_pBrusheSides;
|
|
m_pBrusheSides = NULL;
|
|
}
|
|
// Leaf Node
|
|
if(m_pLeafs != NULL)
|
|
{
|
|
delete[] m_pLeafs;
|
|
m_pLeafs = NULL;
|
|
}
|
|
if(m_pLeafExs != NULL)
|
|
{
|
|
delete[] m_pLeafExs;
|
|
m_pLeafExs = NULL;
|
|
|
|
}
|
|
// Node
|
|
if(m_pNodes != NULL)
|
|
{
|
|
delete[] m_pNodes;
|
|
m_pNodes = NULL;
|
|
}
|
|
|
|
// Lightmap
|
|
if(m_pLightMaps != NULL)
|
|
{
|
|
delete[] m_pLightMaps;
|
|
m_pLightMaps = NULL;
|
|
}
|
|
if(m_pLightTextures != NULL)
|
|
{
|
|
delete[] m_pLightTextures;
|
|
m_pLightTextures = NULL;
|
|
|
|
}
|
|
// Texture Def
|
|
if(m_pTextureDefs != NULL)
|
|
{
|
|
delete[] m_pTextureDefs;
|
|
m_pTextureDefs = NULL;
|
|
}
|
|
if(m_pTextures != NULL)
|
|
{
|
|
delete[] m_pTextures;
|
|
m_pTextures = NULL;
|
|
|
|
}
|
|
if(m_pNTextures != NULL)
|
|
{
|
|
delete[] m_pNTextures;
|
|
m_pNTextures = NULL;
|
|
}
|
|
// Faces
|
|
if(m_pFaces != NULL)
|
|
{
|
|
delete[] m_pFaces;
|
|
m_pFaces = NULL;
|
|
}
|
|
if(m_pFrustum != NULL)
|
|
{
|
|
delete m_pFrustum;
|
|
m_pFrustum = NULL;
|
|
|
|
}
|
|
// Vertexs
|
|
if(m_pBeforeVerts != NULL)
|
|
{
|
|
delete[] m_pBeforeVerts;
|
|
m_pBeforeVerts = NULL; // 원래 bsp 에서 사용하는 vertex class
|
|
}
|
|
if(m_pVerts != NULL)
|
|
{
|
|
delete[] m_pVerts;
|
|
m_pVerts = NULL; // 최적화를 위한 vertex class
|
|
}
|
|
for(i=0;i<m_iTextureDefsNum;i++)
|
|
{
|
|
delete[] m_pIndexArr[i];
|
|
m_pIndexArr[i] = NULL;
|
|
delete[] m_pVertexArr[i];
|
|
m_pVertexArr[i] = NULL;
|
|
m_pLightUnit[i].clear();
|
|
}
|
|
m_pIndexArr.clear();
|
|
m_pVertexArr.clear();
|
|
delete[] m_pLightUnit;
|
|
|
|
if(m_pBaseVertexBuffer != NULL)
|
|
{
|
|
for( i = 0; i < m_iTextureDefsNum; i++)
|
|
{
|
|
SAFE_RELEASE(m_pBaseVertexBuffer[i]);
|
|
m_pBaseVertexBuffer[i] = NULL;
|
|
}
|
|
delete[] m_pBaseVertexBuffer;
|
|
m_pBaseVertexBuffer = NULL;
|
|
delete[] m_pBaseVertexNum;
|
|
m_pBaseVertexNum = NULL;
|
|
delete[] m_pBaseVertexUseNum;
|
|
m_pBaseVertexUseNum = NULL;
|
|
|
|
}
|
|
if(m_pBaseIndexBuffer != NULL)
|
|
{
|
|
for( i = 0; i < m_iTextureDefsNum; i++)
|
|
{
|
|
SAFE_RELEASE(m_pBaseIndexBuffer[i]);
|
|
m_pBaseIndexBuffer[i] = NULL;
|
|
}
|
|
delete[] m_pBaseIndexBuffer;
|
|
m_pBaseIndexBuffer = NULL;
|
|
delete[] m_pBaseIndexNum;
|
|
m_pBaseIndexNum = NULL;
|
|
delete[] m_pBaseIndexUseNum;
|
|
m_pBaseIndexUseNum = NULL;
|
|
}
|
|
if(m_pVisLeafs != NULL)
|
|
{
|
|
delete[] m_pVisLeafs;
|
|
m_pVisLeafs = NULL;
|
|
}
|
|
if(m_pBVisLeafs != NULL)
|
|
{
|
|
delete[] m_pBVisLeafs;
|
|
m_pBVisLeafs = NULL;
|
|
}
|
|
|
|
|
|
}
|
|
void RBspScene::WritetoFile(FILE *fp,char *str) {
|
|
assert(fp != NULL);
|
|
assert(str != NULL);
|
|
|
|
fwrite((char *)str,sizeof(char),RBSPBUF_SIZE,fp);
|
|
|
|
}
|
|
/*
|
|
bool RBspScene::LoadBseScene(const char *strFilename) // Read Converted Quake3 Bsp File
|
|
{
|
|
/* int i;
|
|
if(strFilename != NULL) {
|
|
FILE *fp = fopen(strFilename,"rb");
|
|
if(fp == NULL)
|
|
return false;
|
|
char *strHeader = NULL;
|
|
int iHeaderLength = 0;
|
|
fread((int *)&iHeaderLength,sizeof(int),1,fp);
|
|
strHeader = new char[iHeaderLength + 1];
|
|
fread((char *)strHeader,sizeof(char),iHeaderLength + 1,fp);
|
|
|
|
if(strcmp("BseFile",strHeader)) {
|
|
MessageBox(NULL,"Load File Not Bse File",strHeader,MB_OK);
|
|
fclose(fp);
|
|
return false;
|
|
}
|
|
int arrNum[11];
|
|
|
|
fread((int *)arrNum,sizeof(int),11,fp);
|
|
// VisData Load
|
|
int iAllocSize = 0;
|
|
|
|
fread((int *)&(m_VisData.m_iBytesPerCluster),sizeof(int),1,fp);
|
|
fread((int *)&(m_VisData.m_iClustersNum),sizeof(int),1,fp);
|
|
fread((int *)&iAllocSize,sizeof(int),1,fp);
|
|
m_VisData.m_pBitsets = new byte[iAllocSize];
|
|
fread((byte *)(m_VisData.m_pBitsets),sizeof(byte),iAllocSize,fp);
|
|
// Bsp Info Num Setting
|
|
m_iVertsNum = arrNum[0];
|
|
m_iFacesNum = arrNum[1];
|
|
m_iTextureDefsNum = arrNum[2];
|
|
m_iLightMapsNum = arrNum[3];
|
|
m_iNodesNum = arrNum[4];
|
|
m_iLeafsNum = arrNum[5];
|
|
m_iLeafFacesNum = arrNum[6];
|
|
m_iPlanesNum = arrNum[7];
|
|
m_iBrushesNum = arrNum[8];
|
|
m_iBrusheSidesNum = arrNum[9];
|
|
m_iLeafBrushesNum = arrNum[10];
|
|
|
|
m_pFaces = new RBspFace[m_iFacesNum];
|
|
m_pTextureDefs = new RBspTextureDef[m_iTextureDefsNum];
|
|
m_pLightMaps = new RBspLightMap[m_iLightMapsNum];
|
|
m_pLightTextures = new WBTexture[ m_iLightMapsNum ];
|
|
m_pNodes = new RBspNode[m_iNodesNum];
|
|
m_pLeafs = new RBspLeaf[m_iLeafsNum];
|
|
m_pLeafFaces = new int[m_iLeafFacesNum];
|
|
m_pLeafBrushes = new int[m_iLeafBrushesNum];
|
|
m_pPlanes = new RBspPlane[m_iPlanesNum];
|
|
m_pBrushes = new RBspBrushe[m_iBrushesNum];
|
|
m_pBrusheSides = new RBspBrusheSide[m_iBrusheSidesNum];
|
|
m_pDotVertex = new RBseVertex[m_iVertsNum];
|
|
|
|
// Base Texture Buffer Create
|
|
m_pBaseVertexBuffer = new LPDIRECT3DVERTEXBUFFER8[m_iTextureDefsNum];
|
|
m_pLightVertexBuffer = new LPDIRECT3DVERTEXBUFFER8[m_iTextureDefsNum];
|
|
|
|
m_pBaseVertexNum = new int[m_iTextureDefsNum];
|
|
m_pBaseVertexUseNum = new int[m_iTextureDefsNum];
|
|
|
|
m_pBaseIndexBuffer = new LPDIRECT3DINDEXBUFFER8[m_iTextureDefsNum];
|
|
m_pBaseIndexNum = new int[m_iTextureDefsNum];
|
|
m_pBaseIndexUseNum = new int[m_iTextureDefsNum];
|
|
|
|
m_pLightUnit = new LightUnitType[m_iTextureDefsNum];
|
|
|
|
m_pTextures = new WBTexture[ m_iTextureDefsNum ];
|
|
m_pNTextures = new WBTexture[ m_iTextureDefsNum];
|
|
|
|
|
|
// Face Read
|
|
fread((RBspFace *)m_pFaces,sizeof(RBspFace),m_iFacesNum,fp);
|
|
// Texture Define Read
|
|
fread((RBspTextureDef *)m_pTextureDefs,sizeof(RBspTextureDef),m_iTextureDefsNum,fp);
|
|
//// Load Texture Routine
|
|
for(i = 0; i < m_iTextureDefsNum; i++ )
|
|
{
|
|
m_pBaseVertexBuffer[i] = NULL;
|
|
m_pLightVertexBuffer[i] = NULL;
|
|
m_pBaseVertexNum[i] = 0;
|
|
m_pBaseVertexUseNum[i] = 0;
|
|
m_pBaseIndexBuffer[i] = NULL;
|
|
m_pBaseIndexNum[i] = 0;
|
|
m_pBaseIndexUseNum[i] = 0;
|
|
|
|
char strTex[256] = {0};
|
|
strcpy(strTex,m_pTextureDefs[i].m_strName);
|
|
strcat(strTex,".tga");
|
|
if(!m_pTextures[i].LoadTexture(strTex)) { // tga 파일 로드 시도
|
|
strcpy(strTex,m_pTextureDefs[i].m_strName);
|
|
strcat(strTex,".jpg");
|
|
m_pTextures[i].LoadTexture(strTex); // 없을시 jpg 로드 시도
|
|
}
|
|
memset(strTex,0,sizeof(char) * 256);
|
|
strcpy(strTex,m_pTextureDefs[i].m_strName);
|
|
strcat(strTex,"_Normal.bmp");
|
|
m_pNTextures[i].LoadTexture(strTex);
|
|
}
|
|
|
|
// Lightmap Read
|
|
fread((RBspLightMap *)m_pLightMaps,sizeof(RBspLightMap),m_iLightMapsNum,fp);
|
|
// Setting LightMap
|
|
for( i = 0; i < m_iLightMapsNum; i++ )
|
|
{
|
|
WBTexture::ChangeTextureIntension(m_pLightMaps[i].m_ucLightMap,128 * 128 * 3,20.0f);
|
|
byte m_ucLight[65536];
|
|
int icount = 0;
|
|
int icount2 = 0;
|
|
for(int j=0;j < 128;j++) {
|
|
for(int k=0;k < 128;k++) {
|
|
m_ucLight[icount2++] = m_pLightMaps[i].m_ucLightMap[icount+2]; //R
|
|
m_ucLight[icount2++] = m_pLightMaps[i].m_ucLightMap[icount+1]; //G
|
|
m_ucLight[icount2++] = m_pLightMaps[i].m_ucLightMap[icount]; //B
|
|
m_ucLight[icount2++] = 0;
|
|
icount +=3;
|
|
}
|
|
}
|
|
|
|
m_pLightTextures[i].CreateEmptyTexture(128,128,0,D3DFMT_X8R8G8B8,D3DPOOL_MANAGED);
|
|
//m_pLightTextures[i].FillTexture(m_pLightMaps[i].m_ucLightMap);
|
|
m_pLightTextures[i].FillTexture(m_ucLight);
|
|
}
|
|
|
|
// Node Read
|
|
fread((RBspNode *)m_pNodes,sizeof(RBspNode),m_iNodesNum,fp);
|
|
// Leaf Read
|
|
fread((RBspLeaf *)m_pLeafs,sizeof(RBspLeaf),m_iLeafsNum,fp);
|
|
// Leaf Face Read
|
|
fread((int *)m_pLeafFaces,sizeof(int),m_iLeafFacesNum,fp);
|
|
// Leaf Brushes Read
|
|
fread((int *)m_pLeafBrushes,sizeof(int),m_iLeafBrushesNum,fp);
|
|
// Plane Read
|
|
fread((RBspPlane *)m_pPlanes,sizeof(RBspPlane),m_iPlanesNum,fp);
|
|
// Brushe Read
|
|
fread((RBspBrushe *)m_pBrushes,sizeof(RBspBrushe),m_iBrushesNum,fp);
|
|
// BrusheSide Read
|
|
fread((RBspBrusheSide *)m_pBrusheSides,sizeof(RBspBrusheSide),m_iBrusheSidesNum,fp);
|
|
// Vertex Data Read Read
|
|
fread((RBseVertex *)m_pDotVertex,sizeof(RBseVertex),m_iVertsNum,fp);
|
|
|
|
fclose(fp);
|
|
m_FaceRenderBit.ResizeBits(m_iFacesNum); // Face Render Bit Resize
|
|
// Memory pool Create
|
|
CreateBufferNum2();
|
|
CreateBuffer();
|
|
|
|
m_pFrustum = new WBFrustum;
|
|
|
|
|
|
m_pShader = new WBBumpDSShader;
|
|
m_pShadowShader = new RBspShadowShader;
|
|
m_pFogShader = new RLayerFogShader;
|
|
|
|
}
|
|
return true;*/
|
|
/* return true;
|
|
}*/
|
|
bool RBspScene::LoadBspScene(char *strFileName,float fSx,float fSy,float fSz)
|
|
{
|
|
|
|
SetBspScale(fSx,fSy,fSz);
|
|
|
|
char strBspScene[256];
|
|
memset(strBspScene,0,sizeof(char) * 256);
|
|
strcpy(strBspScene,BSPDATAPATH);
|
|
strcat(strBspScene,strFileName);
|
|
strcpy(m_strBspName,strFileName);
|
|
|
|
FILE *fp = fopen(strBspScene,"rb");
|
|
if(fp == NULL)
|
|
return false;
|
|
if(!LoadBspHeader(fp)) // Read Quake3 Bsp File Header Load
|
|
{
|
|
fclose(fp);
|
|
return false;
|
|
}
|
|
if(!LoadBspLump(fp)) // Read Quake3 Lump File Load
|
|
{
|
|
fclose(fp);
|
|
return false;
|
|
}
|
|
fclose(fp);
|
|
|
|
return true;
|
|
|
|
}
|
|
bool RBspScene::LoadBspHeader(FILE *fp) // Read Quake3 Bsp File Header Load
|
|
{
|
|
if(fp == NULL)
|
|
return false;
|
|
|
|
fread((RBspHeader *)&m_Header,sizeof(RBspHeader),1,fp);
|
|
|
|
|
|
if(m_Header.m_iVersion != 0x2e || strcmp(m_Header.m_strID,"IBSP.")) // Check Quake3 Bsp File
|
|
return false;
|
|
fread((RBspLump *)m_arrLump,sizeof(RBspLump),TOTAL_LUMP,fp);
|
|
|
|
return true;
|
|
}
|
|
void RBspScene::SetBspScaleLoaded(float x,float y,float z)
|
|
{
|
|
int i;
|
|
|
|
D3DXVECTOR3 vecBeforeScale = m_vecScale;
|
|
m_vecScale = D3DXVECTOR3(x,y,z);
|
|
D3DXVECTOR3 vecScale = D3DXVECTOR3((x / vecBeforeScale.x),
|
|
(y / vecBeforeScale.y),
|
|
(z / vecBeforeScale.z));
|
|
|
|
|
|
for(i=0;i < m_iVertsNum;i++)
|
|
{
|
|
/// Scale
|
|
m_pVerts[i].m_vecPos.x *= vecScale.x;
|
|
m_pVerts[i].m_vecPos.y *= vecScale.y;
|
|
m_pVerts[i].m_vecPos.z *= vecScale.z;
|
|
}
|
|
|
|
for(i=0;i < m_iNodesNum; i++) {
|
|
|
|
m_pNodes[i].m_vecMinBox[0] *= (vecScale.x);
|
|
m_pNodes[i].m_vecMinBox[1] *= (vecScale.y);
|
|
m_pNodes[i].m_vecMinBox[2] *= (vecScale.z);
|
|
|
|
m_pNodes[i].m_vecMaxBox[0] *= (vecScale.x);
|
|
m_pNodes[i].m_vecMaxBox[1] *= (vecScale.y);
|
|
m_pNodes[i].m_vecMaxBox[2] *= (vecScale.z);
|
|
|
|
}
|
|
for(i=0;i < m_iLeafsNum; i++) {
|
|
m_pLeafExs[i].m_vecMinBox[0] *= (vecScale.x);
|
|
m_pLeafExs[i].m_vecMinBox[1] *= (vecScale.y);
|
|
m_pLeafExs[i].m_vecMinBox[2] *= (vecScale.z);
|
|
|
|
m_pLeafExs[i].m_vecMaxBox[0] *= (vecScale.x);
|
|
m_pLeafExs[i].m_vecMaxBox[1] *= (vecScale.y);
|
|
m_pLeafExs[i].m_vecMaxBox[2] *= (vecScale.z);
|
|
}
|
|
for(i=0;i<m_iPlanesNum;i++) {
|
|
// Scale 은 정형 이어야 한다
|
|
m_pPlanes[i].m_fDistance *= vecScale.x;
|
|
|
|
}
|
|
|
|
|
|
}
|
|
bool RBspScene::LoadBspLump(FILE *fp)
|
|
{
|
|
int i=0;
|
|
|
|
// Get Number Lumps
|
|
m_iVertsNum = m_arrLump[ RBSP_VERTICES ].m_iLength / sizeof(RBspVertex);
|
|
m_iFacesNum = m_arrLump[ RBSP_FACES ].m_iLength / sizeof(RBspFace);
|
|
m_iTextureDefsNum = m_arrLump[ RBSP_TEXTURES].m_iLength / sizeof(RBspTextureDef);
|
|
m_iLightMapsNum = m_arrLump[ RBSP_LIGHTMAP ].m_iLength / sizeof(RBspLightMap);
|
|
m_iNodesNum = m_arrLump[ RBSP_NODES ].m_iLength / sizeof(RBspNode);
|
|
|
|
m_iLeafsNum = m_arrLump[ RBSP_LEAFS ].m_iLength / sizeof(RBspLeaf);
|
|
m_iLeafFacesNum = m_arrLump[ RBSP_LEAFFACES ].m_iLength / sizeof(int);
|
|
// Brush
|
|
m_iLeafBrushesNum = m_arrLump[ RBSP_LEAFBRUSHES ].m_iLength / sizeof(int);
|
|
m_iBrushesNum = m_arrLump[ RBSP_BRUSHES ].m_iLength / sizeof(RBspBrushe);
|
|
m_iBrusheSidesNum = m_arrLump[ RBSP_BRUSHESIDES ].m_iLength / sizeof(RBspBrusheSide);
|
|
|
|
m_iPlanesNum = m_arrLump[ RBSP_PLANES ].m_iLength / sizeof(RBspPlane);
|
|
|
|
m_pVerts = new RBspDrawVertex[ m_iVertsNum ];
|
|
m_pBeforeVerts = new RBspVertex[ m_iVertsNum ];
|
|
|
|
m_pFaces = new RBspFace[ m_iFacesNum ];
|
|
|
|
m_pTextureDefs = new RBspTextureDef[ m_iTextureDefsNum ];
|
|
m_pLightMaps = new RBspLightMap[ m_iLightMapsNum ];
|
|
m_pLightTextures = new CTexture[ m_iLightMapsNum ];
|
|
m_pNodes = new RBspNode[ m_iNodesNum ];
|
|
m_pLeafs = new RBspLeaf[ m_iLeafsNum ];
|
|
m_pLeafExs = new RBspLeafEx[ m_iLeafsNum ];
|
|
m_pVisLeafs = new int[ m_iLeafsNum ];
|
|
m_pBVisLeafs = new int[ m_iLeafsNum ];
|
|
|
|
m_pLeafFaces = new int[ m_iLeafFacesNum ];
|
|
m_pPlanes = new RBspPlane[ m_iPlanesNum ];
|
|
m_pTextures = new CTexture[ m_iTextureDefsNum ];
|
|
//m_pNTextures = new CTexture[ m_iTextureDefsNum];
|
|
|
|
m_pBrushes = new RBspBrushe[ m_iBrushesNum ];
|
|
m_pBrusheSides = new RBspBrusheSide[ m_iBrusheSidesNum ];
|
|
m_pLeafBrushes = new int[ m_iLeafBrushesNum ];
|
|
|
|
// Base Texture Buffer Create
|
|
m_pBaseVertexBuffer = new LPDIRECT3DVERTEXBUFFER8[m_iTextureDefsNum];
|
|
//m_pLightVertexBuffer = new LPDIRECT3DVERTEXBUFFER8[m_iTextureDefsNum];
|
|
|
|
m_pBaseVertexNum = new int[m_iTextureDefsNum];
|
|
m_pBaseVertexUseNum = new int[m_iTextureDefsNum];
|
|
|
|
m_pBaseIndexBuffer = new LPDIRECT3DINDEXBUFFER8[m_iTextureDefsNum];
|
|
m_pBaseIndexNum = new int[m_iTextureDefsNum];
|
|
m_pBaseIndexUseNum = new int[m_iTextureDefsNum];
|
|
|
|
m_pLightUnit = new LightUnitType[m_iTextureDefsNum];
|
|
|
|
// Vertex Load
|
|
fseek(fp,m_arrLump[ RBSP_VERTICES ].m_iOffset,SEEK_SET); // Move File Pointer
|
|
fread((RBspVertex *)m_pBeforeVerts,sizeof(RBspVertex),m_iVertsNum,fp);
|
|
|
|
for(i=0;i < m_iVertsNum;i++)
|
|
{
|
|
float tmp = m_pBeforeVerts[i].m_vecPos.y;
|
|
m_pBeforeVerts[i].m_vecPos.y = m_pBeforeVerts[i].m_vecPos.z;
|
|
m_pBeforeVerts[i].m_vecPos.z = tmp;
|
|
|
|
m_pVerts[i].m_vecPos = m_pBeforeVerts[i].m_vecPos;
|
|
/// Scale
|
|
m_pVerts[i].m_vecPos.x *= m_vecScale.x;
|
|
m_pVerts[i].m_vecPos.y *= m_vecScale.y;
|
|
m_pVerts[i].m_vecPos.z *= m_vecScale.z;
|
|
|
|
m_pVerts[i].m_vecTexcoord = m_pBeforeVerts[i].m_vecTex1;
|
|
m_pVerts[i].m_vecTexcoord2 = m_pBeforeVerts[i].m_vecTex2;
|
|
|
|
|
|
m_pVerts[i].m_vecNormal = D3DXVECTOR3(m_pBeforeVerts[i].m_vecNormal.x,
|
|
m_pBeforeVerts[i].m_vecNormal.z,
|
|
m_pBeforeVerts[i].m_vecNormal.y);
|
|
|
|
}
|
|
delete[] m_pBeforeVerts;
|
|
m_pBeforeVerts = NULL;
|
|
|
|
// Face Load
|
|
fseek(fp,m_arrLump[ RBSP_FACES ].m_iOffset,SEEK_SET); // Move File Pointer
|
|
fread((RBspFace *)m_pFaces,sizeof(RBspFace),m_iFacesNum,fp);
|
|
|
|
for(i=0;i < m_iFacesNum; i++) // Face Normal Convert
|
|
{
|
|
float tmp = m_pFaces[i].m_vecNormal.y;
|
|
m_pFaces[i].m_vecNormal.y = m_pFaces[i].m_vecNormal.z;
|
|
m_pFaces[i].m_vecNormal.z = tmp;
|
|
}
|
|
// Texture Def Load
|
|
fseek(fp,m_arrLump[ RBSP_TEXTURES ].m_iOffset,SEEK_SET); // Move File Pointer
|
|
fread((RBspTextureDef *)m_pTextureDefs,sizeof(RBspTextureDef),m_iTextureDefsNum,fp);
|
|
//// Load Texture Routine
|
|
for(i = 0; i < m_iTextureDefsNum; i++ )
|
|
{
|
|
m_pBaseVertexBuffer[i] = NULL;
|
|
//m_pLightVertexBuffer[i] = NULL;
|
|
m_pBaseVertexNum[i] = 0;
|
|
m_pBaseVertexUseNum[i] = 0;
|
|
m_pBaseIndexBuffer[i] = NULL;
|
|
m_pBaseIndexNum[i] = 0;
|
|
m_pBaseIndexUseNum[i] = 0;
|
|
|
|
char strTex[256] = {0};
|
|
strcpy(strTex,m_pTextureDefs[i].m_strName);
|
|
char *cptr = strrchr(strTex,'/');
|
|
if(cptr != NULL)
|
|
{
|
|
cptr++;
|
|
strcat(cptr,".dds");
|
|
CTexture::SetPath(BSPTEXTUREPATH);
|
|
m_pTextures[i].Load(cptr);
|
|
}
|
|
else
|
|
{
|
|
|
|
}
|
|
/*
|
|
strcat(strTex,".tga");
|
|
if(!m_pTextures[i].LoadTexture(strTex)) { // tga 파일 로드 시도
|
|
strcpy(strTex,m_pTextureDefs[i].m_strName);
|
|
strcat(strTex,".jpg");
|
|
m_pTextures[i].LoadTexture(strTex); // 없을시 jpg 로드 시도
|
|
}
|
|
memset(strTex,0,sizeof(char) * 256);
|
|
strcpy(strTex,m_pTextureDefs[i].m_strName);
|
|
strcat(strTex,"_Normal.bmp");
|
|
m_pNTextures[i].LoadTexture(strTex);
|
|
*/
|
|
}
|
|
// LightMap Load
|
|
fseek(fp,m_arrLump[ RBSP_LIGHTMAP ].m_iOffset,SEEK_SET);
|
|
fread((RBspLightMap *)m_pLightMaps,sizeof(RBspLightMap),m_iLightMapsNum,fp);
|
|
|
|
for( i = 0; i < m_iLightMapsNum; i++ )
|
|
{
|
|
|
|
|
|
CTexture::ChangeTextureIntension(m_pLightMaps[i].m_ucLightMap,128 * 128 * 3,9.0f);
|
|
|
|
byte m_ucLight[65536];
|
|
int icount = 0;
|
|
int icount2 = 0;
|
|
for(int j=0;j < 128;j++) {
|
|
for(int k=0;k < 128;k++) {
|
|
m_ucLight[icount2++] = m_pLightMaps[i].m_ucLightMap[icount+2]; //R
|
|
m_ucLight[icount2++] = m_pLightMaps[i].m_ucLightMap[icount+1]; //G
|
|
m_ucLight[icount2++] = m_pLightMaps[i].m_ucLightMap[icount]; //B
|
|
m_ucLight[icount2++] = 0;
|
|
icount +=3;
|
|
}
|
|
}
|
|
|
|
m_pLightTextures[i].CreateEmptyTexture(128,128,0,D3DFMT_X8R8G8B8,D3DPOOL_MANAGED);
|
|
|
|
//m_pLightTextures[i].FillTexture(m_pLightMaps[i].m_ucLightMap);
|
|
m_pLightTextures[i].FillTexture(m_ucLight);
|
|
}
|
|
|
|
|
|
// Node
|
|
fseek(fp,m_arrLump[ RBSP_NODES ].m_iOffset,SEEK_SET);
|
|
fread((RBspNode *)m_pNodes,sizeof(RBspNode),m_iNodesNum,fp);
|
|
for(i=0;i < m_iNodesNum; i++) {
|
|
|
|
int tmp = m_pNodes[i].m_vecMinBox[1];
|
|
m_pNodes[i].m_vecMinBox[1] = m_pNodes[i].m_vecMinBox[2];
|
|
m_pNodes[i].m_vecMinBox[2] = tmp;
|
|
|
|
tmp = m_pNodes[i].m_vecMaxBox[1];
|
|
m_pNodes[i].m_vecMaxBox[1] = m_pNodes[i].m_vecMaxBox[2];
|
|
m_pNodes[i].m_vecMaxBox[2] = tmp;
|
|
|
|
m_pNodes[i].m_vecMinBox[0] *= (int)(m_vecScale.x);
|
|
m_pNodes[i].m_vecMinBox[1] *= (int)(m_vecScale.y);
|
|
m_pNodes[i].m_vecMinBox[2] *= (int)(m_vecScale.z);
|
|
|
|
m_pNodes[i].m_vecMaxBox[0] *= (int)(m_vecScale.x);
|
|
m_pNodes[i].m_vecMaxBox[1] *= (int)(m_vecScale.y);
|
|
m_pNodes[i].m_vecMaxBox[2] *= (int)(m_vecScale.z);
|
|
|
|
}
|
|
|
|
// Leaf
|
|
fseek(fp,m_arrLump[ RBSP_LEAFS ].m_iOffset,SEEK_SET);
|
|
fread((RBspLeaf *)m_pLeafs,sizeof(RBspLeaf),m_iLeafsNum,fp);
|
|
|
|
for(i=0;i < m_iLeafsNum; i++) {
|
|
|
|
int tmp = m_pLeafs[i].m_vecMinBox[1];
|
|
m_pLeafs[i].m_vecMinBox[1] = m_pLeafs[i].m_vecMinBox[2];
|
|
m_pLeafs[i].m_vecMinBox[2] = tmp;
|
|
|
|
tmp = m_pLeafs[i].m_vecMaxBox[1];
|
|
m_pLeafs[i].m_vecMaxBox[1] = m_pLeafs[i].m_vecMaxBox[2];
|
|
m_pLeafs[i].m_vecMaxBox[2] = tmp;
|
|
// Leaf Ex conversion
|
|
m_pLeafExs[i].m_iAreaPotal = m_pLeafs[i].m_iAreaPotal;
|
|
m_pLeafExs[i].m_iCluster = m_pLeafs[i].m_iCluster;
|
|
m_pLeafExs[i].m_iLeafBrush = m_pLeafs[i].m_iLeafBrush;
|
|
m_pLeafExs[i].m_iLeafBrushNum = m_pLeafs[i].m_iLeafBrushNum;
|
|
m_pLeafExs[i].m_iLeafFace = m_pLeafs[i].m_iLeafFace;
|
|
m_pLeafExs[i].m_iLeafFaceNum = m_pLeafs[i].m_iLeafFaceNum;
|
|
memcpy(m_pLeafExs[i].m_vecMaxBox,m_pLeafs[i].m_vecMaxBox,sizeof(int) * 3);
|
|
memcpy(m_pLeafExs[i].m_vecMinBox,m_pLeafs[i].m_vecMinBox,sizeof(int) * 3);
|
|
|
|
m_pLeafExs[i].m_vecMinBox[0] *= (int)(m_vecScale.x);
|
|
m_pLeafExs[i].m_vecMinBox[1] *= (int)(m_vecScale.y);
|
|
m_pLeafExs[i].m_vecMinBox[2] *= (int)(m_vecScale.z);
|
|
|
|
m_pLeafExs[i].m_vecMaxBox[0] *= (int)(m_vecScale.x);
|
|
m_pLeafExs[i].m_vecMaxBox[1] *= (int)(m_vecScale.y);
|
|
m_pLeafExs[i].m_vecMaxBox[2] *= (int)(m_vecScale.z);
|
|
}
|
|
delete[] m_pLeafs;
|
|
m_pLeafs = NULL;
|
|
|
|
// Leaf Face
|
|
fseek(fp,m_arrLump[ RBSP_LEAFFACES ].m_iOffset,SEEK_SET);
|
|
fread((int *)m_pLeafFaces,sizeof(int),m_iLeafFacesNum,fp);
|
|
// Leaf Brushes
|
|
fseek(fp,m_arrLump[ RBSP_LEAFBRUSHES ].m_iOffset,SEEK_SET);
|
|
fread((int *)m_pLeafBrushes,sizeof(int),m_iLeafBrushesNum,fp);
|
|
|
|
// Plane
|
|
fseek(fp,m_arrLump[ RBSP_PLANES ].m_iOffset,SEEK_SET);
|
|
fread((RBspPlane *)m_pPlanes,sizeof(RBspPlane),m_iPlanesNum,fp);
|
|
for(i=0;i<m_iPlanesNum;i++) {
|
|
float tmp = m_pPlanes[i].m_vecNormal.y;
|
|
m_pPlanes[i].m_vecNormal.y = m_pPlanes[i].m_vecNormal.z;
|
|
m_pPlanes[i].m_vecNormal.z = tmp;
|
|
// Scale 은 정형 이어야 한다
|
|
m_pPlanes[i].m_fDistance *= m_vecScale.x;
|
|
|
|
}
|
|
|
|
|
|
// Brushe
|
|
fseek(fp,m_arrLump[ RBSP_BRUSHES ].m_iOffset,SEEK_SET);
|
|
fread((RBspBrushe *)m_pBrushes,sizeof(RBspBrushe),m_iBrushesNum,fp);
|
|
|
|
// BrusheSide
|
|
fseek(fp,m_arrLump[ RBSP_BRUSHESIDES ].m_iOffset,SEEK_SET);
|
|
fread((RBspBrusheSide *)m_pBrusheSides,sizeof(RBspBrusheSide),m_iBrusheSidesNum,fp);
|
|
|
|
// VisData (Cluster)
|
|
fseek(fp,m_arrLump[ RBSP_VISDATA ].m_iOffset,SEEK_SET);
|
|
if( m_arrLump[ RBSP_VISDATA ].m_iLength )
|
|
{
|
|
fread((int *)&(m_VisData.m_iClustersNum),sizeof(int),1,fp);
|
|
fread((int *)&(m_VisData.m_iBytesPerCluster),sizeof(int),1,fp);
|
|
int iAllocSize = m_VisData.m_iBytesPerCluster * m_VisData.m_iClustersNum;
|
|
m_VisData.m_pBitsets = new byte[ iAllocSize ];
|
|
fread((byte *)(m_VisData.m_pBitsets),sizeof(byte),iAllocSize,fp);
|
|
|
|
}
|
|
else
|
|
{
|
|
m_VisData.m_pBitsets = NULL; // Visibility Data Not Exist
|
|
}
|
|
|
|
m_FaceRenderBit.ResizeBits(m_iFacesNum); // Face Render Bit Resize
|
|
// Memory pool Create
|
|
|
|
m_D3Device = CSceneManager::GetDevice();
|
|
|
|
CreateBufferNum();
|
|
CreateBuffer();
|
|
|
|
m_pFrustum = new CViewFrustum;
|
|
|
|
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
|
|
CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE);
|
|
CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_COLORARG2, D3DTA_CURRENT);
|
|
CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE);
|
|
|
|
CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP);
|
|
CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP);
|
|
|
|
return true;
|
|
|
|
}
|
|
void RBspScene::ClearBufferNum() // Buffer 관련 Use Number 변수들 초기화
|
|
{
|
|
for(int i=0;i < m_iTextureDefsNum;i++)
|
|
{
|
|
m_pBaseVertexUseNum[i] = 0;
|
|
m_pBaseIndexUseNum[i] = 0;
|
|
m_pLightUnit[i].clear();
|
|
}
|
|
}
|
|
void RBspScene::CreateBufferNum2() {
|
|
/*
|
|
int i;
|
|
|
|
memset(m_pBaseVertexNum,0,sizeof(int) * m_iTextureDefsNum );
|
|
memset(m_pBaseIndexNum,0,sizeof(int) * m_iTextureDefsNum );
|
|
|
|
ClearBufferNum();
|
|
|
|
for( i = 0; i < m_iFacesNum; i++ ) // Buffer Size Setting
|
|
{
|
|
int iFaceVertNum = m_pFaces[i].m_iVertexNum;
|
|
int iBaseTexId = m_pFaces[i].m_iTexId;
|
|
int iLightTexId = m_pFaces[i].m_iLightMapId;
|
|
|
|
m_pBaseVertexNum[ iBaseTexId ] += iFaceVertNum;
|
|
m_pBaseIndexNum[ iBaseTexId ] += (iFaceVertNum - 2) * 3;
|
|
}
|
|
//vector push
|
|
|
|
for(i=0;i<m_iTextureDefsNum;i++)
|
|
{
|
|
WORD *pWord = NULL;
|
|
RBseVertex *pVertex = NULL;
|
|
|
|
m_pIndexArr.push_back(pWord);
|
|
m_pVertexArr.push_back(pVertex);
|
|
|
|
if(m_pBaseIndexNum[i] > 0)
|
|
m_pIndexArr[i] = new WORD[m_pBaseIndexNum[i]];
|
|
if(m_pBaseVertexNum[i] > 0)
|
|
m_pVertexArr[i] = new RBseVertex[m_pBaseVertexNum[i]];
|
|
|
|
}
|
|
*/
|
|
}
|
|
void RBspScene::CreateBufferNum()
|
|
{
|
|
if(m_iShaderVersion == RBSPSHADER_GF2)
|
|
{
|
|
|
|
int i;
|
|
|
|
memset(m_pBaseVertexNum,0,sizeof(int) * m_iTextureDefsNum );
|
|
memset(m_pBaseIndexNum,0,sizeof(int) * m_iTextureDefsNum );
|
|
|
|
ClearBufferNum();
|
|
|
|
for( i = 0; i < m_iFacesNum; i++ ) // Buffer Size Setting
|
|
{
|
|
int iFaceVertNum = m_pFaces[i].m_iVertexNum;
|
|
int iBaseTexId = m_pFaces[i].m_iTexId;
|
|
int iLightTexId = m_pFaces[i].m_iLightMapId;
|
|
|
|
m_pBaseVertexNum[ iBaseTexId ] += iFaceVertNum;
|
|
m_pBaseIndexNum[ iBaseTexId ] += (iFaceVertNum - 2) * 3;
|
|
}
|
|
//vector push
|
|
|
|
for(i=0;i<m_iTextureDefsNum;i++)
|
|
{
|
|
WORD *pWord = NULL;
|
|
RBspDrawVertex *pVertex = NULL;
|
|
|
|
m_pIndexArr.push_back(pWord);
|
|
m_pVertexArr.push_back(pVertex);
|
|
|
|
if(m_pBaseIndexNum[i] > 0)
|
|
m_pIndexArr[i] = new WORD[m_pBaseIndexNum[i]];
|
|
if(m_pBaseVertexNum[i] > 0)
|
|
m_pVertexArr[i] = new RBspDrawVertex[m_pBaseVertexNum[i]];
|
|
|
|
}
|
|
}
|
|
}
|
|
// Create BaseTexture Buffer(vertex,index), LightMap Buffer(vertex,index)
|
|
void RBspScene::CreateBuffer()
|
|
{
|
|
int i;
|
|
HRESULT hr = 0;
|
|
for( i = 0; i < m_iTextureDefsNum; i++ ) // Base Texture's Buffer Create
|
|
{
|
|
|
|
if(m_pBaseVertexNum[i] > 0 ) {
|
|
if(m_iShaderVersion == RBSPSHADER_GF2)
|
|
{
|
|
hr = m_D3Device->CreateVertexBuffer(m_pBaseVertexNum[i] * sizeof(RBspDrawVertex),D3DUSAGE_WRITEONLY | D3DUSAGE_DYNAMIC,
|
|
dwRBSPUseFVF,D3DPOOL_DEFAULT,&(m_pBaseVertexBuffer[i]));
|
|
}
|
|
else if(m_iShaderVersion == RBSPSHADER_GF3)
|
|
{
|
|
|
|
/* hr = m_D3Device->CreateVertexBuffer(m_pBaseVertexNum[i] * sizeof(WBDotVertex),D3DUSAGE_WRITEONLY | D3DUSAGE_DYNAMIC,
|
|
0,D3DPOOL_DEFAULT,&(m_pBaseVertexBuffer[i]));
|
|
|
|
hr = m_D3Device->CreateVertexBuffer(m_pBaseVertexNum[i] * sizeof(RBspLightVertex),D3DUSAGE_WRITEONLY | D3DUSAGE_DYNAMIC,
|
|
0,D3DPOOL_DEFAULT,&(m_pLightVertexBuffer[i]));
|
|
*/
|
|
}
|
|
}
|
|
else {
|
|
m_pBaseVertexBuffer[i] = NULL;
|
|
}
|
|
if(m_pBaseIndexNum[i] > 0) {
|
|
|
|
|
|
hr = m_D3Device->CreateIndexBuffer(m_pBaseIndexNum[i] * sizeof(WORD),D3DUSAGE_WRITEONLY | D3DUSAGE_DYNAMIC,
|
|
D3DFMT_INDEX16,D3DPOOL_DEFAULT,&(m_pBaseIndexBuffer[i]));
|
|
}
|
|
else
|
|
m_pBaseIndexBuffer[i] = NULL;
|
|
|
|
}
|
|
}
|
|
|
|
int RBspScene::ClusterVisibleTest(int iCurrentCluster,int iTestCluster)
|
|
{ // iCurrentCluster 에서 iTestCluster 가 보이는지 Test
|
|
|
|
int iReturn = 0;
|
|
|
|
if( !(m_VisData.m_pBitsets) || (iCurrentCluster < 0) )
|
|
return 1;
|
|
byte VisSet = m_VisData.m_pBitsets[ (iCurrentCluster * m_VisData.m_iBytesPerCluster) + (iTestCluster / 8) ];
|
|
iReturn = VisSet & ( 1 << ( (iTestCluster) & 7 ) );
|
|
// 1 : visible 0 : not visible
|
|
return iReturn;
|
|
|
|
}
|
|
|
|
int RBspScene::FindWorldLeaf(D3DXVECTOR3 vecPos)
|
|
{
|
|
D3DXVECTOR3 vecLocal = WorldToLocalPos(vecPos);
|
|
return FindLeafNode(vecLocal);
|
|
|
|
}
|
|
int RBspScene::FindLeafNode(D3DXVECTOR3 vecPos)
|
|
{
|
|
int iChildIndex = 0;
|
|
|
|
float fDistance = 0.0f;
|
|
// Leaf 노드는 Front Child Index 와 Back Child Index 가 RBSP_EMPTY(-1) 이다
|
|
while( iChildIndex >= 0 )
|
|
{
|
|
RBspNode rNode = m_pNodes[ iChildIndex ];
|
|
RBspPlane rPlane = m_pPlanes[ rNode.m_iPlaneIndex ];
|
|
|
|
// Plane과의 거리 계산
|
|
fDistance = ((rPlane.m_vecNormal.x * vecPos.x) +
|
|
(rPlane.m_vecNormal.y * vecPos.y) +
|
|
(rPlane.m_vecNormal.z * vecPos.z)) - rPlane.m_fDistance;
|
|
|
|
// 현제 노드의 앞이면
|
|
if(fDistance >= 0)
|
|
iChildIndex = rNode.m_iFrontCIndex;
|
|
|
|
else
|
|
iChildIndex = rNode.m_iBackCIndex;
|
|
|
|
|
|
}
|
|
// Return (same thing as saying: return -(iChildIndex + 1)).
|
|
// 이번 노드의 index return
|
|
return ~iChildIndex;
|
|
|
|
}
|
|
// Slide 없는 collision check
|
|
void RBspScene::CheckCollisiontoBrushe2()
|
|
{
|
|
|
|
//Brushe 순회
|
|
CheckBrusheNode( 0,0.0f, 1.0f, m_WalkUnit.m_vecBPos, m_WalkUnit.m_vecPos);
|
|
|
|
if(m_WalkUnit.m_fFraction == 1.0f) // Not Collision
|
|
{
|
|
m_WalkUnit.m_vecOPos = m_WalkUnit.m_vecPos;
|
|
}
|
|
else // Collision
|
|
{
|
|
m_WalkUnit.m_vecOPos = m_WalkUnit.m_vecBPos +
|
|
(m_WalkUnit.m_fFraction * (m_WalkUnit.m_vecPos - m_WalkUnit.m_vecBPos));
|
|
}
|
|
|
|
}
|
|
void RBspScene::CheckCollisiontoBrushe(CollisionType &CT)
|
|
{
|
|
int i;
|
|
|
|
//Brushe 순회
|
|
CheckBrusheNode( 0,0.0f, 1.0f, m_WalkUnit.m_vecBPos, m_WalkUnit.m_vecPos);
|
|
|
|
if(m_WalkUnit.m_fFraction == 1.0f) // Not Collision
|
|
{
|
|
m_WalkUnit.m_vecOPos = m_WalkUnit.m_vecPos;
|
|
CT = CT_NONE;
|
|
}
|
|
else // Collision
|
|
{
|
|
|
|
|
|
// Sliding vector 생성
|
|
m_WalkUnit.m_vecSlide = D3DXVECTOR3(0.0f,0.0f,0.0f);
|
|
|
|
// collision plane normal calc
|
|
for( i = 0; i < m_WalkUnit.m_iCollisionPlanesNum; i++)
|
|
{
|
|
m_WalkUnit.m_vecSlide += m_pPlanes[(m_WalkUnit.m_iCollisionPlanes[i])].m_vecNormal;
|
|
|
|
}
|
|
D3DXVec3Normalize(&(m_WalkUnit.m_vecSlide),&(m_WalkUnit.m_vecSlide));
|
|
// CT Setting
|
|
D3DXVECTOR3 vecTmpCT(0.0f,1.0f,0.0f);
|
|
float fCTDot = D3DXVec3Dot(&(m_WalkUnit.m_vecSlide),&vecTmpCT);
|
|
if(fCTDot >= 0.8f)
|
|
{
|
|
CT = CT_BOTTOM;
|
|
}
|
|
else
|
|
{
|
|
CT = CT_SIDE;
|
|
}
|
|
///
|
|
// 운동방향 vector
|
|
D3DXVECTOR3 vecDir = m_WalkUnit.m_vecPos - m_WalkUnit.m_vecBPos;
|
|
// vecDir *= -1.0f;
|
|
|
|
m_WalkUnit.m_vecSlide.y += 15.0f;
|
|
|
|
m_WalkUnit.m_vecSlide.x += vecDir.x / 1.0f;
|
|
m_WalkUnit.m_vecSlide.z += vecDir.z / 1.0f;
|
|
|
|
// 새로운 position
|
|
m_WalkUnit.m_vecPos = m_WalkUnit.m_vecBPos + m_WalkUnit.m_vecSlide;
|
|
|
|
|
|
m_WalkUnit.m_fFraction = 1.0f;
|
|
m_WalkUnit.m_bOutputStartsOut = true;
|
|
m_WalkUnit.m_bOutputAllSolid = false;
|
|
// 새로운 목표 position 을 가지고 다시 충돌 체크
|
|
CheckBrusheNode( 0,0.0f, 1.0f, m_WalkUnit.m_vecBPos,m_WalkUnit.m_vecPos);
|
|
|
|
//if(m_WalkUnit.m_fFraction < 1.0f)
|
|
// m_WalkUnit.m_fFraction = 0.0f;
|
|
|
|
|
|
m_WalkUnit.m_vecOPos = m_WalkUnit.m_vecBPos +
|
|
(m_WalkUnit.m_fFraction * (m_WalkUnit.m_vecPos - m_WalkUnit.m_vecBPos));
|
|
// 떨림 수정
|
|
/**/ if(fabs(m_WalkUnit.m_vecOPos.y - m_WalkUnit.m_vecBPos.y) < 60.0f)
|
|
m_WalkUnit.m_vecOPos.y = m_WalkUnit.m_vecBPos.y;
|
|
|
|
|
|
}
|
|
|
|
}
|
|
/*
|
|
void RBspScene::CheckBrusheNode(int iNodeIndex, float fStartFraction, float fEndFraction, D3DXVECTOR3 vecStart,D3DXVECTOR3 vecEnd)
|
|
{
|
|
|
|
int i;
|
|
|
|
if(fStartFraction > m_WalkUnit.m_fFraction)
|
|
return;
|
|
if(iNodeIndex<0)
|
|
{
|
|
RBspLeafEx *pLeaf = &(m_pLeafExs[~iNodeIndex]);
|
|
for( i = 0; i < pLeaf->m_iLeafBrushNum; i++ )
|
|
{
|
|
RBspBrushe *pBrush = &(m_pBrushes[m_pLeafBrushes[pLeaf->m_iLeafBrush + i]]);
|
|
if((pBrush->m_iBrusheSidesNum > 0) && (m_pTextureDefs[pBrush->m_iTexId].m_iContents & 1))
|
|
{
|
|
CheckBrushe(pBrush);
|
|
}
|
|
}
|
|
return;
|
|
|
|
}
|
|
RBspNode *pNode = &(m_pNodes[iNodeIndex]);
|
|
RBspPlane *pPlane = &(m_pPlanes[pNode->m_iPlaneIndex]);
|
|
|
|
float fStartDist = D3DXVec3Dot(&vecStart,&(pPlane->m_vecNormal)) - pPlane->m_fDistance;
|
|
float fEndDist = D3DXVec3Dot(&vecEnd,&(pPlane->m_vecNormal)) - pPlane->m_fDistance;
|
|
|
|
if(fStartDist >= 0 && fEndDist >= 0)
|
|
{
|
|
CheckBrusheNode( pNode->m_iFrontCIndex,fStartFraction,fEndFraction,vecStart,vecEnd);
|
|
|
|
}
|
|
else if(fStartDist < 0 && fEndDist < 0)
|
|
{
|
|
CheckBrusheNode( pNode->m_iBackCIndex,fStartFraction,fEndFraction,vecStart,vecEnd);
|
|
}
|
|
else
|
|
{
|
|
int side1, side2;
|
|
float fraction1, fraction2;
|
|
D3DXVECTOR3 vecMiddle;
|
|
|
|
if(fStartDist< fEndDist)
|
|
{
|
|
side1 = pNode->m_iBackCIndex;
|
|
side2 = pNode->m_iFrontCIndex;
|
|
float inverseDistance = 1.0f / (fStartDist - fEndDist);
|
|
fraction1 = (fStartDist - RBSPEPS) * inverseDistance;
|
|
fraction2 = (fStartDist + RBSPEPS) * inverseDistance;
|
|
}
|
|
else if(fEndDist < fStartDist)
|
|
{
|
|
side1 = pNode->m_iFrontCIndex;
|
|
side2 = pNode->m_iBackCIndex;
|
|
float inverseDistance = 1.0f / (fStartDist - fEndDist);
|
|
fraction1 = (fStartDist + RBSPEPS) * inverseDistance;
|
|
fraction2 = (fStartDist - RBSPEPS) * inverseDistance;
|
|
}
|
|
else
|
|
{
|
|
side1 = pNode->m_iFrontCIndex;
|
|
side2 = pNode->m_iBackCIndex;
|
|
|
|
fraction1 = 1.0f;
|
|
fraction2 = 0.0f;
|
|
}
|
|
|
|
if(fraction1 < 0.0f)
|
|
fraction1 = 0.0f;
|
|
else if(fraction1 > 1.0f)
|
|
fraction1 = 1.0f;
|
|
if(fraction2 < 0.0f)
|
|
fraction2 = 0.0f;
|
|
else if(fraction2 > 1.0f)
|
|
fraction2 = 1.0f;
|
|
|
|
vecMiddle = vecStart + (vecEnd - vecStart) * fraction1;
|
|
|
|
float fMiddleFraction = fStartFraction + (fEndFraction - fStartFraction) * fraction1;
|
|
|
|
CheckBrusheNode(side1,fStartFraction, fMiddleFraction, vecStart, vecMiddle );
|
|
|
|
vecMiddle = vecStart + (vecEnd - vecStart) * fraction2;
|
|
|
|
fMiddleFraction = fStartFraction + (fEndFraction - fStartFraction) * fraction2;
|
|
CheckBrusheNode(side2,fMiddleFraction, fEndFraction, vecMiddle, vecEnd );
|
|
|
|
}
|
|
}
|
|
void RBspScene::CheckBrushe(RBspScene::RBspBrushe *pBrushe) // Check Brush for Collision
|
|
{
|
|
int i;
|
|
|
|
float fStartFraction = -1.0f;
|
|
float fEndFraction = 1.0f;
|
|
bool bStartsOut = false;
|
|
bool bEndsOut = false;
|
|
|
|
D3DXVECTOR3 vecCollisionNormal;
|
|
|
|
for( i = 0; i < pBrushe->m_iBrusheSidesNum; i++ )
|
|
{
|
|
RBspBrusheSide *pBrusheSide = &(m_pBrusheSides[pBrushe->m_iBrusheSide + i]);
|
|
RBspPlane *pPlane = &(m_pPlanes[pBrusheSide->m_iPlaneIndex]);
|
|
|
|
float fStartDist = D3DXVec3Dot(&(m_WalkUnit.m_vecBPos),&(pPlane->m_vecNormal)) - (pPlane->m_fDistance + m_WalkUnit.m_fRadius);
|
|
float fEndDist = D3DXVec3Dot(&(m_WalkUnit.m_vecPos),&(pPlane->m_vecNormal)) - (pPlane->m_fDistance + m_WalkUnit.m_fRadius);
|
|
|
|
if(fStartDist > 0)
|
|
bStartsOut = true;
|
|
|
|
if(fEndDist > 0)
|
|
bEndsOut = true;
|
|
|
|
if (fStartDist > 0 && fEndDist > 0)
|
|
{
|
|
return;
|
|
}
|
|
if (fStartDist <= 0 && fEndDist <= 0)
|
|
{
|
|
continue;
|
|
}
|
|
if (fStartDist > fEndDist)
|
|
{
|
|
float fFraction = (fStartDist - RBSPEPS) / (fStartDist - fEndDist);
|
|
if (fFraction > fStartFraction)
|
|
{
|
|
fStartFraction = fFraction;
|
|
vecCollisionNormal = pPlane->m_vecNormal;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
float fFraction = (fStartDist + RBSPEPS) / (fStartDist - fEndDist);
|
|
if (fFraction < fEndFraction)
|
|
fEndFraction = fFraction;
|
|
}
|
|
}
|
|
if(bStartsOut == false)
|
|
{
|
|
m_WalkUnit.m_bOutputStartsOut = false;
|
|
|
|
if (bEndsOut == false)
|
|
m_WalkUnit.m_bOutputAllSolid = true;
|
|
return;
|
|
}
|
|
|
|
if(fStartFraction < fEndFraction)
|
|
{
|
|
if ((fStartFraction > -1.0) && (fStartFraction < m_WalkUnit.m_fFraction))
|
|
{
|
|
|
|
if(fStartFraction < 0)
|
|
fStartFraction = 0;
|
|
m_WalkUnit.m_fFraction = fStartFraction;
|
|
m_WalkUnit.m_vecSlide = vecCollisionNormal;
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
*/
|
|
|
|
void RBspScene::CheckBrusheNode(int iNodeIndex, float fStartFraction, float fEndFraction, D3DXVECTOR3 vecStart,D3DXVECTOR3 vecEnd)
|
|
{
|
|
int i;
|
|
|
|
if (fStartFraction > m_WalkUnit.m_fFraction)
|
|
return;
|
|
|
|
if (iNodeIndex < 0) // leaf node
|
|
{
|
|
|
|
// parent node Get
|
|
RBspLeafEx *pLeaf = &(m_pLeafExs[-(iNodeIndex + 1)]);
|
|
int iStartBrushe = pLeaf->m_iLeafBrush;
|
|
|
|
|
|
for (i = 0; i < pLeaf->m_iLeafBrushNum; i++)
|
|
{
|
|
int iBrushe = m_pLeafBrushes[iStartBrushe + i];
|
|
|
|
RBspBrushe *pBrushe = &(m_pBrushes[iBrushe]);
|
|
if((pBrushe->m_iBrusheSidesNum > 0) && (m_pTextureDefs[pBrushe->m_iTexId].m_iContents & 1))
|
|
CheckBrushe(pBrushe);
|
|
|
|
}
|
|
return;
|
|
}
|
|
|
|
RBspNode *pNode = &(m_pNodes[iNodeIndex]);
|
|
RBspPlane *pPlane = &(m_pPlanes[pNode->m_iPlaneIndex]);
|
|
|
|
float fStartDist,fEndDist,fRadius;
|
|
fStartDist = D3DXVec3Dot(&vecStart,&(pPlane->m_vecNormal)) - pPlane->m_fDistance;
|
|
fEndDist = D3DXVec3Dot(&vecEnd,&(pPlane->m_vecNormal)) - pPlane->m_fDistance;
|
|
fRadius = m_WalkUnit.m_fRadius;
|
|
|
|
if( fStartDist >= fRadius && fEndDist >= fRadius)
|
|
{
|
|
// start, end pos 모두 현 노드의 앞면에 존재
|
|
// 앞노드로 내려감
|
|
CheckBrusheNode(pNode->m_iFrontCIndex,fStartFraction,fEndFraction,vecStart,vecEnd);
|
|
|
|
|
|
}
|
|
else if(fStartDist < -fRadius && fEndDist < -fRadius)
|
|
{
|
|
// Start, End Pos 모두 현 노드의 뒷면에 존재
|
|
// 뒷노드로 내려감
|
|
CheckBrusheNode(pNode->m_iBackCIndex,fStartFraction,fEndFraction,vecStart,vecEnd);
|
|
}
|
|
|
|
else // 현 노드
|
|
{
|
|
// 두 부분으로 나눈다
|
|
int iSide;
|
|
float fFractionFront,fFractionBack,fMidFraction;
|
|
D3DXVECTOR3 vecMid;
|
|
|
|
if (fStartDist < fEndDist)
|
|
{
|
|
iSide = RBSP_BACK; // back
|
|
float fInverseDist = 1.0f / (fStartDist - fEndDist);
|
|
fFractionFront = ((fStartDist - fRadius) + RBSPEPS) * fInverseDist;
|
|
fFractionBack = ((fStartDist + fRadius) + RBSPEPS) * fInverseDist;
|
|
}
|
|
else if (fEndDist < fStartDist)
|
|
{
|
|
iSide = RBSP_FRONT; // front
|
|
float fInverseDist = 1.0f / (fStartDist - fEndDist);
|
|
fFractionFront = ((fStartDist + fRadius) + RBSPEPS) * fInverseDist;
|
|
fFractionBack = ((fStartDist - fRadius) - RBSPEPS) * fInverseDist;
|
|
|
|
}
|
|
else
|
|
{
|
|
iSide = RBSP_FRONT; // front
|
|
fFractionFront = 1.0f;
|
|
fFractionBack = 0.0f;
|
|
}
|
|
// 범위 설정
|
|
if (fFractionFront < 0.0f) fFractionFront = 0.0f;
|
|
else if (fFractionFront > 1.0f) fFractionFront = 1.0f;
|
|
|
|
if (fFractionBack < 0.0f) fFractionBack = 0.0f;
|
|
else if (fFractionBack > 1.0f) fFractionBack = 1.0f;
|
|
// 위에서 나눈 mid fraction을 이용 체크 루틴 돌림
|
|
// 앞부분 체크
|
|
fMidFraction = fStartFraction + (fEndFraction - fStartFraction) * fFractionFront;
|
|
vecMid = vecStart + (fFractionFront * (vecEnd - vecStart));
|
|
|
|
if(iSide == RBSP_FRONT)
|
|
CheckBrusheNode(pNode->m_iFrontCIndex,fStartFraction,fMidFraction,vecStart,vecMid);
|
|
else
|
|
CheckBrusheNode(pNode->m_iBackCIndex,fStartFraction,fMidFraction,vecStart,vecMid);
|
|
|
|
// 뒷부분 체크
|
|
fMidFraction = fStartFraction + (fEndFraction - fStartFraction) * fFractionBack;
|
|
vecMid = vecStart + (fFractionBack * (vecEnd - vecStart));
|
|
|
|
if(iSide == RBSP_FRONT)
|
|
CheckBrusheNode(pNode->m_iBackCIndex,fMidFraction,fEndFraction,vecMid,vecEnd);
|
|
else
|
|
CheckBrusheNode(pNode->m_iFrontCIndex,fMidFraction,fEndFraction,vecMid,vecEnd);
|
|
|
|
}
|
|
}
|
|
|
|
void RBspScene::CheckBrushe(RBspScene::RBspBrushe *pBrushe) // Check Brush for Collision
|
|
{
|
|
int i,j;
|
|
|
|
|
|
float fStartFraction = -1.0f;
|
|
float fEndFraction = 1.0f;
|
|
bool bStartsOut = false;
|
|
bool bEndsOut = false;
|
|
|
|
int iStartBrush = pBrushe->m_iBrusheSide;
|
|
|
|
|
|
for( i = 0; i < pBrushe->m_iBrusheSidesNum; i++)
|
|
{
|
|
|
|
RBspBrusheSide *pBrusheSide = &(m_pBrusheSides[ iStartBrush + i ]);
|
|
RBspPlane *pPlane = &(m_pPlanes[ pBrusheSide->m_iPlaneIndex ]);
|
|
RBspTextureDef *pTextureDef = &(m_pTextureDefs[pBrusheSide->m_iTexId]);
|
|
|
|
if(strstr(pTextureDef->m_strName,"fog_Type1") != NULL) // 안개
|
|
continue;
|
|
|
|
// 투명 brush skip
|
|
/* if((!strcmp("textures/common/caulk",pTextureDef->m_strName)) || // textures/common/caulk
|
|
(!strcmp("textures/common/hint",pTextureDef->m_strName)) || // textures/common/hint
|
|
(!strcmp("noshader",pTextureDef->m_strName))) // NoShader
|
|
continue;
|
|
*/
|
|
float fStartDist,fEndDist;
|
|
fStartDist = D3DXVec3Dot(&(m_WalkUnit.m_vecBPos),&(pPlane->m_vecNormal)) - (pPlane->m_fDistance + m_WalkUnit.m_fRadius);
|
|
fEndDist = D3DXVec3Dot(&(m_WalkUnit.m_vecPos),&(pPlane->m_vecNormal)) - (pPlane->m_fDistance + m_WalkUnit.m_fRadius);
|
|
|
|
if (fStartDist > 0.0f)
|
|
bStartsOut = true;
|
|
if (fEndDist > 0.0f)
|
|
bEndsOut = true;
|
|
|
|
// Side Check
|
|
if ((fStartDist > 0.0f) && (fEndDist > 0.0f))
|
|
{ // 두 점다 현 brushe 앞에 있다,현 brushe 바깥의 일이다.
|
|
|
|
return;
|
|
}
|
|
|
|
if ((fStartDist <= 0.0f) && (fEndDist <= 0.0f))
|
|
{ // 두 점다 현 brushe 뒤에 있다
|
|
continue;
|
|
}
|
|
|
|
if ( fStartDist > fEndDist )
|
|
{ // line is entering into the brush
|
|
float fFraction = (fStartDist - RBSPEPS) / (fStartDist - fEndDist);
|
|
|
|
if (fFraction > fStartFraction) {
|
|
fStartFraction = fFraction;
|
|
// Collision Plane Setting
|
|
//Collision Plane Index
|
|
|
|
//m_WalkUnit.m_iCollisionPlane = i;
|
|
bool bExistPlane = false;
|
|
for(j = 0;j < m_WalkUnit.m_iCollisionPlanesNum;j++)
|
|
{
|
|
if(m_WalkUnit.m_iCollisionPlanes[j] == i)
|
|
{
|
|
bExistPlane = true;
|
|
}
|
|
}
|
|
if(!bExistPlane && m_WalkUnit.m_iCollisionPlanesNum < 5)
|
|
m_WalkUnit.m_iCollisionPlanes[ m_WalkUnit.m_iCollisionPlanesNum++ ] = pBrusheSide->m_iPlaneIndex;
|
|
|
|
|
|
|
|
}
|
|
}
|
|
else
|
|
{ // line is leaving the brush
|
|
float fFraction = (fStartDist + RBSPEPS) / (fStartDist - fEndDist);
|
|
if (fFraction < fEndFraction)
|
|
fEndFraction = fFraction;
|
|
}
|
|
|
|
}
|
|
|
|
if (bStartsOut == false)
|
|
{
|
|
m_WalkUnit.m_bOutputStartsOut = false;
|
|
if(bEndsOut == false)
|
|
m_WalkUnit.m_bOutputAllSolid = true;
|
|
return;
|
|
}
|
|
if (fStartFraction < fEndFraction)
|
|
{
|
|
if (fStartFraction > -1.0f && fStartFraction < m_WalkUnit.m_fFraction)
|
|
{
|
|
if (fStartFraction < 0.0f)
|
|
fStartFraction = 0.0f;
|
|
|
|
m_WalkUnit.m_fFraction = fStartFraction;
|
|
}
|
|
}
|
|
}
|
|
|
|
void RBspScene::UpdateLeaf(int iLeaf,bool bFrustum,int iCurrentCluster)
|
|
{
|
|
|
|
RBspLeafEx *pLeaf = &(m_pLeafExs[iLeaf]);
|
|
int iFaceCount = 0;
|
|
|
|
iFaceCount = pLeaf->m_iLeafFaceNum;
|
|
if( iFaceCount <= 0 ) // face 가 없는 노드
|
|
return;
|
|
// 현제 카메라 위치인 leaf 의 클러스터 index : iCurrentCluster
|
|
// Visible test
|
|
if(!ClusterVisibleTest(iCurrentCluster,pLeaf->m_iCluster))
|
|
return;
|
|
// Frustum cull
|
|
if(bFrustum)
|
|
if(!m_pFrustum->BoxInFrustum(pLeaf->m_vecMinBox,pLeaf->m_vecMaxBox))
|
|
return;
|
|
|
|
while( iFaceCount-- )
|
|
{
|
|
int iFaceIndex = m_pLeafFaces[ pLeaf->m_iLeafFace + iFaceCount ];
|
|
if( m_pFaces[ iFaceIndex ].m_iFaceType != RBSP_POLYGON) // Polygon 만 렌더
|
|
continue;
|
|
if( !m_FaceRenderBit.GetBit(iFaceIndex) )// 그려진 face 가 아니면 render
|
|
{
|
|
|
|
m_iVisLeafNodeNum++;
|
|
m_FaceRenderBit.SetBit(iFaceIndex);
|
|
|
|
PushFaceBuffer( iFaceIndex);
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
void RBspScene::UpdateNode(int iNode,bool bFrustum,int iCurrentCluster)
|
|
{
|
|
|
|
RBspNode *pNode = &(m_pNodes[iNode]);
|
|
|
|
// 상위 노드가 frustum 안에 있으면 그 노드는 무조건 frustum 안에 있다.
|
|
if(bFrustum){
|
|
if(!m_pFrustum->BoxInFrustum(pNode->m_vecMinBox,pNode->m_vecMaxBox)) { // 이노드는 Frustum 바깥이다.
|
|
return;
|
|
}
|
|
else // 이노드는 frustum 안이다.그러므로 자식 노드들은 모두 안이다
|
|
bFrustum = false;
|
|
|
|
}
|
|
// a node is an structure that hold a partition plane, all leaf are splited in two
|
|
// groups: FRONT and BACK. plane is the partition plane for this node
|
|
|
|
const RBspPlane *pPlane = &(m_pPlanes[ pNode->m_iPlaneIndex ]);
|
|
|
|
// 카메라가 현제 평면의 앞이라면 앞에서 부터 그린다
|
|
if( (pPlane->m_vecNormal.x * m_WalkUnit.m_vecPos.x + pPlane->m_vecNormal.y * m_WalkUnit.m_vecPos.y + pPlane->m_vecNormal.z * m_WalkUnit.m_vecPos.z - pPlane->m_fDistance > 0) ) {
|
|
// Front Child
|
|
if(pNode->m_iFrontCIndex >= 0)
|
|
UpdateNode((pNode->m_iFrontCIndex),bFrustum,iCurrentCluster);
|
|
else
|
|
UpdateLeaf(~(pNode->m_iFrontCIndex),bFrustum,iCurrentCluster);
|
|
|
|
// Back Child
|
|
if(pNode->m_iBackCIndex >= 0)
|
|
UpdateNode((pNode->m_iBackCIndex),bFrustum,iCurrentCluster);
|
|
else
|
|
UpdateLeaf(~(pNode->m_iBackCIndex),bFrustum,iCurrentCluster);
|
|
|
|
}
|
|
else //뒷면 부터 그린다
|
|
{
|
|
if(pNode->m_iBackCIndex >= 0)
|
|
UpdateNode((pNode->m_iBackCIndex),bFrustum,iCurrentCluster);
|
|
else
|
|
UpdateLeaf(~(pNode->m_iBackCIndex),bFrustum,iCurrentCluster);
|
|
if(pNode->m_iFrontCIndex >= 0)
|
|
UpdateNode((pNode->m_iFrontCIndex),bFrustum,iCurrentCluster);
|
|
else
|
|
UpdateLeaf(~(pNode->m_iFrontCIndex),bFrustum,iCurrentCluster);
|
|
|
|
}
|
|
|
|
}
|
|
D3DXVECTOR3 RBspScene::CollisionPoint(D3DXVECTOR3 vecBefore,D3DXVECTOR3 vecNew,float fRad) // Slide 없는 collision check
|
|
{
|
|
m_WalkUnit.m_vecBPos = vecBefore;
|
|
m_WalkUnit.m_vecPos = vecNew;
|
|
m_WalkUnit.m_fFraction = 1.0f;
|
|
m_WalkUnit.m_bOutputStartsOut = true;
|
|
m_WalkUnit.m_bOutputAllSolid = false;
|
|
m_WalkUnit.m_fRadius = fRad;
|
|
|
|
//m_WalkUnit.m_iCollisionPlane = RBSP_EMPTY;
|
|
m_WalkUnit.m_iCollisionPlanesNum = 0;
|
|
|
|
CheckCollisiontoBrushe2();
|
|
return m_WalkUnit.m_vecOPos;
|
|
}
|
|
D3DXVECTOR3 RBspScene::CollisionCheck(D3DXVECTOR3 vecBefore,D3DXVECTOR3 vecNew,float fRad,CollisionType &CT)
|
|
{
|
|
m_WalkUnit.m_vecBPos = vecBefore;
|
|
m_WalkUnit.m_vecPos = vecNew;
|
|
m_WalkUnit.m_fFraction = 1.0f;
|
|
m_WalkUnit.m_bOutputStartsOut = true;
|
|
m_WalkUnit.m_bOutputAllSolid = false;
|
|
m_WalkUnit.m_fRadius = fRad;
|
|
|
|
//m_WalkUnit.m_iCollisionPlane = RBSP_EMPTY;
|
|
m_WalkUnit.m_iCollisionPlanesNum = 0;
|
|
|
|
CheckCollisiontoBrushe(CT);
|
|
return m_WalkUnit.m_vecOPos;
|
|
}
|
|
void RBspScene::UpdateScene(D3DXVECTOR3 vecPos,bool bColl)
|
|
{
|
|
bool bObjectUpdate = false;
|
|
|
|
// Walk Unit Init
|
|
m_WalkUnit.m_vecBPos = m_vecCamera;
|
|
m_WalkUnit.m_vecPos = vecPos;
|
|
m_WalkUnit.m_fFraction = 1.0f;
|
|
m_WalkUnit.m_bOutputStartsOut = true;
|
|
m_WalkUnit.m_bOutputAllSolid = false;
|
|
//m_WalkUnit.m_iCollisionPlane = RBSP_EMPTY;
|
|
m_WalkUnit.m_iCollisionPlanesNum = 0;
|
|
|
|
//m_WalkUnit.m_vecOPos = vecPos;
|
|
// if(bColl)
|
|
// CheckCollisiontoBrushe(); // Brushe Collision
|
|
// else
|
|
m_WalkUnit.m_vecOPos = m_WalkUnit.m_vecPos;
|
|
//m_vecCamera = m_WalkUnit.m_vecOPos; // Camera Position Setting
|
|
//CSceneManager::m_ViewCamera->SetVecPosition(vector3(m_vecCamera.x,m_vecCamera.y,m_vecCamera.z));
|
|
//CSceneManager::m_ViewCamera->MoveFrustum();
|
|
m_pFrustum->Update();
|
|
//m_vecCamera = vecPos; // Camera Position Setting
|
|
|
|
int iLeafIndex; // Leaf Node Index
|
|
int iLeafClusterIndex; // Leaf Cluster Index
|
|
int iLeafsNum = 0;
|
|
int iFaceCount = 0;
|
|
m_FaceRenderBit.ClearBits();
|
|
ClearBufferNum(); // Number Buffer Clear
|
|
|
|
iLeafIndex = FindLeafNode(vecPos);
|
|
|
|
m_iRBspLeafIndex = iLeafIndex; // World Creator을 위한 leaf index setting
|
|
|
|
iLeafClusterIndex = m_pLeafExs[iLeafIndex].m_iCluster;
|
|
m_iVisLeafNodeNum = 0;
|
|
iLeafsNum = m_iLeafsNum;
|
|
|
|
m_iBVisLeafs = m_iVisLeafs; // Backup
|
|
memcpy(m_pBVisLeafs,m_pVisLeafs,sizeof(int) * m_iVisLeafs); // Backup
|
|
|
|
m_iVisLeafs = 0; // Visible Leaf Zero Setting
|
|
// Visible Leaf는 나중에 R3S Object 와 Map Effect 에 사용된다
|
|
// UpdateNode(0,true,iLeafClusterIndex);
|
|
|
|
while(iLeafsNum--)
|
|
{
|
|
RBspLeafEx *pLeaf = &(m_pLeafExs[iLeafsNum]);
|
|
|
|
iFaceCount = pLeaf->m_iLeafFaceNum;
|
|
if( iFaceCount <= 0 ) // face 가 없는 노드
|
|
continue;
|
|
|
|
if(!ClusterVisibleTest(iLeafClusterIndex,pLeaf->m_iCluster))
|
|
continue;
|
|
// Leaf Visible Setting
|
|
m_pVisLeafs[m_iVisLeafs] = iLeafsNum;
|
|
m_iVisLeafs++;
|
|
// Frustum cull
|
|
// m_pFrustum->Update();
|
|
|
|
if(!m_pFrustum->BoxInFrustum(pLeaf->m_vecMinBox,pLeaf->m_vecMaxBox))
|
|
continue;
|
|
|
|
|
|
//
|
|
while( iFaceCount-- )
|
|
{
|
|
int iFaceIndex = m_pLeafFaces[ pLeaf->m_iLeafFace + iFaceCount ];
|
|
if( m_pFaces[ iFaceIndex ].m_iFaceType != RBSP_POLYGON) // Polygon 만 렌더
|
|
continue;
|
|
if( !m_FaceRenderBit.GetBit(iFaceIndex) )// 그려진 face 가 아니면 render
|
|
{
|
|
|
|
m_iVisLeafNodeNum++;
|
|
m_FaceRenderBit.SetBit(iFaceIndex);
|
|
PushFaceBuffer( iFaceIndex);
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
if( m_iVisLeafs != m_iBVisLeafs)
|
|
GenerateR3SObject();
|
|
else
|
|
{
|
|
int iCount = 0;
|
|
|
|
for(int iCheck = 0; iCheck < m_iBVisLeafs; iCheck++)
|
|
{
|
|
if(m_pVisLeafs[iCheck] == m_pBVisLeafs[iCheck])
|
|
iCount++;
|
|
}
|
|
if(iCount != m_iBVisLeafs)
|
|
GenerateR3SObject();
|
|
|
|
}
|
|
// RCollisionDetection::SetTriangle(m_vColTriangle,m_iColTriangle);
|
|
SetBuffer();
|
|
|
|
}
|
|
bool RBspScene::FaceCulling(int iFaceIndex) // true: Frustum 안에 face 존재 , false frustum Culling
|
|
{
|
|
|
|
int iStartIndex = m_pFaces[iFaceIndex].m_iStartVertex;
|
|
int iVertexNum = m_pFaces[iFaceIndex].m_iVertexNum;
|
|
int i;
|
|
|
|
for( i = 0; i < iVertexNum; i++ )
|
|
{
|
|
|
|
if(m_pFrustum->PointInFrustum(m_pDotVertex[iStartIndex + i].m_vecPos.x,
|
|
m_pDotVertex[iStartIndex + i].m_vecPos.y,
|
|
m_pDotVertex[iStartIndex + i].m_vecPos.z))
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
return false;
|
|
}
|
|
void RBspScene::SetBuffer()
|
|
{
|
|
if(m_iShaderVersion == RBSPSHADER_GF3)
|
|
{
|
|
/*int i,j;
|
|
vector<WBDotVertex *> DotVertex;
|
|
vector<RBspLightVertex *>LightVertex;
|
|
|
|
|
|
for(i=0;i<m_iTextureDefsNum;i++) {
|
|
WBDotVertex *tmpVert = new WBDotVertex[m_pBaseVertexUseNum[i]];
|
|
RBspLightVertex *tmpLightVert = new RBspLightVertex[m_pBaseVertexUseNum[i]];
|
|
|
|
DotVertex.push_back(tmpVert);
|
|
LightVertex.push_back(tmpLightVert);
|
|
|
|
WORD *tmpIndex = new WORD[m_pBaseIndexUseNum[i]];
|
|
|
|
for(j=0;j<m_pBaseVertexUseNum[i];j++) {
|
|
tmpLightVert[j].m_vecPos = tmpVert[j].m_vecPos = m_pVertexArr[i][j].m_vecPos;
|
|
tmpVert[j].m_vecTexcoord = m_pVertexArr[i][j].m_vecTexcoord;
|
|
tmpLightVert[j].m_vecNormal = tmpVert[j].m_vecNormal = m_pVertexArr[i][j].m_vecNormal;
|
|
tmpLightVert[j].m_vecLightCoord = m_pVertexArr[i][j].m_vecTexcoord2;
|
|
tmpVert[j].m_vecS = m_pVertexArr[i][j].m_vecS;
|
|
tmpVert[j].m_vecSxT = m_pVertexArr[i][j].m_vecSxT;
|
|
tmpVert[j].m_vecT = m_pVertexArr[i][j].m_vecT;
|
|
}
|
|
memcpy(tmpIndex,m_pIndexArr[i],sizeof(WORD) * m_pBaseIndexUseNum[i]);
|
|
// 개량
|
|
// Face Normal Generate
|
|
//CreateFaceNormal(tmpVert,m_pBaseVertexUseNum[i],tmpIndex,m_pBaseIndexUseNum[i]/3);
|
|
// Create S, T, SxT, 마지막인자 true setting 시 노말값 평균 값 사용 (부드러운 쉐이딩을 위해서.)
|
|
//CreateBasis(tmpVert,m_pBaseVertexUseNum[i],tmpIndex,m_pBaseIndexUseNum[i]/3,true);
|
|
|
|
}
|
|
// Tangent S,Tangent SxT Calculate
|
|
for(i=0;i<m_iTextureDefsNum; i++)
|
|
{
|
|
|
|
if(m_pBaseVertexUseNum[i] > 0) {
|
|
|
|
//RBspShaderVertex *tmp = NULL;
|
|
WBDotVertex *tmp = NULL;
|
|
//m_pBaseVertexBuffer[i]->Lock(0,m_pBaseVertexUseNum[i] * sizeof(RBspShaderVertex),(BYTE **)&tmp,D3DLOCK_DISCARD);
|
|
m_pBaseVertexBuffer[i]->Lock(0,m_pBaseVertexUseNum[i] * sizeof(WBDotVertex),(BYTE **)&tmp,D3DLOCK_DISCARD);
|
|
RBspLightVertex *tmpLight = NULL;
|
|
m_pLightVertexBuffer[i]->Lock(0,m_pBaseVertexUseNum[i] * sizeof(RBspLightVertex),(BYTE **)&tmpLight,D3DLOCK_DISCARD);
|
|
//m_pBaseVertexBuffer[i]->Lock(0,m_pBaseVertexUseNum[i] * sizeof(RBspDrawVertex),(BYTE **)&tmp,0);
|
|
/*for(j=0;j<m_pBaseVertexUseNum[i];j++) {
|
|
tmp->m_vecPos = DotVertex[i][j].m_vecPos;
|
|
tmp->m_vecTangentS = DotVertex[i][j].m_vecS;
|
|
tmp->m_vecTangentSxT = DotVertex[i][j].m_vecSxT;
|
|
tmp->m_vecTexcoord = DotVertex[i][j].m_vecTexcoord;
|
|
tmp++;
|
|
}*/
|
|
/* memcpy(tmp,DotVertex[i],sizeof(WBDotVertex) * m_pBaseVertexUseNum[i]);
|
|
memcpy(tmpLight,LightVertex[i],sizeof(RBspLightVertex) * m_pBaseVertexUseNum[i]);
|
|
|
|
m_pBaseVertexBuffer[i]->Unlock();
|
|
m_pLightVertexBuffer[i]->Unlock();
|
|
|
|
}
|
|
if(m_pBaseIndexUseNum[i] > 0) {
|
|
WORD *tmp2 = NULL;
|
|
m_pBaseIndexBuffer[i]->Lock(0,m_pBaseIndexUseNum[i] * sizeof(WORD),(BYTE **)&tmp2,D3DLOCK_DISCARD);
|
|
//m_pBaseIndexBuffer[i]->Lock(0,m_pBaseIndexUseNum[i] * sizeof(WORD),(BYTE **)&tmp2,0);
|
|
memcpy(tmp2,m_pIndexArr[i],sizeof(WORD) * m_pBaseIndexUseNum[i]);
|
|
m_pBaseIndexBuffer[i]->Unlock();
|
|
|
|
}
|
|
|
|
}
|
|
for(i=0;i<DotVertex.size();i++) {
|
|
delete[] DotVertex[i];
|
|
delete[] LightVertex[i];
|
|
|
|
}
|
|
DotVertex.clear();
|
|
LightVertex.clear();*/
|
|
}
|
|
else if(m_iShaderVersion == RBSPSHADER_GF2)
|
|
{
|
|
int i;
|
|
for(i=0;i<m_iTextureDefsNum; i++)
|
|
{
|
|
if(m_pBaseVertexUseNum[i] > 0) {
|
|
RBspDrawVertex *tmp = NULL;
|
|
m_pBaseVertexBuffer[i]->Lock(0,m_pBaseVertexUseNum[i] * sizeof(RBspDrawVertex),(BYTE **)&tmp,D3DLOCK_DISCARD);
|
|
memcpy(tmp,m_pVertexArr[i],sizeof(RBspDrawVertex) * m_pBaseVertexUseNum[i]);
|
|
m_pBaseVertexBuffer[i]->Unlock();
|
|
}
|
|
if(m_pBaseIndexUseNum[i] > 0) {
|
|
WORD *tmp2 = NULL;
|
|
m_pBaseIndexBuffer[i]->Lock(0,m_pBaseIndexUseNum[i] * sizeof(WORD),(BYTE **)&tmp2,D3DLOCK_DISCARD);
|
|
memcpy(tmp2,m_pIndexArr[i],sizeof(WORD) * m_pBaseIndexUseNum[i]);
|
|
m_pBaseIndexBuffer[i]->Unlock();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
void RBspScene::PushFaceBuffer( int iFaceIndex ) // Face 들을 각 텍스쳐에 해당하는 버퍼로 모은다
|
|
{ // Back Face 컬링을 하고 들어간다
|
|
int i;
|
|
|
|
int iLightMapId = m_pFaces[iFaceIndex].m_iLightMapId;
|
|
|
|
int iTextureId = m_pFaces[iFaceIndex].m_iTexId;
|
|
int iVertexNum = m_pFaces[iFaceIndex].m_iVertexNum;
|
|
int iIndexNum = (iVertexNum - 2) * 3;
|
|
int iStartIndex = m_pFaces[iFaceIndex].m_iStartVertex;
|
|
int iVertCount = m_pBaseVertexUseNum[iTextureId];
|
|
int iIndexCount = m_pBaseIndexUseNum[iTextureId];
|
|
// Base Texture Buffer Setting
|
|
|
|
/// Check Face Position
|
|
//D3DXVECTOR3 vec1 = m_pDotVertex[iStartIndex].m_vecPos - m_vecCamera;
|
|
//D3DXVECTOR3 vec2 = m_pDotVertex[iFaceIndex].m_vecNormal;
|
|
//D3DXVECTOR3 vec1 = m_pVerts[iStartIndex].m_vecPos - m_vecCamera;
|
|
//D3DXVECTOR3 vec2 = m_pVerts[iFaceIndex].m_vecNormal;
|
|
|
|
// Back Face Culling Code
|
|
/*float fDot = D3DXVec3Dot(&vec1,&vec2);
|
|
if(fDot >=0.8)
|
|
return;
|
|
*/
|
|
int iCurrentUnit = m_pLightUnit[iTextureId].size();
|
|
|
|
// LightMap Id Setting
|
|
if(iCurrentUnit == 0)
|
|
{
|
|
RBspLightUnit tmp;
|
|
tmp.m_iLightId = iLightMapId;
|
|
tmp.m_iStartIndex = 0;
|
|
tmp.m_iStartVertIndex = 0;
|
|
m_pLightUnit[iTextureId].push_back(tmp);
|
|
}
|
|
else if( (m_pLightUnit[iTextureId][iCurrentUnit - 1].m_iLightId) != iLightMapId)
|
|
{
|
|
RBspLightUnit tmp;
|
|
tmp.m_iLightId = iLightMapId;
|
|
tmp.m_iStartIndex = m_pBaseIndexUseNum[iTextureId];
|
|
tmp.m_iStartVertIndex = m_pBaseVertexUseNum[iTextureId];
|
|
m_pLightUnit[iTextureId].push_back(tmp);
|
|
}
|
|
for( i = 0; i < iVertexNum; i++)
|
|
{
|
|
//m_pVertexArr[iTextureId][iVertCount++] = m_pDotVertex[iStartIndex + i];
|
|
m_pVertexArr[iTextureId][iVertCount++] = m_pVerts[iStartIndex + i];
|
|
|
|
if( i < 3)
|
|
{
|
|
m_pIndexArr[iTextureId][iIndexCount++] = (m_pBaseVertexUseNum[iTextureId] + i);
|
|
}
|
|
else
|
|
{
|
|
m_pIndexArr[iTextureId][iIndexCount++] = (m_pBaseVertexUseNum[iTextureId]);
|
|
m_pIndexArr[iTextureId][iIndexCount++] = (m_pBaseVertexUseNum[iTextureId] + i-1);
|
|
m_pIndexArr[iTextureId][iIndexCount++] = (m_pBaseVertexUseNum[iTextureId] + i);
|
|
}
|
|
}
|
|
|
|
m_pBaseVertexUseNum[iTextureId] += iVertexNum;
|
|
m_pBaseIndexUseNum[iTextureId] += iIndexNum;
|
|
/*
|
|
if(!bSkipCollision) {
|
|
if (fStartFraction < fEndFraction)
|
|
{
|
|
if (fStartFraction > -1 && fStartFraction < m_WalkUnit.m_fFraction)
|
|
{
|
|
if (fStartFraction < 0)
|
|
fStartFraction = 0;
|
|
|
|
m_WalkUnit.m_fFraction = fStartFraction;
|
|
if(m_WalkUnit.m_fFraction < 0.8f) {
|
|
MessageBox(NULL,"Collision","Coll",MB_OK);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
*/
|
|
|
|
}
|
|
void RBspScene::SetBox(D3DXVECTOR3 vecMin,D3DXVECTOR3 vecMax)
|
|
{
|
|
g_vecCube[0] = D3DXVECTOR3(vecMin.x,vecMin.y,vecMin.z);
|
|
g_vecCube[1] = D3DXVECTOR3(vecMin.x,vecMax.y,vecMin.z);
|
|
g_vecCube[2] = D3DXVECTOR3(vecMax.x,vecMin.y,vecMin.z);
|
|
g_vecCube[3] = D3DXVECTOR3(vecMax.x,vecMax.y,vecMin.z);
|
|
g_vecCube[4] = D3DXVECTOR3(vecMin.x,vecMin.y,vecMax.z);
|
|
g_vecCube[5] = D3DXVECTOR3(vecMin.x,vecMax.y,vecMax.z);
|
|
g_vecCube[6] = D3DXVECTOR3(vecMax.x,vecMin.y,vecMax.z);
|
|
g_vecCube[7] = D3DXVECTOR3(vecMax.x,vecMax.y,vecMax.z);
|
|
}
|
|
|
|
void RBspScene::RenderEvent()
|
|
{
|
|
int i;
|
|
int j;
|
|
|
|
int iLeafIndex = m_iRBspLeafIndex;
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_LIGHTING,FALSE);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,FALSE);
|
|
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
|
|
CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TFACTOR);
|
|
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TFACTOR );
|
|
CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
|
|
|
|
m_D3Device->SetVertexShader(D3DFVF_XYZ);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZENABLE,TRUE);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);
|
|
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
|
|
|
|
D3DXMATRIX identity;
|
|
D3DXMatrixIdentity(&identity);
|
|
m_D3Device->SetTransform(D3DTS_WORLD,&identity);
|
|
|
|
/*
|
|
RBSPEVENT_OBJECTANI, // Dynamic Object
|
|
RBSPEVENT_EFFECT, // Effect
|
|
RBSPEVENT_SOUND, // Sound
|
|
RBSPEVENT_TOTAL,
|
|
|
|
m_bVisSoundBox = true;
|
|
m_bVisAObjectBox = true;
|
|
|
|
|
|
*/
|
|
|
|
for( i = 0; i < m_iLeafsNum; i++ )
|
|
{
|
|
if(m_bVisEffectBox) // Effect Box Render
|
|
{
|
|
for(j = 0; j < m_pLeafExs[i].m_iEventNum[RBSPEVENT_EFFECT]; j++)
|
|
{
|
|
// Local to world
|
|
/* /////////////
|
|
D3DXVECTOR3 vecPos = m_pLeafExs[i].m_lstEffect[j]->m_vecCenter;
|
|
D3DXMATRIX matTmp;
|
|
D3DXMATRIX matInv;
|
|
|
|
D3DXMatrixIdentity(&matTmp);
|
|
matTmp._41 = CSceneManager::m_RBspSceneManager.m_pCurrentBspScene->m_vecZeroPos.x;
|
|
matTmp._42 = CSceneManager::m_RBspSceneManager.m_pCurrentBspScene->m_vecZeroPos.y;
|
|
matTmp._43 = CSceneManager::m_RBspSceneManager.m_pCurrentBspScene->m_vecZeroPos.z;
|
|
matInv = matTmp;
|
|
D3DXMatrixIdentity(&matTmp);
|
|
matTmp._41 = vecPos.x;
|
|
matTmp._42 = vecPos.y;
|
|
matTmp._43 = vecPos.z;
|
|
D3DXMatrixMultiply(&matTmp,&matTmp,&matInv);
|
|
vecPos.x = matTmp._41;
|
|
vecPos.y = matTmp._42;
|
|
vecPos.z = matTmp._43;
|
|
|
|
///////////*/
|
|
D3DXVECTOR3 vecMinBox = D3DXVECTOR3(m_pLeafExs[i].m_lstEffect[j]->m_vecCenter.x -10.0f,
|
|
m_pLeafExs[i].m_lstEffect[j]->m_vecCenter.y -10.0f,
|
|
m_pLeafExs[i].m_lstEffect[j]->m_vecCenter.z -10.0f);
|
|
D3DXVECTOR3 vecMaxBox = D3DXVECTOR3(m_pLeafExs[i].m_lstEffect[j]->m_vecCenter.x +10.0f,
|
|
m_pLeafExs[i].m_lstEffect[j]->m_vecCenter.y +10.0f,
|
|
m_pLeafExs[i].m_lstEffect[j]->m_vecCenter.z +10.0f);
|
|
|
|
|
|
SetBox(vecMinBox,vecMaxBox);
|
|
|
|
if(m_pLeafExs[i].m_lstEffect[j] == m_pLeafExs[i].m_pPickEventEffect)
|
|
{
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_TEXTUREFACTOR,0xffff0000);
|
|
|
|
|
|
}
|
|
else
|
|
{
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_TEXTUREFACTOR,0xff00ff00);
|
|
|
|
}
|
|
m_D3Device->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST,
|
|
0,8,12,g_vecCubeIndex,D3DFMT_INDEX16,g_vecCube,sizeof(D3DXVECTOR3));
|
|
}
|
|
}
|
|
if(m_bVisLightBox)
|
|
{
|
|
for(j = 0; j < m_pLeafExs[i].m_iLightNum; j++)
|
|
{
|
|
|
|
// Local to World
|
|
CSphere tmpSphere;
|
|
|
|
tmpSphere.SetTransparency(40);
|
|
tmpSphere.SetColor(m_pLeafExs[i].m_lstLight[j].m_fRed,
|
|
m_pLeafExs[i].m_lstLight[j].m_fGreen,
|
|
m_pLeafExs[i].m_lstLight[j].m_fBlue);
|
|
|
|
tmpSphere.SetRadius(m_pLeafExs[i].m_lstLight[j].m_vecLightRange.x);
|
|
tmpSphere.Create(m_D3Device,10,20);
|
|
|
|
/////////////
|
|
/*D3DXVECTOR3 vecPos = m_pLeafExs[i].m_lstLight[j].m_vecLight;
|
|
D3DXMATRIX matTmp;
|
|
D3DXMATRIX matInv;
|
|
|
|
D3DXMatrixIdentity(&matTmp);
|
|
matTmp._41 = CSceneManager::m_RBspSceneManager.m_pCurrentBspScene->m_vecZeroPos.x;
|
|
matTmp._42 = CSceneManager::m_RBspSceneManager.m_pCurrentBspScene->m_vecZeroPos.y;
|
|
matTmp._43 = CSceneManager::m_RBspSceneManager.m_pCurrentBspScene->m_vecZeroPos.z;
|
|
matInv = matTmp;
|
|
D3DXMatrixIdentity(&matTmp);
|
|
matTmp._41 = vecPos.x;
|
|
matTmp._42 = vecPos.y;
|
|
matTmp._43 = vecPos.z;
|
|
D3DXMatrixMultiply(&matTmp,&matTmp,&matInv);
|
|
vecPos.x = matTmp._41;
|
|
vecPos.y = matTmp._42;
|
|
vecPos.z = matTmp._43;
|
|
*/
|
|
///////////
|
|
|
|
D3DXVECTOR3 vecMinBox = D3DXVECTOR3(m_pLeafExs[i].m_lstLight[j].m_vecLight.x -10.0f,
|
|
m_pLeafExs[i].m_lstLight[j].m_vecLight.y -10.0f,
|
|
m_pLeafExs[i].m_lstLight[j].m_vecLight.z -10.0f);
|
|
D3DXVECTOR3 vecMaxBox = D3DXVECTOR3(m_pLeafExs[i].m_lstLight[j].m_vecLight.x +10.0f,
|
|
m_pLeafExs[i].m_lstLight[j].m_vecLight.y +10.0f,
|
|
m_pLeafExs[i].m_lstLight[j].m_vecLight.z +10.0f);
|
|
|
|
tmpSphere.SetPosition(m_pLeafExs[i].m_lstLight[j].m_vecLight.x,m_pLeafExs[i].m_lstLight[j].m_vecLight.y,m_pLeafExs[i].m_lstLight[j].m_vecLight.z);
|
|
SetBox(vecMinBox,vecMaxBox);
|
|
|
|
if((&m_pLeafExs[i].m_lstLight[j]) == m_pLeafExs[i].m_pPickLight)
|
|
{
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_TEXTUREFACTOR,0xffff0000);
|
|
|
|
|
|
}
|
|
else
|
|
{
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_TEXTUREFACTOR,0xff00ff00);
|
|
|
|
}
|
|
m_D3Device->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST,
|
|
0,8,12,g_vecCubeIndex,D3DFMT_INDEX16,g_vecCube,sizeof(D3DXVECTOR3));
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_FOGENABLE,FALSE);
|
|
tmpSphere.Render();
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_FOGENABLE,TRUE);
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZENABLE,TRUE);
|
|
}
|
|
void RBspScene::RenderLeafBox() // Leaf Box render
|
|
{
|
|
int i;
|
|
|
|
int iLeafIndex = m_iRBspLeafIndex;
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_LIGHTING,FALSE);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,FALSE);
|
|
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
|
|
CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TFACTOR);
|
|
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TFACTOR );
|
|
CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
|
|
|
|
m_D3Device->SetVertexShader(D3DFVF_XYZ);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZENABLE,FALSE);
|
|
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
|
|
|
|
|
|
for( i = 0; i < m_iLeafsNum; i++ )
|
|
{
|
|
if(iLeafIndex == i) {
|
|
D3DXMATRIX identity;
|
|
D3DXMatrixIdentity(&identity);
|
|
m_D3Device->SetTransform(D3DTS_WORLD,&identity);
|
|
D3DXVECTOR3 vecMinBox = D3DXVECTOR3((float)m_pLeafExs[i].m_vecMinBox[0],
|
|
(float)m_pLeafExs[i].m_vecMinBox[1],
|
|
(float)m_pLeafExs[i].m_vecMinBox[2]);
|
|
|
|
D3DXVECTOR3 vecMaxBox = D3DXVECTOR3((float)m_pLeafExs[i].m_vecMaxBox[0],
|
|
(float)m_pLeafExs[i].m_vecMaxBox[1],
|
|
(float)m_pLeafExs[i].m_vecMaxBox[2]);
|
|
|
|
SetBox(vecMinBox,vecMaxBox);
|
|
|
|
/* if(iLeafIndex == i)
|
|
{*/
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_TEXTUREFACTOR,0xffffff00);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);
|
|
|
|
/* }
|
|
else
|
|
{
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_TEXTUREFACTOR,0xff00ffff);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);
|
|
}*/
|
|
m_D3Device->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST,
|
|
0,8,12,g_vecCubeIndex,D3DFMT_INDEX16,g_vecCube,sizeof(D3DXVECTOR3));
|
|
}
|
|
}
|
|
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZENABLE,TRUE);
|
|
|
|
}
|
|
void RBspScene::RenderBspScene()
|
|
{
|
|
int i,j;
|
|
|
|
int iSize;
|
|
|
|
int iRenderCount = 0;
|
|
|
|
// RenderShadowMap();
|
|
if(m_iShaderVersion == RBSPSHADER_GF3)
|
|
{
|
|
/* WBGraphicLayer::GetDevice()->SetTextureStageState(0,D3DTSS_MAGFILTER,D3DTEXF_LINEAR);
|
|
WBGraphicLayer::GetDevice()->SetTextureStageState(0,D3DTSS_MINFILTER,D3DTEXF_LINEAR);
|
|
WBGraphicLayer::GetDevice()->SetTextureStageState(0,D3DTSS_MIPFILTER,D3DTEXF_LINEAR);
|
|
|
|
|
|
WBGraphicLayer::GetDevice()->SetTextureStageState(1,D3DTSS_MAGFILTER,D3DTEXF_LINEAR);
|
|
WBGraphicLayer::GetDevice()->SetTextureStageState(1,D3DTSS_MINFILTER,D3DTEXF_LINEAR);
|
|
WBGraphicLayer::GetDevice()->SetTextureStageState(1,D3DTSS_MIPFILTER,D3DTEXF_LINEAR);
|
|
|
|
WBGraphicLayer::GetDevice()->SetTextureStageState(3,D3DTSS_MAGFILTER,D3DTEXF_LINEAR);
|
|
WBGraphicLayer::GetDevice()->SetTextureStageState(3,D3DTSS_MINFILTER,D3DTEXF_LINEAR);
|
|
WBGraphicLayer::GetDevice()->SetTextureStageState(3,D3DTSS_MIPFILTER,D3DTEXF_LINEAR);
|
|
|
|
// Base texture stage
|
|
WBGraphicLayer::GetDevice()->SetTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
|
|
WBGraphicLayer::GetDevice()->SetTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);
|
|
WBGraphicLayer::GetDevice()->SetRenderState( D3DRS_WRAP0, 0 );
|
|
|
|
// bump map texture stage
|
|
WBGraphicLayer::GetDevice()->SetTextureStageState(1, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
|
|
WBGraphicLayer::GetDevice()->SetTextureStageState(1, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);
|
|
WBGraphicLayer::GetDevice()->SetRenderState( D3DRS_WRAP1, 0 );
|
|
|
|
// Illumination texture
|
|
WBGraphicLayer::GetDevice()->SetTextureStageState(2, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP);
|
|
WBGraphicLayer::GetDevice()->SetTextureStageState(2, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP);
|
|
WBGraphicLayer::GetDevice()->SetTextureStageState(2, D3DTSS_ADDRESSW, D3DTADDRESS_CLAMP);
|
|
WBGraphicLayer::GetDevice()->SetRenderState( D3DRS_WRAP2, 0);
|
|
|
|
WBGraphicLayer::GetDevice()->SetTextureStageState(3, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP);
|
|
WBGraphicLayer::GetDevice()->SetTextureStageState(3, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP);
|
|
WBGraphicLayer::GetDevice()->SetTextureStageState(3, D3DTSS_ADDRESSW, D3DTADDRESS_CLAMP);
|
|
|
|
|
|
// One Pass
|
|
for( i = 0; i < m_iTextureDefsNum; i++ )
|
|
{
|
|
if(m_pBaseVertexUseNum[i] > 0) {
|
|
|
|
m_pShader->SetTexture(&(m_pTextures[i]),&(m_pNTextures[i]));
|
|
m_pShader->Apply();
|
|
|
|
WBGraphicLayer::GetDevice()->SetStreamSource(0,m_pBaseVertexBuffer[i],sizeof(WBDotVertex));
|
|
WBGraphicLayer::GetDevice()->SetIndices(m_pBaseIndexBuffer[i],0);
|
|
|
|
iSize = m_pLightUnit[i].size();
|
|
|
|
for(j=0;j < iSize;j++)
|
|
{
|
|
|
|
if(j != (iSize - 1)) {
|
|
|
|
WBGraphicLayer::GetDevice()->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,
|
|
m_pLightUnit[i][j].m_iStartVertIndex,(m_pLightUnit[i][j+1].m_iStartVertIndex - m_pLightUnit[i][j].m_iStartVertIndex), m_pLightUnit[i][j].m_iStartIndex,
|
|
((m_pLightUnit[i][j+1].m_iStartIndex - m_pLightUnit[i][j].m_iStartIndex)/ 3));
|
|
iRenderCount++;
|
|
}
|
|
else {
|
|
WBGraphicLayer::GetDevice()->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,
|
|
m_pLightUnit[i][j].m_iStartVertIndex,(m_pBaseVertexUseNum[i] - m_pLightUnit[i][j].m_iStartVertIndex), m_pLightUnit[i][j].m_iStartIndex,
|
|
((m_pBaseIndexUseNum[i] - m_pLightUnit[i][j].m_iStartIndex)/ 3));
|
|
iRenderCount++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
WBGraphicLayer::GetDevice()->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
|
|
WBGraphicLayer::GetDevice()->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ZERO);
|
|
WBGraphicLayer::GetDevice()->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_SRCCOLOR);
|
|
|
|
// Two Pass (Light Map)
|
|
for( i = 0; i < m_iTextureDefsNum; i++ )
|
|
{
|
|
if(m_pBaseVertexUseNum[i] > 0) {
|
|
|
|
WBGraphicLayer::GetDevice()->SetStreamSource(0,m_pLightVertexBuffer[i],sizeof(RBspLightVertex));
|
|
WBGraphicLayer::GetDevice()->SetIndices(m_pBaseIndexBuffer[i],0);
|
|
|
|
iSize = m_pLightUnit[i].size();
|
|
|
|
for(j=0;j < iSize;j++)
|
|
{
|
|
|
|
if(m_pLightUnit[i][j].m_iLightId < 0) { // Lightmap 없을때
|
|
m_pShadowShader->SetTexture(NULL);
|
|
//m_pShadowShader->SetTexture(NULL,m_pDepthTexture);
|
|
}
|
|
else
|
|
//m_pShadowShader->SetTexture(&(m_pLightTextures[m_pLightUnit[i][j].m_iLightId]),m_pColorTexture);
|
|
m_pShadowShader->SetTexture(&(m_pLightTextures[m_pLightUnit[i][j].m_iLightId]));
|
|
// Shadow Mapping
|
|
m_pShadowShader->Apply();
|
|
|
|
|
|
if(j != (iSize - 1)) {
|
|
|
|
WBGraphicLayer::GetDevice()->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,
|
|
m_pLightUnit[i][j].m_iStartVertIndex,(m_pLightUnit[i][j+1].m_iStartVertIndex - m_pLightUnit[i][j].m_iStartVertIndex), m_pLightUnit[i][j].m_iStartIndex,
|
|
((m_pLightUnit[i][j+1].m_iStartIndex - m_pLightUnit[i][j].m_iStartIndex)/ 3));
|
|
iRenderCount++;
|
|
}
|
|
else {
|
|
WBGraphicLayer::GetDevice()->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,
|
|
m_pLightUnit[i][j].m_iStartVertIndex,(m_pBaseVertexUseNum[i] - m_pLightUnit[i][j].m_iStartVertIndex), m_pLightUnit[i][j].m_iStartIndex,
|
|
((m_pBaseIndexUseNum[i] - m_pLightUnit[i][j].m_iStartIndex)/ 3));
|
|
iRenderCount++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// tree pass (test pass : layer fog)
|
|
WBGraphicLayer::GetDevice()->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);
|
|
WBGraphicLayer::GetDevice()->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
|
|
//WBGraphicLayer::GetDevice()->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
|
|
//WBGraphicLayer::GetDevice()->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
|
|
|
|
|
|
WBGraphicLayer::GetDevice()->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_BLENDTEXTUREALPHA);
|
|
//WBGraphicLayer::GetDevice()->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE);
|
|
WBGraphicLayer::GetDevice()->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
|
|
WBGraphicLayer::GetDevice()->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_CURRENT);
|
|
WBGraphicLayer::GetDevice()->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
|
|
|
|
WBGraphicLayer::GetDevice()->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
|
|
WBGraphicLayer::GetDevice()->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_CURRENT );
|
|
WBGraphicLayer::GetDevice()->SetTextureStageState(0, D3DTSS_MIPFILTER, D3DTEXF_NONE);
|
|
WBGraphicLayer::GetDevice()->SetTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP);
|
|
WBGraphicLayer::GetDevice()->SetTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP);
|
|
WBGraphicLayer::GetDevice()->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0);
|
|
|
|
m_pFogShader->Apply();
|
|
|
|
for( i = 0; i < m_iTextureDefsNum; i++ )
|
|
{
|
|
if(m_pBaseVertexUseNum[i] > 0) {
|
|
|
|
WBGraphicLayer::GetDevice()->SetStreamSource(0,m_pLightVertexBuffer[i],sizeof(RBspLightVertex));
|
|
WBGraphicLayer::GetDevice()->SetIndices(m_pBaseIndexBuffer[i],0);
|
|
|
|
iSize = m_pLightUnit[i].size();
|
|
|
|
for(j=0;j < iSize;j++)
|
|
{
|
|
|
|
if(j != (iSize - 1)) {
|
|
|
|
WBGraphicLayer::GetDevice()->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,
|
|
m_pLightUnit[i][j].m_iStartVertIndex,(m_pLightUnit[i][j+1].m_iStartVertIndex - m_pLightUnit[i][j].m_iStartVertIndex), m_pLightUnit[i][j].m_iStartIndex,
|
|
((m_pLightUnit[i][j+1].m_iStartIndex - m_pLightUnit[i][j].m_iStartIndex)/ 3));
|
|
iRenderCount++;
|
|
}
|
|
else {
|
|
WBGraphicLayer::GetDevice()->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,
|
|
m_pLightUnit[i][j].m_iStartVertIndex,(m_pBaseVertexUseNum[i] - m_pLightUnit[i][j].m_iStartVertIndex), m_pLightUnit[i][j].m_iStartIndex,
|
|
((m_pBaseIndexUseNum[i] - m_pLightUnit[i][j].m_iStartIndex)/ 3));
|
|
iRenderCount++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
WBGraphicLayer::GetDevice()->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE);*/
|
|
}
|
|
else if(m_iShaderVersion == RBSPSHADER_GF2)
|
|
{
|
|
m_D3Device->SetVertexShader(dwRBSPUseFVF);
|
|
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
|
|
CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE);
|
|
CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_COLORARG2, D3DTA_CURRENT);
|
|
|
|
|
|
for( i = 0; i < m_iTextureDefsNum; i++ )
|
|
{
|
|
|
|
if(m_pBaseVertexUseNum[i] > 0) {
|
|
m_D3Device->SetTexture(0,m_pTextures[i].GetTexture());
|
|
m_D3Device->SetStreamSource(0,m_pBaseVertexBuffer[i],sizeof(RBspDrawVertex));
|
|
m_D3Device->SetIndices(m_pBaseIndexBuffer[i],0);
|
|
|
|
iSize = m_pLightUnit[i].size();
|
|
|
|
for(j=0;j < iSize;j++)
|
|
{
|
|
|
|
if(m_pLightUnit[i][j].m_iLightId < 0) { // Lightmap 없을때
|
|
m_D3Device->SetTexture(1,NULL);
|
|
CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
|
|
}
|
|
else
|
|
{
|
|
m_D3Device->SetTexture(1,m_pLightTextures[m_pLightUnit[i][j].m_iLightId].GetTexture());
|
|
CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE);
|
|
}
|
|
if(j != (iSize - 1)) {
|
|
|
|
m_D3Device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,
|
|
m_pLightUnit[i][j].m_iStartVertIndex,(m_pLightUnit[i][j+1].m_iStartVertIndex - m_pLightUnit[i][j].m_iStartVertIndex), m_pLightUnit[i][j].m_iStartIndex,
|
|
((m_pLightUnit[i][j+1].m_iStartIndex - m_pLightUnit[i][j].m_iStartIndex)/ 3));
|
|
iRenderCount++;
|
|
}
|
|
else {
|
|
m_D3Device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,
|
|
m_pLightUnit[i][j].m_iStartVertIndex,(m_pBaseVertexUseNum[i] - m_pLightUnit[i][j].m_iStartVertIndex), m_pLightUnit[i][j].m_iStartIndex,
|
|
((m_pBaseIndexUseNum[i] - m_pLightUnit[i][j].m_iStartIndex)/ 3));
|
|
iRenderCount++;
|
|
}
|
|
}
|
|
}
|
|
}// for
|
|
|
|
RenderR3SObject();
|
|
|
|
}
|
|
}
|
|
// Return value : 총 사용된 light, Arg: PLight 는 배열, iLightNum 은 배열 요소 갯수
|
|
int RBspScene::CheckChrLight(D3DXVECTOR3 vecPos,D3DLIGHT8 *pLight,int iLightNum)
|
|
{
|
|
D3DXVECTOR3 vecLocalPos = vecPos;
|
|
D3DXMATRIX matTmp;
|
|
D3DXMATRIX matInv;
|
|
|
|
D3DXMatrixIdentity(&matTmp);
|
|
|
|
matTmp._41 = CSceneManager::m_RBspSceneManager.m_pCurrentBspScene->m_vecZeroPos.x;
|
|
matTmp._42 = CSceneManager::m_RBspSceneManager.m_pCurrentBspScene->m_vecZeroPos.y;
|
|
matTmp._43 = CSceneManager::m_RBspSceneManager.m_pCurrentBspScene->m_vecZeroPos.z;
|
|
D3DXMatrixInverse(&matInv,NULL,&matTmp);
|
|
D3DXMatrixIdentity(&matTmp);
|
|
matTmp._41 = vecPos.x;
|
|
matTmp._42 = vecPos.y;
|
|
matTmp._43 = vecPos.z;
|
|
D3DXMatrixMultiply(&matTmp,&matTmp,&matInv);
|
|
vecLocalPos.x = matTmp._41;
|
|
vecLocalPos.y = matTmp._42;
|
|
vecLocalPos.z = matTmp._43;
|
|
|
|
|
|
int iLeaf = FindLeafNode(vecLocalPos);
|
|
|
|
RBspLeafEx *pLeafEx = &(m_pLeafExs[iLeaf]);
|
|
|
|
return pLeafEx->CheckInChrLight(vecPos,pLight,iLightNum);
|
|
}
|
|
|
|
int RBspScene::RBspLeafEx::CheckInChrLight(D3DXVECTOR3 vecPos,D3DLIGHT8 *pLight,int iLightNum)
|
|
{
|
|
int i;
|
|
float fMinLength = 0.0f;
|
|
int iMinIndex = -1;
|
|
int iInputNum = 0;
|
|
|
|
for( i=0; i < m_iLightNum; i++ )
|
|
{
|
|
D3DXVECTOR3 vecUnit = vecPos - m_lstLight[i].m_vecLight;
|
|
float fLength = D3DXVec3Length(&vecUnit);
|
|
|
|
if(fLength <= m_lstLight[i].m_vecLightRange.x)
|
|
{
|
|
if(iInputNum < iLightNum)
|
|
{
|
|
pLight[iInputNum] = m_lstLight[i].m_D3DLight;
|
|
iInputNum++;
|
|
}
|
|
}
|
|
}
|
|
|
|
return iInputNum;
|
|
}
|
|
/*
|
|
D3DLIGHT8 *RBspScene::RBspLeafEx::CheckInChrLight(D3DXVECTOR3 vecPos)
|
|
{
|
|
int i;
|
|
float fMinLength = 0.0f;
|
|
int iMinIndex = -1;
|
|
|
|
for( i=0; i < m_iLightNum; i++ )
|
|
{
|
|
D3DXVECTOR3 vecUnit = vecPos - m_lstLight[i].m_vecLight;
|
|
float fLength = D3DXVec3Length(&vecUnit);
|
|
|
|
if(fLength <= m_lstLight[i].m_vecLightRange.x)
|
|
{
|
|
|
|
if( iMinIndex == -1)
|
|
{
|
|
fMinLength = fLength;
|
|
iMinIndex = i;
|
|
}
|
|
else if(fLength < fMinLength)
|
|
{
|
|
fMinLength = fLength;
|
|
iMinIndex = i;
|
|
}
|
|
}
|
|
}
|
|
if(iMinIndex != -1)
|
|
return &(m_lstLight[iMinIndex].m_D3DLight);
|
|
|
|
return NULL;
|
|
|
|
}*/
|
|
|
|
void RBspScene::RBspLeafEx::InputLight(int iLightValue,D3DXVECTOR3 vecLight,D3DXVECTOR3 vecRange,int iRed,int iGreen,int iBlue,bool bVolume,bool bMap)
|
|
{
|
|
// Local transform
|
|
/* D3DXVECTOR3 vecLocalPos = vecLight;
|
|
D3DXMATRIX matTmp;
|
|
D3DXMATRIX matInv;
|
|
|
|
D3DXMatrixIdentity(&matTmp);
|
|
|
|
matTmp._41 = CSceneManager::m_RBspSceneManager.m_pCurrentBspScene->m_vecZeroPos.x;
|
|
matTmp._42 = CSceneManager::m_RBspSceneManager.m_pCurrentBspScene->m_vecZeroPos.y;
|
|
matTmp._43 = CSceneManager::m_RBspSceneManager.m_pCurrentBspScene->m_vecZeroPos.z;
|
|
D3DXMatrixInverse(&matInv,NULL,&matTmp);
|
|
D3DXMatrixIdentity(&matTmp);
|
|
matTmp._41 = vecLight.x;
|
|
matTmp._42 = vecLight.y;
|
|
matTmp._43 = vecLight.z;
|
|
D3DXMatrixMultiply(&matTmp,&matTmp,&matInv);
|
|
vecLocalPos.x = matTmp._41;
|
|
vecLocalPos.y = matTmp._42;
|
|
vecLocalPos.z = matTmp._43;
|
|
|
|
// World 좌표 세팅
|
|
|
|
|
|
vecLight = vecLocalPos;*/
|
|
//
|
|
RBspLight PushNode;
|
|
// Point Light or Directional Light
|
|
PushNode.m_iLightValue = iLightValue;
|
|
PushNode.m_vecLight = vecLight;
|
|
PushNode.m_vecLightRange = vecRange;
|
|
PushNode.m_fRed = (float)iRed / 255.0f;
|
|
PushNode.m_fGreen = (float)iGreen / 255.0f;
|
|
PushNode.m_fBlue = (float)iBlue / 255.0f;
|
|
|
|
ZeroMemory(&(PushNode.m_D3DLight),sizeof(D3DLIGHT8));
|
|
PushNode.m_D3DLight.Type=D3DLIGHT_POINT;
|
|
PushNode.m_D3DLight.Attenuation0=0.2f;
|
|
PushNode.m_D3DLight.Attenuation1=0.005f;
|
|
PushNode.m_D3DLight.Attenuation2=0.0f;
|
|
|
|
PushNode.m_D3DLight.Diffuse.r = PushNode.m_fRed;
|
|
PushNode.m_D3DLight.Diffuse.g = PushNode.m_fGreen;
|
|
PushNode.m_D3DLight.Diffuse.b = PushNode.m_fBlue;
|
|
|
|
PushNode.m_D3DLight.Position.x = PushNode.m_vecLight.x;
|
|
PushNode.m_D3DLight.Position.y = PushNode.m_vecLight.y;
|
|
PushNode.m_D3DLight.Position.z = PushNode.m_vecLight.z;
|
|
PushNode.m_D3DLight.Range= PushNode.m_vecLightRange.x;
|
|
PushNode.m_D3DLight.Falloff = 1.0f;
|
|
|
|
m_lstLight.push_back(PushNode);
|
|
if(bVolume)
|
|
m_lstLight[m_iLightNum - 1].CreateShadowVolume();
|
|
if(bMap)
|
|
m_lstLight[m_iLightNum - 1].CreateShadowMap();
|
|
|
|
m_iLightNum++;
|
|
|
|
}
|
|
void RBspScene::RBspLeafEx::DeleteAllTrigger()
|
|
{
|
|
m_lstTrigger.clear();
|
|
m_iTriggerNum = 0;
|
|
}
|
|
|
|
void RBspScene::RBspLeafEx::DeleteAllLight()
|
|
{
|
|
m_lstLight.clear();
|
|
m_iLightNum = 0;
|
|
}
|
|
|
|
void RBspScene::RBspLeafEx::DeleteLight(RBspScene::RBspLight *pLight)
|
|
{
|
|
int i;
|
|
int iIndex = -1;
|
|
|
|
if(pLight == NULL)
|
|
return;
|
|
|
|
for( i = 0; i < m_iLightNum; i++ )
|
|
{
|
|
if((&m_lstLight[i]) == pLight)
|
|
{
|
|
iIndex = i;
|
|
break;
|
|
}
|
|
}
|
|
if(iIndex != -1)
|
|
{
|
|
m_lstLight.erase(&(m_lstLight[iIndex]));
|
|
m_iLightNum--;
|
|
}
|
|
}
|
|
void RBspScene::RBspLeafEx::DeleteTrigger(RBspScene::RBspTrigger *pTrigger)
|
|
{
|
|
int i;
|
|
int iIndex = -1;
|
|
|
|
if(pTrigger == NULL)
|
|
return;
|
|
for( i = 0; i < m_iTriggerNum; i++)
|
|
{
|
|
if((&m_lstTrigger[i]) == pTrigger)
|
|
{
|
|
iIndex = i;
|
|
break;
|
|
}
|
|
}
|
|
if(iIndex != -1)
|
|
{
|
|
m_lstTrigger.erase(&(m_lstTrigger[iIndex]));
|
|
m_iTriggerNum--;
|
|
|
|
}
|
|
}
|
|
void RBspScene::RBspLeafEx::DeleteLight(D3DXVECTOR3 vecLight)
|
|
{
|
|
int i;
|
|
for( i = 0; i < m_iLightNum; i++)
|
|
{
|
|
if(((vecLight.x - m_lstLight[i].m_vecLight.x) +
|
|
(vecLight.y - m_lstLight[i].m_vecLight.y) +
|
|
(vecLight.z - m_lstLight[i].m_vecLight.z)) < RBSPEPS) // 같은점
|
|
{
|
|
m_lstLight.erase(&(m_lstLight[i]));
|
|
m_iLightNum--;
|
|
|
|
return;
|
|
}
|
|
|
|
}
|
|
}
|
|
void RBspScene::RBspLeafEx::DeleteTrigger(D3DXVECTOR3 vecCenter)
|
|
{
|
|
int i;
|
|
|
|
for( i = 0; i < m_iTriggerNum; i++ )
|
|
{
|
|
if(((vecCenter.x - m_lstTrigger[i].m_vecCenter.x) +
|
|
(vecCenter.x - m_lstTrigger[i].m_vecCenter.x) +
|
|
(vecCenter.x - m_lstTrigger[i].m_vecCenter.x)) < RBSPEPS)
|
|
{
|
|
m_lstTrigger.erase(&(m_lstTrigger[i]));
|
|
m_iTriggerNum--;
|
|
return;
|
|
|
|
}
|
|
}
|
|
}
|
|
void RBspScene::RBspLeafEx::MoveLight(D3DXVECTOR3 vecBeforePos,D3DXVECTOR3 vecNewPos)
|
|
{
|
|
|
|
int i;
|
|
for( i = 0; i < m_iLightNum; i++)
|
|
{
|
|
if(((vecBeforePos.x - m_lstLight[i].m_vecLight.x) +
|
|
(vecBeforePos.y - m_lstLight[i].m_vecLight.y) +
|
|
(vecBeforePos.z - m_lstLight[i].m_vecLight.z)) < RBSPEPS) // 같은점
|
|
{
|
|
m_lstLight[i].m_vecLight = D3DXVECTOR3( vecNewPos.x,
|
|
vecNewPos.y,
|
|
vecNewPos.z);
|
|
return;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
int RBspScene::RBspLeafEx::InputEventSound(char *strName,D3DXVECTOR3 vecCenter,float fDelay)
|
|
{
|
|
m_iEventNum[ RBSPEVENT_SOUND]++;
|
|
RBspEventSound *pNode = new RBspEventSound;
|
|
strncpy(pNode->m_strName,strName,sizeof(char) * (RBSPBUF_SIZE - 1));
|
|
pNode->m_fDelay = fDelay;
|
|
pNode->m_vecCenter = vecCenter;
|
|
m_lstSound.push_back(pNode);
|
|
|
|
return m_iEventNum[ RBSPEVENT_SOUND];
|
|
|
|
}
|
|
void RBspScene::RBspLeafEx::DeletePickEventEffect()
|
|
{
|
|
if(m_pPickEventEffect == NULL)
|
|
return;
|
|
else
|
|
{
|
|
int i;
|
|
for( i = 0; i < m_iEventNum[RBSPEVENT_EFFECT]; i++ )
|
|
{
|
|
if(m_pPickEventEffect == m_lstEffect[i])
|
|
{
|
|
delete m_lstEffect[i];
|
|
m_lstEffect[i] = NULL;
|
|
m_iEventNum[RBSPEVENT_EFFECT]--;
|
|
m_lstEffect.erase(&(m_lstEffect[i]));
|
|
m_pPickEventEffect = NULL;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
void RBspScene::RBspLeafEx::DeletePickEventObject()
|
|
{
|
|
if(m_pPickEventObject == NULL)
|
|
return;
|
|
else
|
|
{
|
|
int i;
|
|
for( i = 0; i < m_iEventNum[RBSPEVENT_OBJECTANI]; i++ )
|
|
{
|
|
if(m_pPickEventObject == m_lstObject[i])
|
|
{
|
|
delete m_lstObject[i];
|
|
m_lstObject[i] = NULL;
|
|
m_iEventNum[RBSPEVENT_OBJECTANI]--;
|
|
m_lstObject.erase(&(m_lstObject[i]));
|
|
m_pPickEventObject = NULL;
|
|
break;
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
void RBspScene::RBspLeafEx::DeletePickEventSound()
|
|
{
|
|
if(m_pPickEventSound == NULL)
|
|
return;
|
|
else
|
|
{
|
|
int i;
|
|
for( i = 0; i < m_iEventNum[RBSPEVENT_SOUND]; i++ )
|
|
{
|
|
if(m_pPickEventSound == m_lstSound[i])
|
|
{
|
|
delete m_lstSound[i];
|
|
m_lstSound[i] = NULL;
|
|
m_iEventNum[RBSPEVENT_SOUND]--;
|
|
m_lstSound.erase(&(m_lstSound[i]));
|
|
m_pPickEventSound = NULL;
|
|
break;
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
void RBspScene::RBspLeafEx::DeletePickLight()
|
|
{
|
|
if(m_pPickLight == NULL)
|
|
return;
|
|
else
|
|
{
|
|
int i;
|
|
for( i = 0; i < m_iLightNum; i++ )
|
|
{
|
|
if(m_pPickLight == (&m_lstLight[i]))
|
|
{
|
|
m_lstLight.erase(&(m_lstLight[i]));
|
|
m_iLightNum--;
|
|
m_pPickLight = NULL;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
void RBspScene::RBspLeafEx::DeletePickTrigger()
|
|
{
|
|
if(m_pPickTrigger == NULL)
|
|
return;
|
|
else
|
|
{
|
|
int i;
|
|
for( i = 0 ; i < m_iTriggerNum; i++ )
|
|
{
|
|
if(m_pPickTrigger == (&m_lstTrigger[i]))
|
|
{
|
|
m_lstTrigger.erase(&(m_lstTrigger[i]));
|
|
m_iTriggerNum--;
|
|
m_pPickTrigger = NULL;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
void RBspScene::RBspLeafEx::DeletePickR3SObject()
|
|
{
|
|
if(m_pPickR3SObject == NULL)
|
|
return;
|
|
else
|
|
{
|
|
int i;
|
|
for( i = 0; i < m_iR3SObjectNum; i++ )
|
|
{
|
|
if(m_pPickR3SObject == m_lstR3SObject[i])
|
|
{
|
|
delete (m_lstR3SObject[i]);
|
|
m_lstR3SObject[i] = NULL;
|
|
m_lstR3SObject.erase(&(m_lstR3SObject[i]));
|
|
m_iR3SObjectNum--;
|
|
return;
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
void RBspScene::RBspLeafEx::DeleteEventSound(D3DXVECTOR3 vecCenter)
|
|
{
|
|
int i;
|
|
for( i = 0; i < m_iEventNum[ RBSPEVENT_SOUND ]; i++)
|
|
{
|
|
|
|
if(((vecCenter.x - m_lstSound[i]->m_vecCenter.x) +
|
|
(vecCenter.y - m_lstSound[i]->m_vecCenter.y) +
|
|
(vecCenter.z - m_lstSound[i]->m_vecCenter.z)) < RBSPEPS)
|
|
{
|
|
delete m_lstSound[i];
|
|
m_lstSound.erase(&(m_lstSound[i]));
|
|
m_iEventNum[ RBSPEVENT_SOUND ]--;
|
|
return;
|
|
|
|
}
|
|
}
|
|
}
|
|
void RBspScene::RBspLeafEx::MoveEventSound(D3DXVECTOR3 vecCenter,D3DXVECTOR3 vecEndPos)
|
|
{
|
|
int i;
|
|
for( i = 0; i < m_iEventNum[ RBSPEVENT_SOUND ]; i++ )
|
|
{
|
|
if(((vecCenter.x - m_lstSound[i]->m_vecCenter.x) +
|
|
(vecCenter.y - m_lstSound[i]->m_vecCenter.y) +
|
|
(vecCenter.z - m_lstSound[i]->m_vecCenter.z)) < RBSPEPS)
|
|
{
|
|
m_lstSound[i]->m_vecCenter = vecEndPos;
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
}
|
|
// R3S Object Input
|
|
int RBspScene::RBspLeafEx::InputR3SObject(float fX,float fY,float fZ,char *strName,matrix matTm,bool bAlpha,bool bLight)
|
|
{
|
|
RBspR3S *pNode = new RBspR3S;
|
|
pNode->m_vecPos = vector3(fX,fY,fZ);
|
|
strcpy((pNode->m_strName),strName);
|
|
pNode->m_matTm = matTm;
|
|
pNode->m_bAlpha = bAlpha;
|
|
pNode->m_bLight = bLight;
|
|
|
|
m_lstR3SObject.push_back(pNode);
|
|
m_iR3SObjectNum++;
|
|
|
|
return m_iR3SObjectNum;
|
|
|
|
}
|
|
int RBspScene::RBspLeafEx::InputEventEffect(char *strName,D3DXVECTOR3 vecCenter,float fDelay)
|
|
{
|
|
// Local transform
|
|
/* D3DXVECTOR3 vecLocalPos = vecCenter;
|
|
D3DXMATRIX matTmp;
|
|
D3DXMATRIX matInv;
|
|
|
|
D3DXMatrixIdentity(&matTmp);
|
|
|
|
matTmp._41 = CSceneManager::m_RBspSceneManager.m_pCurrentBspScene->m_vecZeroPos.x;
|
|
matTmp._42 = CSceneManager::m_RBspSceneManager.m_pCurrentBspScene->m_vecZeroPos.y;
|
|
matTmp._43 = CSceneManager::m_RBspSceneManager.m_pCurrentBspScene->m_vecZeroPos.z;
|
|
D3DXMatrixInverse(&matInv,NULL,&matTmp);
|
|
D3DXMatrixIdentity(&matTmp);
|
|
matTmp._41 = vecCenter.x;
|
|
matTmp._42 = vecCenter.y;
|
|
matTmp._43 = vecCenter.z;
|
|
D3DXMatrixMultiply(&matTmp,&matTmp,&matInv);
|
|
vecLocalPos.x = matTmp._41;
|
|
vecLocalPos.y = matTmp._42;
|
|
vecLocalPos.z = matTmp._43;
|
|
|
|
vecCenter = vecLocalPos;
|
|
*/ //
|
|
|
|
m_iEventNum[ RBSPEVENT_EFFECT]++;
|
|
RBspEventEffect *pNode = new RBspEventEffect;
|
|
strncpy(pNode->m_strName,strName,sizeof(char) * (RBSPBUF_SIZE - 1));
|
|
pNode->m_fDelay = fDelay;
|
|
pNode->m_vecCenter = vecCenter;
|
|
m_lstEffect.push_back(pNode);
|
|
|
|
return m_iEventNum[ RBSPEVENT_EFFECT];
|
|
|
|
}
|
|
void RBspScene::RBspLeafEx::DeleteEventEffect(D3DXVECTOR3 vecCenter)
|
|
{
|
|
int i;
|
|
for( i = 0; i < m_iEventNum[ RBSPEVENT_EFFECT ]; i++)
|
|
{
|
|
|
|
if(((vecCenter.x - m_lstEffect[i]->m_vecCenter.x) +
|
|
(vecCenter.y - m_lstEffect[i]->m_vecCenter.y) +
|
|
(vecCenter.z - m_lstEffect[i]->m_vecCenter.z)) < RBSPEPS)
|
|
{
|
|
delete m_lstEffect[i];
|
|
m_lstEffect.erase(&(m_lstEffect[i]));
|
|
m_iEventNum[ RBSPEVENT_EFFECT ]--;
|
|
return;
|
|
|
|
}
|
|
}
|
|
}
|
|
void RBspScene::RBspLeafEx::MoveEventEffect(D3DXVECTOR3 vecCenter,D3DXVECTOR3 vecEndPos)
|
|
{
|
|
int i;
|
|
for( i = 0; i < m_iEventNum[ RBSPEVENT_EFFECT ]; i++ )
|
|
{
|
|
if(((vecCenter.x - m_lstEffect[i]->m_vecCenter.x) +
|
|
(vecCenter.y - m_lstEffect[i]->m_vecCenter.y) +
|
|
(vecCenter.z - m_lstEffect[i]->m_vecCenter.z)) < RBSPEPS)
|
|
{
|
|
m_lstEffect[i]->m_vecCenter = vecEndPos;
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
int RBspScene::RBspLeafEx::InputEventObject(RAniObject *pObject,int iLoop,float fDelay)
|
|
{
|
|
m_iEventNum[ RBSPEVENT_OBJECTANI]++;
|
|
RBspEventObject *pNode = new RBspEventObject;
|
|
pNode->m_fDelay = fDelay;
|
|
pNode->m_iLoopNum = iLoop;
|
|
pNode->m_lstAniObject.push_back(pObject);
|
|
m_lstObject.push_back(pNode);
|
|
|
|
return m_iEventNum[ RBSPEVENT_OBJECTANI];
|
|
|
|
}
|
|
void RBspScene::RBspLeafEx::DeleteEventObject(RAniObject *pObject)
|
|
{
|
|
int i;
|
|
for( i = 0; i < m_iEventNum[ RBSPEVENT_OBJECTANI]; i++ )
|
|
{
|
|
if(m_lstObject[i]->m_lstAniObject[0] == pObject)
|
|
{
|
|
delete m_lstObject[i];
|
|
m_lstObject.erase(&(m_lstObject[i]));
|
|
m_iEventNum[ RBSPEVENT_OBJECTANI]--;
|
|
return;
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
void RBspScene::RBspLeafEx::MoveEventObject(RAniObject *pObject,D3DXVECTOR3 vecLocalMove) // 상대적인 이동값
|
|
{
|
|
int i;
|
|
for( i = 0; i < m_iEventNum[ RBSPEVENT_OBJECTANI]; i++ )
|
|
{
|
|
if(m_lstObject[i]->m_lstAniObject[0] == pObject)
|
|
{
|
|
// RAniObject 객체 move
|
|
// m_lstObject[i]->m_lstAniObject[0]->Move(vecLocalMove);
|
|
return;
|
|
|
|
}
|
|
}
|
|
}
|
|
void RBspScene::RBspLeafEx::DeleteEventEffect(RBspEventEffect *pEffect)
|
|
{
|
|
int i;
|
|
for( i = 0; i < m_iEventNum[ RBSPEVENT_EFFECT ]; i++ )
|
|
{
|
|
if(m_lstEffect[i] == pEffect)
|
|
{
|
|
delete m_lstEffect[i];
|
|
m_lstEffect[i] = NULL;
|
|
m_lstEffect.erase(&(m_lstEffect[i]));
|
|
m_iEventNum[ RBSPEVENT_EFFECT ]--;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
void RBspScene::RBspLeafEx::DeleteEventSound(RBspEventSound *pSound)
|
|
{
|
|
int i;
|
|
for( i = 0; i < m_iEventNum[ RBSPEVENT_SOUND ]; i++ )
|
|
{
|
|
if(m_lstSound[i] == pSound)
|
|
{
|
|
delete m_lstSound[i];
|
|
m_lstSound[i] = NULL;
|
|
m_lstSound.erase(&(m_lstSound[i]));
|
|
m_iEventNum[ RBSPEVENT_SOUND ]--;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
void RBspScene::RBspLeafEx::DeleteEventObject(RBspEventObject *pObject)
|
|
{
|
|
int i;
|
|
for( i = 0; i < m_iEventNum[ RBSPEVENT_OBJECTANI ]; i++ )
|
|
{
|
|
delete m_lstObject[i];
|
|
m_lstObject[i] = NULL;
|
|
m_lstObject.erase(&(m_lstObject[i]));
|
|
m_iEventNum[ RBSPEVENT_OBJECTANI ]--;
|
|
break;
|
|
|
|
}
|
|
}
|
|
|
|
// Picking
|
|
void RBspScene::RBspLeafEx::PickR3SObject(D3DXVECTOR3 vecPos)
|
|
{
|
|
int i;
|
|
float fMinLength = 0.0f;
|
|
int iPickIndex = -1;
|
|
|
|
for( i = 0; i < m_iR3SObjectNum; i++ )
|
|
{
|
|
D3DXVECTOR3 vecObject = D3DXVECTOR3(m_lstR3SObject[i]->m_vecPos.x,m_lstR3SObject[i]->m_vecPos.y,m_lstR3SObject[i]->m_vecPos.z);
|
|
|
|
D3DXVECTOR3 vecTmp = vecObject - vecPos;
|
|
float fTmp = D3DXVec3Length(&vecTmp);
|
|
if(i == 0)
|
|
{
|
|
fMinLength = fTmp;
|
|
iPickIndex = i;
|
|
}
|
|
else if(fMinLength > fTmp)
|
|
{
|
|
fMinLength = fTmp;
|
|
iPickIndex = i;
|
|
}
|
|
}
|
|
if(iPickIndex == -1)
|
|
m_pPickR3SObject = NULL;
|
|
else
|
|
{
|
|
m_pPickR3SObject = m_lstR3SObject[iPickIndex];
|
|
m_lstR3SObject[iPickIndex]->m_iPickState = RBSPPICK_PICKED;
|
|
}
|
|
}
|
|
void RBspScene::RBspLeafEx::PickLight(D3DXVECTOR3 vecPos)
|
|
{
|
|
int i;
|
|
float fMinLength = 0.0f;
|
|
int iPickIndex = -1;
|
|
|
|
for( i = 0; i < m_iLightNum; i++ )
|
|
{
|
|
D3DXVECTOR3 vecTmp = m_lstLight[i].m_vecLight - vecPos;
|
|
float fTmp = D3DXVec3Length(&vecTmp);
|
|
if(i == 0)
|
|
{
|
|
fMinLength = fTmp;
|
|
iPickIndex = i;
|
|
}
|
|
else if(fMinLength > fTmp)
|
|
{
|
|
fMinLength = fTmp;
|
|
iPickIndex = i;
|
|
}
|
|
}
|
|
if(iPickIndex == -1)
|
|
m_pPickLight = NULL;
|
|
else
|
|
{
|
|
m_pPickLight = &m_lstLight[iPickIndex];
|
|
m_pPickLight->m_iPickState = RBSPPICK_PICKED;
|
|
}
|
|
}
|
|
void RBspScene::RBspLeafEx::PickTrigger(D3DXVECTOR3 vecPos)
|
|
{
|
|
int i;
|
|
float fMinLength = 0.0f;
|
|
int iPickIndex = -1;
|
|
for( i = 0; i < m_iTriggerNum; i++ )
|
|
{
|
|
D3DXVECTOR3 vecTmp = m_lstTrigger[i].m_vecCenter - vecPos;
|
|
float fTmp = D3DXVec3Length(&vecTmp);
|
|
if(i == 0)
|
|
{
|
|
fMinLength = fTmp;
|
|
iPickIndex = i;
|
|
}
|
|
else if(fMinLength > fTmp)
|
|
{
|
|
fMinLength = fTmp;
|
|
iPickIndex = i;
|
|
}
|
|
}
|
|
if(iPickIndex == -1)
|
|
m_pPickTrigger = NULL;
|
|
else
|
|
{
|
|
m_pPickTrigger = &m_lstTrigger[iPickIndex];
|
|
m_pPickTrigger->m_iPickState = RBSPPICK_PICKED;
|
|
}
|
|
}
|
|
void RBspScene::RBspLeafEx::PickEventEffect(D3DXVECTOR3 vecPos)
|
|
{
|
|
int i;
|
|
float fMinLength = 0.0f;
|
|
int iPickIndex = -1;
|
|
for( i = 0; i < m_iEventNum[ RBSPEVENT_EFFECT ]; i++)
|
|
{
|
|
D3DXVECTOR3 vecTmp = m_lstEffect[i]->m_vecCenter - vecPos;
|
|
float fTmp = D3DXVec3Length(&vecTmp);
|
|
if( i == 0 )
|
|
{
|
|
fMinLength = fTmp;
|
|
iPickIndex = i;
|
|
}
|
|
else if(fMinLength > fTmp)
|
|
{
|
|
fMinLength = fTmp;
|
|
iPickIndex = i;
|
|
}
|
|
}
|
|
if(iPickIndex == -1)
|
|
m_pPickEventEffect = NULL;
|
|
else
|
|
{
|
|
m_pPickEventEffect = m_lstEffect[iPickIndex];
|
|
m_pPickEventEffect->m_iPickState = RBSPPICK_PICKED;
|
|
|
|
}
|
|
}
|
|
void RBspScene::RBspLeafEx::PickEventSound(D3DXVECTOR3 vecPos)
|
|
{
|
|
int i;
|
|
float fMinLength = 0.0f;
|
|
int iPickIndex = -1;
|
|
for( i = 0; i < m_iEventNum[ RBSPEVENT_SOUND ]; i++ )
|
|
{
|
|
D3DXVECTOR3 vecTmp = m_lstSound[i]->m_vecCenter - vecPos;
|
|
float fTmp = D3DXVec3Length(&vecTmp);
|
|
if( i == 0 )
|
|
{
|
|
fMinLength = fTmp;
|
|
iPickIndex = i;
|
|
}
|
|
else if( fMinLength > fTmp)
|
|
{
|
|
fMinLength = fTmp;
|
|
iPickIndex = i;
|
|
}
|
|
}
|
|
if(iPickIndex == -1)
|
|
m_pPickEventSound = NULL;
|
|
else
|
|
{
|
|
m_pPickEventSound = m_lstSound[iPickIndex];
|
|
m_pPickEventSound->m_iPickState = RBSPPICK_PICKED;
|
|
}
|
|
}
|
|
void RBspScene::RBspLeafEx::PickEventObject(D3DXVECTOR3 vecPos)
|
|
{
|
|
int i;
|
|
float fMinLength = 0.0f;
|
|
int iPickIndex = -1;
|
|
|
|
for( i = 0; i < m_iEventNum[ RBSPEVENT_OBJECTANI ]; i++ )
|
|
{
|
|
D3DXVECTOR3 vecTmp = m_lstObject[i]->m_vecCenter - vecPos;
|
|
float fTmp = D3DXVec3Length(&vecTmp);
|
|
if( i == 0 )
|
|
{
|
|
fMinLength = fTmp;
|
|
iPickIndex = i;
|
|
}
|
|
else if( fMinLength > fTmp)
|
|
{
|
|
fMinLength = fTmp;
|
|
iPickIndex = i;
|
|
|
|
}
|
|
}
|
|
if(iPickIndex == -1)
|
|
m_pPickEventObject = NULL;
|
|
else
|
|
{
|
|
m_pPickEventObject = m_lstObject[iPickIndex];
|
|
m_pPickEventObject->m_iPickState = RBSPPICK_PICKED;
|
|
}
|
|
|
|
}
|
|
|
|
void RBspScene::RBspLeafEx::UnPickLight()
|
|
{
|
|
int i;
|
|
m_pPickLight = NULL;
|
|
for( i = 0; i < m_iLightNum; i++ )
|
|
{
|
|
m_lstLight[i].m_iPickState = RBSPPICK_READY;
|
|
}
|
|
}
|
|
void RBspScene::RBspLeafEx::UnPickTrigger()
|
|
{
|
|
int i;
|
|
m_pPickTrigger = NULL;
|
|
for( i = 0; i < m_iTriggerNum; i++ )
|
|
{
|
|
m_lstTrigger[i].m_iPickState = RBSPPICK_READY;
|
|
}
|
|
}
|
|
void RBspScene::RBspLeafEx::UnPickEventEffect()
|
|
{
|
|
int i;
|
|
m_pPickEventEffect = NULL;
|
|
for( i = 0; i < m_iEventNum[RBSPEVENT_EFFECT]; i++ )
|
|
{
|
|
m_lstEffect[i]->m_iPickState = RBSPPICK_READY;
|
|
}
|
|
}
|
|
void RBspScene::RBspLeafEx::UnPickEventSound()
|
|
{
|
|
int i;
|
|
m_pPickEventObject = NULL;
|
|
for( i = 0; i < m_iEventNum[RBSPEVENT_SOUND]; i++ )
|
|
{
|
|
m_lstSound[i]->m_iPickState = RBSPPICK_READY;
|
|
}
|
|
}
|
|
void RBspScene::RBspLeafEx::UnPickEventObject()
|
|
{
|
|
int i;
|
|
m_pPickEventObject = NULL;
|
|
for( i = 0; i < m_iEventNum[RBSPEVENT_OBJECTANI]; i++ )
|
|
{
|
|
m_lstObject[i]->m_iPickState = RBSPPICK_READY;
|
|
}
|
|
}
|
|
|
|
void RBspScene::RBspLeafEx::UnPickR3SObject()
|
|
{
|
|
int i;
|
|
m_pPickR3SObject = NULL;
|
|
|
|
|
|
for( i = 0; i < m_iR3SObjectNum; i++ )
|
|
{
|
|
m_lstR3SObject[i]->m_iPickState = RBSPPICK_READY;
|
|
}
|
|
}
|
|
void RBspScene::RBspLeafEx::MovePickLight(D3DXVECTOR3 vecNewPos)
|
|
{
|
|
if(m_pPickLight != NULL)
|
|
m_pPickLight->m_vecLight = vecNewPos;
|
|
|
|
}
|
|
void RBspScene::RBspLeafEx::MovePickTrigger(D3DXVECTOR3 vecNewPos)
|
|
{
|
|
if(m_pPickTrigger != NULL)
|
|
m_pPickTrigger->m_vecCenter = vecNewPos;
|
|
|
|
}
|
|
void RBspScene::RBspLeafEx::PickTriggerEdit(D3DXVECTOR3 vecCenter,int iTriggerValue,D3DXVECTOR3 vecTrigger[2])
|
|
{
|
|
if(m_pPickTrigger != NULL)
|
|
{
|
|
m_pPickTrigger->m_vecCenter = vecCenter;
|
|
m_pPickTrigger->m_iTriggerValue = iTriggerValue;
|
|
m_pPickTrigger->m_vecTrigger[0] = vecTrigger[0];
|
|
m_pPickTrigger->m_vecTrigger[1] = vecTrigger[1];
|
|
}
|
|
}
|
|
void RBspScene::RBspLeafEx::MovePickEventEffect(D3DXVECTOR3 vecNewPos)
|
|
{
|
|
if(m_pPickEventEffect != NULL)
|
|
m_pPickEventEffect->m_vecCenter = vecNewPos;
|
|
|
|
}
|
|
void RBspScene::RBspLeafEx::MovePickEvnetSound(D3DXVECTOR3 vecNewPos)
|
|
{
|
|
if(m_pPickEventSound != NULL)
|
|
m_pPickEventSound->m_vecCenter = vecNewPos;
|
|
|
|
}
|
|
void RBspScene::RBspLeafEx::MovePickEvnetObject(D3DXVECTOR3 vecNewPos)
|
|
{
|
|
if(m_pPickEventObject != NULL)
|
|
m_pPickEventObject->m_vecCenter = vecNewPos;
|
|
|
|
}
|
|
// Trigger
|
|
void RBspScene::RBspLeafEx::CreateEmptyTrigger(D3DXVECTOR3 vecCenter,int iTriggerValue,D3DXVECTOR3 vecTrigger[2])
|
|
{
|
|
RBspTrigger Node;
|
|
|
|
Node.m_vecCenter = vecCenter; // Trigger Center
|
|
Node.m_iTriggerValue = iTriggerValue; // Trigger 종류 ( 0 : Sphere, 1 : Box )
|
|
Node.m_vecTrigger[0] = vecTrigger[0]; // Trigger 종류에 따른 경계값
|
|
Node.m_vecTrigger[1] = vecTrigger[1]; // (Sphere : 0 -> Center, 1 -> Range )
|
|
// (Box : 0 -> Center, 1 -> Min, Max Value)
|
|
|
|
m_lstTrigger.push_back(Node);
|
|
m_iTriggerNum++;
|
|
|
|
m_pPickTrigger = &(m_lstTrigger[m_iTriggerNum - 1]); // 추가된후에 Pick Trigger로 세팅하여 다음작업 수행가능하게.
|
|
|
|
}
|
|
void RBspScene::RBspLeafEx::PickTriggerInputEffect(RBspEventEffect *pEffect)
|
|
{
|
|
if(m_pPickTrigger == NULL || pEffect == NULL)
|
|
return;
|
|
|
|
m_pPickTrigger->InputEventEffect(pEffect);
|
|
// Link 표시
|
|
pEffect->m_bLinked = true;
|
|
|
|
}
|
|
void RBspScene::RBspLeafEx::PickTriggerInputObject(RBspEventObject *pObject)
|
|
{
|
|
if(m_pPickTrigger == NULL || pObject == NULL)
|
|
return;
|
|
m_pPickTrigger->InputEventObject(pObject);
|
|
// Link 표시
|
|
pObject->m_bLinked = true;
|
|
}
|
|
void RBspScene::RBspLeafEx::PickTriggerInputSound(RBspEventSound *pSound)
|
|
{
|
|
if(m_pPickTrigger == NULL || pSound == NULL)
|
|
return;
|
|
m_pPickTrigger->InputEventSound(pSound);
|
|
// Link 표시
|
|
pSound->m_bLinked = true;
|
|
}
|
|
|
|
//
|
|
/*
|
|
void RBspScene::RBspLight::InputShadowVolume(RShadowVolumeObject Object)
|
|
{
|
|
if(!m_bShadowVolume)
|
|
CreateShadowVolume();
|
|
|
|
RShadowVolumeEdge *pEdges = new RShadowVolumeEdge;
|
|
pEdges->CreateEdgeFromObject(D3DXVECTOR3(0.0f,1.0f,0.0f),&Object,2);
|
|
m_pShadowVolume->InputVolume(pEdges);
|
|
}*/
|
|
void RBspScene::RBspLight::RenderShadowVolume()
|
|
{
|
|
if(!m_bShadowVolume)
|
|
return;
|
|
if(m_pShadowVolume == NULL)
|
|
{
|
|
m_bShadowVolume = false;
|
|
return;
|
|
}
|
|
// Render Stencil Buffer( 화면에 Masking 마지막에 한번 해준다)
|
|
// m_pShadowVolume->RenderStencil();
|
|
|
|
}
|
|
void RBspScene::RBspLight::InputShadowMap()
|
|
{
|
|
|
|
}
|
|
|
|
int RBspScene::RBspTrigger::InputEventEffect(RBspEventEffect *pEffect)
|
|
{
|
|
m_iEventNum[RBSPEVENT_EFFECT]++;
|
|
m_lstEffect.push_back(pEffect);
|
|
return m_iEventNum[RBSPEVENT_EFFECT];
|
|
|
|
}
|
|
|
|
int RBspScene::RBspTrigger::InputEventSound(RBspEventSound *pSound)
|
|
{
|
|
m_iEventNum[RBSPEVENT_SOUND]++;
|
|
m_lstSound.push_back(pSound);
|
|
return m_iEventNum[RBSPEVENT_SOUND];
|
|
|
|
}
|
|
|
|
int RBspScene::RBspTrigger::InputEventObject(RBspEventObject *pObject)
|
|
{
|
|
m_iEventNum[ RBSPEVENT_OBJECTANI ]++;
|
|
m_lstObject.push_back(pObject);
|
|
return m_iEventNum[ RBSPEVENT_OBJECTANI];
|
|
|
|
}
|
|
// vecPos가 trigger 안에 있다면 true return
|
|
bool RBspScene::RBspTrigger::CheckInTrigger(D3DXVECTOR3 vecPos)
|
|
{
|
|
|
|
vecPos -= m_vecCenter;
|
|
|
|
if(m_iTriggerValue == RBSPTRIGGER_SPHERE) // Sphere
|
|
{
|
|
D3DXVECTOR3 vecTmp = vecPos - m_vecTrigger[0]; // m_vecTrigger[0] : Sphere Center Pos
|
|
float fRange = D3DXVec3Length(&vecTmp);
|
|
if(fRange <= m_vecTrigger[1].x) { // m_vecTrigger[1].x == m_vecTrigger[1].y == m_vecTrigger[1].z == Sphere Radius
|
|
m_bPlay = true;
|
|
Play();
|
|
return true;
|
|
}
|
|
}
|
|
else if(m_iTriggerValue == RBSPTRIGGER_BOX) // Box
|
|
{ // m_vecTrigger[0] : Min Box, m_vecTrigger[1] : Max Box
|
|
if((vecPos.x >= m_vecTrigger[0].x) && (vecPos.y >= m_vecTrigger[0].y) && (vecPos.z >= m_vecTrigger[0].z) &&
|
|
(vecPos.x <= m_vecTrigger[1].x) && (vecPos.y <= m_vecTrigger[1].y) && (vecPos.z <= m_vecTrigger[1].z))
|
|
{
|
|
m_bPlay = true;
|
|
Play();
|
|
return true;
|
|
}
|
|
}
|
|
m_bPlay = false;
|
|
return false;
|
|
}
|
|
// Trigger 동작시에 트리거에 연결된 Event들 동작 func
|
|
// Delay나 다른 세부 동작제어는 각기의 event class 내부에서 이루어진다.
|
|
void RBspScene::RBspTrigger::Play()
|
|
{
|
|
if(m_bPlay == true)
|
|
{
|
|
int i;
|
|
for( i = 0; i < m_iEventNum[RBSPEVENT_EFFECT]; i++) { // Effect
|
|
m_lstEffect[i]->Play();
|
|
}
|
|
for( i = 0; i < m_iEventNum[RBSPEVENT_SOUND]; i++) { // Sound
|
|
m_lstSound[i]->Play();
|
|
}
|
|
for( i = 0; i < m_iEventNum[RBSPEVENT_OBJECTANI]; i++) {// Object Ani
|
|
m_lstObject[i]->Play();
|
|
}
|
|
}
|
|
}
|
|
void RBspScene::RBspEventEffect::Play() // Effect Play Func
|
|
{
|
|
if(m_bPlay == false)
|
|
{
|
|
m_bPlay = true;
|
|
m_dwStartTime = timeGetTime();
|
|
}
|
|
else{ // start 된뒤
|
|
m_dwCurrentTime = timeGetTime();
|
|
if((m_dwCurrentTime - m_dwStartTime) / 30 > (DWORD)m_fDelay)
|
|
Start();
|
|
|
|
}
|
|
}
|
|
void RBspScene::RBspEventObject::Play() // Ani Object Play Func
|
|
{
|
|
if(m_bPlay == false)
|
|
{
|
|
m_bPlay = true;
|
|
m_dwStartTime = timeGetTime();
|
|
}
|
|
else{
|
|
m_dwCurrentTime = timeGetTime();
|
|
if((m_dwCurrentTime - m_dwStartTime) / 30 > (DWORD)m_fDelay)
|
|
Start();
|
|
|
|
}
|
|
}
|
|
void RBspScene::RBspEventSound::Play() // Sound Play Func
|
|
{
|
|
if(m_bPlay == false)
|
|
{
|
|
m_bPlay = true;
|
|
m_dwStartTime = timeGetTime();
|
|
}
|
|
else{
|
|
m_dwCurrentTime = timeGetTime();
|
|
if((m_dwCurrentTime - m_dwStartTime) / 30 > (DWORD)m_fDelay)
|
|
Start();
|
|
|
|
}
|
|
}
|
|
|
|
void RBspScene::RBspEventEffect::Start() //실제적인 작동
|
|
{
|
|
m_bStart = true;
|
|
|
|
}
|
|
void RBspScene::RBspEventObject::Start() //실제적인 작동
|
|
{
|
|
m_bStart = true;
|
|
}
|
|
void RBspScene::RBspEventSound::Start() //실제적인 작동
|
|
{
|
|
m_bStart = true;
|
|
}
|
|
void RBspScene::UpdateLeafBox(float x,float y,float z)
|
|
{
|
|
int i;
|
|
for( i = 0; i < m_iLeafsNum; i++)
|
|
{
|
|
m_pLeafExs[i].m_vecMinBox[0] += x;
|
|
m_pLeafExs[i].m_vecMinBox[1] += y;
|
|
m_pLeafExs[i].m_vecMinBox[2] += z;
|
|
// Max
|
|
m_pLeafExs[i].m_vecMaxBox[0] += x;
|
|
m_pLeafExs[i].m_vecMaxBox[1] += y;
|
|
m_pLeafExs[i].m_vecMaxBox[2] += z;
|
|
}
|
|
|
|
}
|
|
void RBspScene::SetZeroPosition(float x,float y,float z)
|
|
{
|
|
int i;
|
|
m_vecZeroPos = vector3(x,y,z);
|
|
m_bVisible = true;
|
|
for( i = 0; i < m_iLeafsNum; i++)
|
|
{
|
|
D3DXMATRIX box;
|
|
D3DXMATRIX axis;
|
|
// Min
|
|
D3DXMatrixIdentity(&box);
|
|
D3DXMatrixIdentity(&axis);
|
|
|
|
axis._41 = m_vecZeroPos.x;
|
|
axis._42 = m_vecZeroPos.y;
|
|
axis._43 = m_vecZeroPos.z;
|
|
|
|
box._41 = m_pLeafExs[i].m_vecMinBox[0];
|
|
box._42 = m_pLeafExs[i].m_vecMinBox[1];
|
|
box._43 = m_pLeafExs[i].m_vecMinBox[2];
|
|
|
|
D3DXMatrixMultiply(&box,&box,&axis);
|
|
|
|
m_pLeafExs[i].m_vecMinBox[0] = box._41;
|
|
m_pLeafExs[i].m_vecMinBox[1] = box._42;
|
|
m_pLeafExs[i].m_vecMinBox[2] = box._43;
|
|
// Max
|
|
D3DXMatrixIdentity(&box);
|
|
|
|
box._41 = m_pLeafExs[i].m_vecMaxBox[0];
|
|
box._42 = m_pLeafExs[i].m_vecMaxBox[1];
|
|
box._43 = m_pLeafExs[i].m_vecMaxBox[2];
|
|
|
|
D3DXMatrixMultiply(&box,&box,&axis);
|
|
|
|
m_pLeafExs[i].m_vecMaxBox[0] = box._41;
|
|
m_pLeafExs[i].m_vecMaxBox[1] = box._42;
|
|
m_pLeafExs[i].m_vecMaxBox[2] = box._43;
|
|
}
|
|
|
|
}
|
|
void RBspScene::RenderBox(vector3 vecAxis,vector3 vecScale,bool bTarget)
|
|
{
|
|
|
|
D3DXMATRIX identity;
|
|
D3DXMatrixIdentity(&identity);
|
|
identity._41 = vecAxis.x;
|
|
identity._42 = vecAxis.y;
|
|
identity._43 = vecAxis.z;
|
|
|
|
identity._11 = vecScale.x;
|
|
identity._22 = vecScale.y;
|
|
identity._33 = vecScale.z;
|
|
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_LIGHTING,FALSE);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,FALSE);
|
|
if(bTarget == false)
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_TEXTUREFACTOR,0xff0000ff);
|
|
else
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_TEXTUREFACTOR,0xffffff00);
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
|
|
CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TFACTOR);
|
|
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TFACTOR );
|
|
CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
|
|
|
|
m_D3Device->SetTransform(D3DTS_WORLD,&identity);
|
|
m_D3Device->SetVertexShader(D3DFVF_XYZ);
|
|
|
|
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);
|
|
m_D3Device->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST,
|
|
0,8,12,g_vecCubeIndex,D3DFMT_INDEX16,g_vecCube,sizeof(D3DXVECTOR3));
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
|
|
}
|
|
void RBspScene::RenderScene(bool bBspIn,bool bTarget)
|
|
{
|
|
|
|
if(m_bVisible)
|
|
{
|
|
if(bBspIn)
|
|
{
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,FALSE);
|
|
|
|
D3DXMATRIX identity;
|
|
D3DXMatrixIdentity(&identity);
|
|
identity._41 = m_vecZeroPos.x;
|
|
identity._42 = m_vecZeroPos.y;
|
|
identity._43 = m_vecZeroPos.z;
|
|
/*
|
|
identity._11 = vecScale.x;
|
|
identity._22 = vecScale.y;
|
|
identity._33 = vecScale.z;
|
|
*/
|
|
m_D3Device->SetTransform(D3DTS_WORLD,&identity);
|
|
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
|
|
CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE);
|
|
CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_COLORARG2, D3DTA_CURRENT);
|
|
CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE);
|
|
/*
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);
|
|
|
|
CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP);
|
|
CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP);
|
|
*/
|
|
|
|
RenderBspScene();
|
|
}
|
|
else // 내부에 있는 bsp가 아니다
|
|
{
|
|
SetBox(D3DXVECTOR3(-50.0f,-50.0f,-50.0f),D3DXVECTOR3(50.0f,50.0f,50.0f));
|
|
//상자표시
|
|
RenderBox(m_vecZeroPos,vector3(10.0f,10.0f,10.0f),bTarget);
|
|
}
|
|
}
|
|
}
|
|
bool RBspScene::LoadBseScene(const char *strFilename,float fx,float fy,float fz) // Read Bsp Extension File
|
|
{
|
|
int i,j;
|
|
|
|
SetBspScale(fx,fy,fz);
|
|
|
|
char strBuf[RBSPBUF_SIZE] = {0};
|
|
FILE *fp = NULL;
|
|
fp = fopen(strFilename,"rb");
|
|
if(fp == NULL)
|
|
{
|
|
MessageBox(NULL,"File Load Failed",strFilename,MB_OK);
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
fread((char *)strBuf,sizeof(char) * RBSPBUF_SIZE,1,fp);
|
|
if(strcmp(strBuf,"BseFile"))
|
|
{
|
|
fclose(fp);
|
|
MessageBox(NULL,"Not Bse File",strBuf,MB_OK);
|
|
return false;
|
|
|
|
}
|
|
else
|
|
strcpy(m_strBspName,strFilename);
|
|
// Data Num Read
|
|
int arrNum[11];
|
|
fread((int *)arrNum,sizeof(int),11,fp);
|
|
|
|
m_iVertsNum = arrNum[0];
|
|
m_iFacesNum = arrNum[1];
|
|
m_iTextureDefsNum = arrNum[2];
|
|
m_iLightMapsNum = arrNum[3];
|
|
m_iNodesNum = arrNum[4];
|
|
m_iLeafsNum = arrNum[5];
|
|
m_iLeafFacesNum = arrNum[6];
|
|
m_iPlanesNum = arrNum[7];
|
|
m_iBrushesNum = arrNum[8];
|
|
m_iBrusheSidesNum = arrNum[9];
|
|
m_iLeafBrushesNum = arrNum[10];
|
|
|
|
m_pVerts = new RBspDrawVertex[m_iVertsNum];
|
|
m_pFaces = new RBspFace[m_iFacesNum];
|
|
m_pTextureDefs = new RBspTextureDef[ m_iTextureDefsNum ];
|
|
m_pLightMaps = new RBspLightMap[ m_iLightMapsNum ];
|
|
m_pLightTextures = new CTexture[ m_iLightMapsNum ];
|
|
m_pNodes = new RBspNode[ m_iNodesNum ];
|
|
m_pLeafExs = new RBspLeafEx[ m_iLeafsNum ];
|
|
|
|
m_pLeafFaces = new int[ m_iLeafFacesNum ];
|
|
m_pPlanes = new RBspPlane[ m_iPlanesNum ];
|
|
m_pTextures = new CTexture[ m_iTextureDefsNum ];
|
|
m_pBrushes = new RBspBrushe[ m_iBrushesNum ];
|
|
m_pBrusheSides = new RBspBrusheSide[ m_iBrusheSidesNum ];
|
|
m_pLeafBrushes = new int[ m_iLeafBrushesNum ];
|
|
|
|
// Base Texture Buffer Create
|
|
m_pBaseVertexBuffer = new LPDIRECT3DVERTEXBUFFER8[m_iTextureDefsNum];
|
|
//m_pLightVertexBuffer = new LPDIRECT3DVERTEXBUFFER8[m_iTextureDefsNum];
|
|
|
|
m_pBaseVertexNum = new int[m_iTextureDefsNum];
|
|
m_pBaseVertexUseNum = new int[m_iTextureDefsNum];
|
|
|
|
m_pBaseIndexBuffer = new LPDIRECT3DINDEXBUFFER8[m_iTextureDefsNum];
|
|
m_pBaseIndexNum = new int[m_iTextureDefsNum];
|
|
m_pBaseIndexUseNum = new int[m_iTextureDefsNum];
|
|
|
|
m_pLightUnit = new LightUnitType[m_iTextureDefsNum];
|
|
// Vis data Load
|
|
fread((int *)&(m_VisData.m_iBytesPerCluster),sizeof(int),1,fp);
|
|
fread((int *)&(m_VisData.m_iClustersNum),sizeof(int),1,fp);
|
|
int iAllocSize = 0;
|
|
fread((int *)&iAllocSize,sizeof(int),1,fp);
|
|
m_VisData.m_pBitsets = new byte[iAllocSize];
|
|
fread((byte *)m_VisData.m_pBitsets,sizeof(byte),iAllocSize,fp);
|
|
// face Read
|
|
fread((RBspFace *)m_pFaces,sizeof(RBspFace),m_iFacesNum,fp);
|
|
// Texture Define Read
|
|
fread((RBspTextureDef *)m_pTextureDefs,sizeof(RBspTextureDef),m_iTextureDefsNum,fp);
|
|
// LightMap Read
|
|
fread((RBspLightMap *)m_pLightMaps,sizeof(RBspLightMap),m_iLightMapsNum,fp);
|
|
////////////////////
|
|
for(i = 0; i < m_iTextureDefsNum; i++ )
|
|
{
|
|
m_pBaseVertexBuffer[i] = NULL;
|
|
//m_pLightVertexBuffer[i] = NULL;
|
|
m_pBaseVertexNum[i] = 0;
|
|
m_pBaseVertexUseNum[i] = 0;
|
|
m_pBaseIndexBuffer[i] = NULL;
|
|
m_pBaseIndexNum[i] = 0;
|
|
m_pBaseIndexUseNum[i] = 0;
|
|
|
|
char strTex[256] = {0};
|
|
strcpy(strTex,m_pTextureDefs[i].m_strName);
|
|
char *cptr = strrchr(strTex,'/');
|
|
if(cptr != NULL)
|
|
{
|
|
cptr++;
|
|
strcat(cptr,".dds");
|
|
CTexture::SetPath(BSPTEXTUREPATH);
|
|
m_pTextures[i].Load(cptr);
|
|
}
|
|
else
|
|
{
|
|
|
|
}
|
|
}
|
|
// LightMap Load
|
|
|
|
for( i = 0; i < m_iLightMapsNum; i++ )
|
|
{
|
|
|
|
byte m_ucLight[65536];
|
|
int icount = 0;
|
|
int icount2 = 0;
|
|
for(int j=0;j < 128;j++) {
|
|
for(int k=0;k < 128;k++) {
|
|
m_ucLight[icount2++] = m_pLightMaps[i].m_ucLightMap[icount+2]; //R
|
|
m_ucLight[icount2++] = m_pLightMaps[i].m_ucLightMap[icount+1]; //G
|
|
m_ucLight[icount2++] = m_pLightMaps[i].m_ucLightMap[icount]; //B
|
|
m_ucLight[icount2++] = 0;
|
|
icount +=3;
|
|
}
|
|
}
|
|
|
|
m_pLightTextures[i].CreateEmptyTexture(128,128,0,D3DFMT_X8R8G8B8,D3DPOOL_MANAGED);
|
|
|
|
//m_pLightTextures[i].FillTexture(m_pLightMaps[i].m_ucLightMap);
|
|
m_pLightTextures[i].FillTexture(m_ucLight);
|
|
}
|
|
////////////////////
|
|
|
|
// Node
|
|
fread((RBspNode *)m_pNodes,sizeof(RBspNode),m_iNodesNum,fp);
|
|
// LeafExs
|
|
for( i = 0; i < m_iLeafsNum; i++ )
|
|
{
|
|
m_pLeafExs[i].m_pPickEventEffect = NULL;
|
|
m_pLeafExs[i].m_pPickEventObject = NULL;
|
|
m_pLeafExs[i].m_pPickEventSound = NULL;
|
|
m_pLeafExs[i].m_pPickLight = NULL;
|
|
m_pLeafExs[i].m_pPickTrigger = NULL;
|
|
memset(m_pLeafExs[i].m_iEventNum,0,sizeof(int) * 10);
|
|
|
|
int iEventNum[10];
|
|
|
|
fread((int *)iEventNum,sizeof(int),10,fp);
|
|
int iArr[10];
|
|
fread((int *)iArr,sizeof(int),10,fp);
|
|
|
|
int iObjectAni = iEventNum[RBSPEVENT_OBJECTANI];
|
|
int iEffect = iEventNum[RBSPEVENT_EFFECT];
|
|
int iSound = iEventNum[RBSPEVENT_SOUND];
|
|
int iLight = iArr[0];
|
|
int iTrigger = iArr[1];
|
|
int iAniObject = iArr[2];
|
|
int iR3SObject = iArr[3];
|
|
|
|
|
|
for(j = 0; j < iObjectAni; j++)
|
|
{
|
|
|
|
}
|
|
for(j = 0; j < iEffect; j++)
|
|
{
|
|
RBspEventEffect pNode;
|
|
fread((RBspEventEffect *)&pNode,sizeof(RBspEventEffect),1,fp);
|
|
m_pLeafExs[i].InputEventEffect(pNode.m_strName,pNode.m_vecCenter,pNode.m_fDelay);
|
|
}
|
|
for( j = 0; j < iSound; j++)
|
|
{
|
|
RBspEventSound pNode;
|
|
fread((RBspEventSound *)&pNode,sizeof(RBspEventSound),1,fp);
|
|
m_pLeafExs[i].InputEventSound(pNode.m_strName,pNode.m_vecCenter,pNode.m_fDelay);
|
|
}
|
|
for( j = 0; j < iLight; j++)
|
|
{
|
|
RBspLight pNode;
|
|
fread((RBspLight *)&pNode,sizeof(RBspLight),1,fp);
|
|
|
|
m_pLeafExs[i].InputLight(pNode.m_iLightValue,pNode.m_vecLight,pNode.m_vecLightRange,(int)(pNode.m_fRed * 255.0f),(int)(pNode.m_fGreen * 255.0f),(int)(pNode.m_fBlue * 255.0f),false,false);
|
|
|
|
|
|
}
|
|
for( j = 0; j < iTrigger; j++ )
|
|
{
|
|
|
|
}
|
|
for( j = 0; j < iAniObject; j++ )
|
|
{
|
|
|
|
}
|
|
for( j = 0; j < iR3SObject; j++ )
|
|
{
|
|
RBspR3S pNode;
|
|
fread((RBspR3S *)&pNode,sizeof(RBspR3S),1,fp);
|
|
m_pLeafExs[i].InputR3SObject(pNode.m_vecPos.x,pNode.m_vecPos.y,pNode.m_vecPos.z,pNode.m_strName,pNode.m_matTm,pNode.m_bAlpha,pNode.m_bLight);
|
|
|
|
}
|
|
int iBspArr[12];
|
|
fread((int *)iBspArr,sizeof(int),12,fp);
|
|
|
|
m_pLeafExs[i].m_iAreaPotal = iBspArr[0];
|
|
m_pLeafExs[i].m_iCluster = iBspArr[1];
|
|
m_pLeafExs[i].m_iLeafBrush = iBspArr[2];
|
|
m_pLeafExs[i].m_iLeafBrushNum = iBspArr[3];
|
|
m_pLeafExs[i].m_iLeafFace = iBspArr[4];
|
|
m_pLeafExs[i].m_iLeafFaceNum = iBspArr[5];
|
|
m_pLeafExs[i].m_vecMaxBox[0] = iBspArr[6];
|
|
m_pLeafExs[i].m_vecMaxBox[1] = iBspArr[7];
|
|
m_pLeafExs[i].m_vecMaxBox[2] = iBspArr[8];
|
|
|
|
m_pLeafExs[i].m_vecMinBox[0] = iBspArr[9];
|
|
m_pLeafExs[i].m_vecMinBox[1] = iBspArr[10];
|
|
m_pLeafExs[i].m_vecMinBox[2] = iBspArr[11];
|
|
|
|
|
|
}
|
|
|
|
// Leaf Face
|
|
fread((int *)m_pLeafFaces,sizeof(int),m_iLeafFacesNum,fp);
|
|
// Leaf Brushes
|
|
fread((int *)m_pLeafBrushes,sizeof(int),m_iLeafBrushesNum,fp);
|
|
// Plane
|
|
fread((RBspPlane *)m_pPlanes,sizeof(RBspPlane),m_iPlanesNum,fp);
|
|
// Brushe
|
|
fread((RBspBrushe *)m_pBrushes,sizeof(RBspBrushe),m_iBrushesNum,fp);
|
|
// BrusheSide
|
|
fread((RBspBrusheSide *)m_pBrusheSides,sizeof(RBspBrusheSide),m_iBrusheSidesNum,fp);
|
|
|
|
// Vertex Write
|
|
fread((RBspDrawVertex *)m_pVerts,sizeof(RBspDrawVertex),m_iVertsNum,fp);
|
|
//Scale
|
|
fread((D3DXVECTOR3 *)&m_vecScale,sizeof(D3DXVECTOR3),1,fp);
|
|
// ZeroPos
|
|
fread((D3DXVECTOR3 *)&m_vecZeroPos,sizeof(D3DXVECTOR3),1,fp);
|
|
|
|
fclose(fp);
|
|
|
|
m_FaceRenderBit.ResizeBits(m_iFacesNum); // Face Render Bit Resize
|
|
// Memory pool Create
|
|
|
|
m_D3Device = CSceneManager::GetDevice();
|
|
|
|
CreateBufferNum();
|
|
CreateBuffer();
|
|
|
|
m_pFrustum = new CViewFrustum;
|
|
|
|
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
|
|
CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE);
|
|
CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_COLORARG2, D3DTA_CURRENT);
|
|
CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE);
|
|
|
|
CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP);
|
|
CSceneStateMgr::_SetD3DTextureStageState(1, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP);
|
|
|
|
}
|
|
return true;
|
|
|
|
}
|
|
bool RBspScene::SaveBseFile(char *strFilename)
|
|
{
|
|
int i,j;
|
|
char strBuf[RBSPBUF_SIZE] = {0};
|
|
|
|
FILE *fp = NULL;
|
|
fp = fopen(strFilename,"wb");
|
|
if(fp == NULL) {
|
|
MessageBox(NULL,"File Create Failed",strFilename,MB_OK);
|
|
return false;
|
|
}
|
|
else {
|
|
memset(strBuf,0,sizeof(char) * RBSPBUF_SIZE);
|
|
strcpy(strBuf,"BseFile");
|
|
WritetoFile(fp,strBuf);
|
|
|
|
// Data Num Write
|
|
int arrNum[11];
|
|
arrNum[0] = m_iVertsNum;
|
|
arrNum[1] = m_iFacesNum; //
|
|
arrNum[2] = m_iTextureDefsNum; //
|
|
arrNum[3] = m_iLightMapsNum; //
|
|
arrNum[4] = m_iNodesNum; //
|
|
arrNum[5] = m_iLeafsNum; //
|
|
arrNum[6] = m_iLeafFacesNum; //
|
|
arrNum[7] = m_iPlanesNum; //
|
|
arrNum[8] = m_iBrushesNum; //
|
|
arrNum[9] = m_iBrusheSidesNum; //
|
|
arrNum[10] = m_iLeafBrushesNum; //
|
|
fwrite((int *)arrNum,sizeof(int),11,fp);
|
|
// VisData Write
|
|
int iAllocSize = m_VisData.m_iBytesPerCluster * m_VisData.m_iClustersNum;
|
|
fwrite((int *)&(m_VisData.m_iBytesPerCluster),sizeof(int),1,fp);
|
|
fwrite((int *)&(m_VisData.m_iClustersNum),sizeof(int),1,fp);
|
|
fwrite((int *)&iAllocSize,sizeof(int),1,fp);
|
|
fwrite((byte *)(m_VisData.m_pBitsets),sizeof(byte),iAllocSize,fp);
|
|
|
|
// face write
|
|
fwrite((RBspFace *)m_pFaces,sizeof(RBspFace),m_iFacesNum,fp);
|
|
// Texture Define write
|
|
fwrite((RBspTextureDef *)m_pTextureDefs,sizeof(RBspTextureDef),m_iTextureDefsNum,fp);
|
|
// Lightmap write
|
|
fwrite((RBspLightMap *)m_pLightMaps,sizeof(RBspLightMap),m_iLightMapsNum,fp);
|
|
// Node
|
|
fwrite((RBspNode *)m_pNodes,sizeof(RBspNode),m_iNodesNum,fp);
|
|
// LeafExs
|
|
|
|
for( i = 0; i < m_iLeafsNum; i++ )
|
|
{
|
|
m_pLeafExs[i].m_pPickEventEffect = NULL;
|
|
m_pLeafExs[i].m_pPickEventObject = NULL;
|
|
m_pLeafExs[i].m_pPickEventSound = NULL;
|
|
m_pLeafExs[i].m_pPickLight = NULL;
|
|
m_pLeafExs[i].m_pPickTrigger = NULL;
|
|
m_pLeafExs[i].m_pPickR3SObject = NULL;
|
|
|
|
fwrite((int *)m_pLeafExs[i].m_iEventNum,sizeof(int),10,fp);
|
|
int iArr[10];
|
|
|
|
int iObjectAni = m_pLeafExs[i].m_iEventNum[RBSPEVENT_OBJECTANI];
|
|
int iEffect = m_pLeafExs[i].m_iEventNum[RBSPEVENT_EFFECT];
|
|
int iSound = m_pLeafExs[i].m_iEventNum[RBSPEVENT_SOUND];
|
|
int iLight = m_pLeafExs[i].m_iLightNum;
|
|
int iTrigger = m_pLeafExs[i].m_iTriggerNum;
|
|
int iAniObject = m_pLeafExs[i].m_iAniObjectNum;
|
|
int iR3SObjectNum = m_pLeafExs[i].m_iR3SObjectNum;
|
|
|
|
|
|
iArr[0] = iLight;
|
|
iArr[1] = iTrigger;
|
|
iArr[2] = iAniObject;
|
|
iArr[3] = iR3SObjectNum;
|
|
|
|
fwrite((int *)iArr,sizeof(int),10,fp);
|
|
|
|
for(j = 0; j < iObjectAni; j++)
|
|
{
|
|
|
|
}
|
|
for(j = 0; j < iEffect; j++)
|
|
{
|
|
fwrite((RBspEventEffect *)(m_pLeafExs[i].m_lstEffect[j]),sizeof(RBspEventEffect),1,fp);
|
|
}
|
|
for( j = 0; j < iSound; j++)
|
|
{
|
|
fwrite((RBspEventSound *)(m_pLeafExs[i].m_lstSound[j]),sizeof(RBspEventSound),1,fp);
|
|
}
|
|
for( j = 0; j < iLight; j++)
|
|
{
|
|
m_pLeafExs[i].m_lstLight[j].m_pShadowVolume = NULL;
|
|
fwrite((RBspLight *)&(m_pLeafExs[i].m_lstLight[j]),sizeof(RBspLight),1,fp);
|
|
}
|
|
for( j = 0; j < iTrigger; j++ )
|
|
{
|
|
|
|
}
|
|
for( j= 0; j < iAniObject; j++)
|
|
{
|
|
|
|
}
|
|
for( j = 0; j < iR3SObjectNum; j++ )
|
|
{
|
|
fwrite((RBspR3S *)(m_pLeafExs[i].m_lstR3SObject[j]),sizeof(RBspR3S),1,fp);
|
|
|
|
}
|
|
// Delete
|
|
/*for( j = iObjectAni - 1; j >= 0; j-- )
|
|
{
|
|
delete m_pLeafExs[i].m_lstObject[j];
|
|
m_pLeafExs[i].m_lstObject.erase(&(m_pLeafExs[i].m_lstObject[j]));
|
|
}
|
|
m_pLeafExs[i].m_lstObject.clear();
|
|
for( j = iEffect - 1; j >= 0; j-- )
|
|
{
|
|
delete m_pLeafExs[i].m_lstEffect[j];
|
|
m_pLeafExs[i].m_lstEffect.erase(&(m_pLeafExs[i].m_lstEffect[j]));
|
|
}
|
|
m_pLeafExs[i].m_lstEffect.clear();
|
|
for( j= iSound - 1; j >= 0; j-- )
|
|
{
|
|
delete m_pLeafExs[i].m_lstSound[j];
|
|
m_pLeafExs[i].m_lstSound.erase(&(m_pLeafExs[i].m_lstSound[j]));
|
|
}
|
|
m_pLeafExs[i].m_lstSound.clear();
|
|
for( j = iLight -1 ; j >= 0; j-- )
|
|
{
|
|
m_pLeafExs[i].m_lstLight.erase(&(m_pLeafExs[i].m_lstLight[j]));
|
|
}
|
|
m_pLeafExs[i].m_lstLight.clear();
|
|
for( j = iTrigger -1 ; j >= 0; j--)
|
|
{
|
|
m_pLeafExs[i].m_lstTrigger.erase(&(m_pLeafExs[i].m_lstTrigger[j]));
|
|
}
|
|
m_pLeafExs[i].m_lstTrigger.clear();
|
|
|
|
for( j= iAniObject - 1; j >= 0; j--)
|
|
{
|
|
delete m_pLeafExs[i].m_lstAniObject[j];
|
|
m_pLeafExs[i].m_lstAniObject.erase(&(m_pLeafExs[i].m_lstAniObject[j]));
|
|
}
|
|
m_pLeafExs[i].m_lstAniObject.clear();
|
|
|
|
m_pLeafExs[i].m_iEventNum[RBSPEVENT_OBJECTANI] = 0;
|
|
m_pLeafExs[i].m_iEventNum[RBSPEVENT_EFFECT] = 0;
|
|
m_pLeafExs[i].m_iEventNum[RBSPEVENT_SOUND] = 0;
|
|
m_pLeafExs[i].m_iLightNum = 0;
|
|
m_pLeafExs[i].m_iTriggerNum = 0 ;
|
|
m_pLeafExs[i].m_iAniObjectNum = 0;*/
|
|
//////
|
|
int iBspArr[12];
|
|
iBspArr[0] = m_pLeafExs[i].m_iAreaPotal;
|
|
iBspArr[1] = m_pLeafExs[i].m_iCluster;
|
|
iBspArr[2] = m_pLeafExs[i].m_iLeafBrush;
|
|
iBspArr[3] = m_pLeafExs[i].m_iLeafBrushNum;
|
|
iBspArr[4] = m_pLeafExs[i].m_iLeafFace;
|
|
iBspArr[5] = m_pLeafExs[i].m_iLeafFaceNum;
|
|
iBspArr[6] = m_pLeafExs[i].m_vecMaxBox[0];
|
|
iBspArr[7] = m_pLeafExs[i].m_vecMaxBox[1];
|
|
iBspArr[8] = m_pLeafExs[i].m_vecMaxBox[2];
|
|
|
|
iBspArr[9] = m_pLeafExs[i].m_vecMinBox[0];
|
|
iBspArr[10] = m_pLeafExs[i].m_vecMinBox[1];
|
|
iBspArr[11] = m_pLeafExs[i].m_vecMinBox[2];
|
|
|
|
fwrite((int *)iBspArr,sizeof(int),12,fp);
|
|
}
|
|
|
|
|
|
// Leaf Face
|
|
fwrite((int *)m_pLeafFaces,sizeof(int),m_iLeafFacesNum,fp);
|
|
// Leaf Brushes
|
|
fwrite((int *)m_pLeafBrushes,sizeof(int),m_iLeafBrushesNum,fp);
|
|
// Plane
|
|
fwrite((RBspPlane *)m_pPlanes,sizeof(RBspPlane),m_iPlanesNum,fp);
|
|
// Brushe
|
|
fwrite((RBspBrushe *)m_pBrushes,sizeof(RBspBrushe),m_iBrushesNum,fp);
|
|
// BrusheSide
|
|
fwrite((RBspBrusheSide *)m_pBrusheSides,sizeof(RBspBrusheSide),m_iBrusheSidesNum,fp);
|
|
|
|
// Vertex Write
|
|
fwrite((RBspDrawVertex *)m_pVerts,sizeof(RBspDrawVertex),m_iVertsNum,fp);
|
|
//Scale
|
|
fwrite((D3DXVECTOR3 *)&m_vecScale,sizeof(D3DXVECTOR3),1,fp);
|
|
// ZeroPos
|
|
fwrite((D3DXVECTOR3 *)&m_vecZeroPos,sizeof(D3DXVECTOR3),1,fp);
|
|
|
|
|
|
fclose(fp);
|
|
|
|
|
|
}
|
|
return true;
|
|
}
|
|
D3DXVECTOR3 RBspScene::WorldToLocalPos(D3DXVECTOR3 vecWorld) // World Position 을 Local position 으로..
|
|
{
|
|
|
|
D3DXVECTOR3 vecPos = vecWorld;
|
|
D3DXMATRIX matTmp;
|
|
D3DXMATRIX matInv;
|
|
|
|
D3DXMatrixIdentity(&matTmp);
|
|
|
|
matTmp._41 = m_vecZeroPos.x;
|
|
matTmp._42 = m_vecZeroPos.y;
|
|
matTmp._43 = m_vecZeroPos.z;
|
|
|
|
D3DXMatrixInverse(&matInv,NULL,&matTmp);
|
|
D3DXMatrixIdentity(&matTmp);
|
|
|
|
matTmp._41 = vecPos.x;
|
|
matTmp._42 = vecPos.y;
|
|
matTmp._43 = vecPos.z;
|
|
|
|
D3DXMatrixMultiply(&matTmp,&matTmp,&matInv);
|
|
vecPos.x = matTmp._41;
|
|
vecPos.y = matTmp._42;
|
|
vecPos.z = matTmp._43;
|
|
|
|
return vecPos;
|
|
|
|
|
|
}
|
|
D3DXVECTOR3 RBspScene::LocalToWorldPos(D3DXVECTOR3 vecLocal) // Local Position 을 World Position 으로..
|
|
{
|
|
D3DXVECTOR3 vecPos = vecLocal;
|
|
D3DXMATRIX matTmp;
|
|
D3DXMATRIX matInv;
|
|
|
|
D3DXMatrixIdentity(&matTmp);
|
|
matTmp._41 = m_vecZeroPos.x;
|
|
matTmp._42 = m_vecZeroPos.y;
|
|
matTmp._43 = m_vecZeroPos.z;
|
|
matInv = matTmp;
|
|
D3DXMatrixIdentity(&matTmp);
|
|
matTmp._41 = vecPos.x;
|
|
matTmp._42 = vecPos.y;
|
|
matTmp._43 = vecPos.z;
|
|
D3DXMatrixMultiply(&matTmp,&matTmp,&matInv);
|
|
vecPos.x = matTmp._41;
|
|
vecPos.y = matTmp._42;
|
|
vecPos.z = matTmp._43;
|
|
|
|
return vecPos;
|
|
|
|
}
|
|
void RBspScene::RenderR3SObject() // R3S Object Render
|
|
{
|
|
|
|
D3DMATERIAL8 mtrl;
|
|
ZeroMemory( &mtrl, sizeof(D3DMATERIAL8) );
|
|
mtrl.Diffuse.r = mtrl.Ambient.r = 0.6f;
|
|
mtrl.Diffuse.g = mtrl.Ambient.g = 0.6f;
|
|
mtrl.Diffuse.b = mtrl.Ambient.b = 0.6f;
|
|
mtrl.Diffuse.a = mtrl.Ambient.a = 0.6f;
|
|
m_D3Device->SetMaterial( &mtrl );
|
|
|
|
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, FALSE);
|
|
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE);
|
|
|
|
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
|
|
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_CURRENT);
|
|
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE2X);
|
|
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE );
|
|
|
|
if(BaseGraphicsLayer::m_VoodooOption)
|
|
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE);
|
|
else
|
|
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE2X);
|
|
|
|
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
|
|
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
|
|
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_TFACTOR );
|
|
|
|
CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
|
|
CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
|
|
|
|
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHATESTENABLE,FALSE);
|
|
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHAREF, 0xee );
|
|
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL );
|
|
m_D3Device->SetTexture(1,NULL);
|
|
|
|
|
|
// m_D3Device->SetLight(0,&CSceneManager::m_WeatherManager.m_SunLight);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_AMBIENT,CSceneManager::m_WeatherManager.m_InterAmbientColor.c);
|
|
|
|
CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,TRUE);
|
|
|
|
D3DXMATRIX matBackup;
|
|
|
|
m_D3Device->GetTransform(D3DTS_WORLD,&matBackup);
|
|
|
|
for(int cObject = 0; cObject < m_ObjectSceneNode.num; cObject++)
|
|
{
|
|
//////////////////// Light
|
|
|
|
for(int cLight=0;cLight<8;cLight++)
|
|
{
|
|
m_D3Device->LightEnable(cLight,FALSE);
|
|
}
|
|
|
|
|
|
D3DLIGHT8 pCurrentLight[4];
|
|
// 최대 4개 까지
|
|
|
|
D3DXVECTOR3 vecPos = D3DXVECTOR3(m_ObjectSceneNode[cObject]->m_TM._41,m_ObjectSceneNode[cObject]->m_TM._42,m_ObjectSceneNode[cObject]->m_TM._43);
|
|
int iLightNum = CSceneManager::m_RBspSceneManager.m_pCurrentBspScene->CheckChrLight(vecPos,pCurrentLight,4);
|
|
|
|
if(iLightNum > 0)
|
|
{
|
|
|
|
for(int cLNum = 1; cLNum < iLightNum + 1; cLNum++) {
|
|
m_D3Device->SetLight(cLNum,&(pCurrentLight[cLNum - 1]));
|
|
m_D3Device->LightEnable(cLNum,TRUE);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_D3Device->LightEnable(0,TRUE);
|
|
D3DLIGHT8 light;
|
|
light.Type = D3DLIGHT_POINT;
|
|
light.Attenuation0=0.5f;
|
|
light.Attenuation1=0.0f;
|
|
|
|
light.Diffuse.r = CSceneManager::m_WeatherManager.m_InterCharacterLight.r/255.0f;
|
|
light.Diffuse.g = CSceneManager::m_WeatherManager.m_InterCharacterLight.g/255.0f;
|
|
light.Diffuse.b = CSceneManager::m_WeatherManager.m_InterCharacterLight.b/255.0f;
|
|
vector3 vecLight(-1.0f,-1.0f,-1.0f);
|
|
vecLight.Normalize();
|
|
light.Position.x = light.Direction.x =vecLight.x;
|
|
light.Position.y = light.Direction.y =vecLight.y + 10000.0f;
|
|
light.Position.z = light.Direction.z =vecLight.z;
|
|
light.Range = 0.0f;
|
|
|
|
m_D3Device->SetLight(0,&light);
|
|
|
|
}
|
|
|
|
///////////////////
|
|
|
|
D3DXVECTOR3 vecMin = D3DXVECTOR3(m_ObjectSceneNode[cObject]->m_vecMinBox.x,
|
|
m_ObjectSceneNode[cObject]->m_vecMinBox.y,
|
|
m_ObjectSceneNode[cObject]->m_vecMinBox.z);
|
|
D3DXVECTOR3 vecMax = D3DXVECTOR3(m_ObjectSceneNode[cObject]->m_vecMaxBox.x,
|
|
m_ObjectSceneNode[cObject]->m_vecMaxBox.y,
|
|
m_ObjectSceneNode[cObject]->m_vecMaxBox.z);
|
|
|
|
// vecMin
|
|
matrix matTm = m_ObjectSceneNode[cObject]->m_TM;
|
|
matrix matPos;
|
|
matPos.MakeIdent();
|
|
matPos._41 = vecMin.x;
|
|
matPos._42 = vecMin.y;
|
|
matPos._43 = vecMin.z;
|
|
|
|
matPos = matPos * matTm;
|
|
|
|
vecMin.x = matPos._41;
|
|
vecMin.y = matPos._42;
|
|
vecMin.z = matPos._43;
|
|
// vecMax
|
|
matTm = m_ObjectSceneNode[cObject]->m_TM;
|
|
matPos.MakeIdent();
|
|
|
|
matPos._41 = vecMax.x;
|
|
matPos._42 = vecMax.y;
|
|
matPos._43 = vecMax.z;
|
|
|
|
matPos = matPos * matTm;
|
|
|
|
vecMax.x = matPos._41;
|
|
vecMax.y = matPos._42;
|
|
vecMax.z = matPos._43;
|
|
|
|
if(!m_pFrustum->BoxInFrustum(vecMin,vecMax))
|
|
continue;
|
|
|
|
m_D3Device->SetTransform(D3DTS_WORLD,m_ObjectSceneNode[cObject]->m_TM);
|
|
|
|
if(CSceneManager::m_PickObjectScene==m_ObjectSceneNode[cObject])
|
|
{
|
|
if(CSceneManager::m_bIsPickObjectMoving==MOVE_OBJECT )
|
|
m_ObjectSceneNode[cObject]->m_pObject->RenderBox(m_D3Device);
|
|
else
|
|
{
|
|
m_ObjectSceneNode[cObject]->m_pObject->Render(m_D3Device);
|
|
m_ObjectSceneNode[cObject]->m_pObject->RenderBox(m_D3Device);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_ObjectSceneNode[cObject]->m_pObject->Render(m_D3Device);
|
|
}
|
|
|
|
}
|
|
m_D3Device->SetTransform(D3DTS_WORLD,&matBackup);
|
|
CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,FALSE);
|
|
|
|
}
|
|
void RBspScene::DynamicR3SLoad()
|
|
{
|
|
CSceneManager::m_ObjectContainer.DeleteAllObject();
|
|
|
|
for(int cObject=0;cObject<m_ObjectSceneNode.num;cObject++)
|
|
{
|
|
if(m_ObjectSceneNode[cObject]->m_pObject==NULL)
|
|
{
|
|
m_ObjectSceneNode[cObject]->m_pObject=
|
|
CSceneManager::m_ObjectContainer.GetObject(
|
|
m_ObjectSceneNode[cObject]->m_strObjectName,
|
|
m_ObjectSceneNode[cObject]->m_isAlpha,
|
|
m_ObjectSceneNode[cObject]->m_isLight);
|
|
|
|
m_ObjectSceneNode[cObject]->m_vecMaxBox=m_ObjectSceneNode[cObject]->m_pObject->m_MaxBox;
|
|
m_ObjectSceneNode[cObject]->m_vecMinBox=m_ObjectSceneNode[cObject]->m_pObject->m_MinBox;
|
|
m_ObjectSceneNode[cObject]->Init();
|
|
|
|
}
|
|
}
|
|
}
|
|
void RBspScene::GenerateR3SObject()
|
|
{
|
|
|
|
int i;
|
|
int j;
|
|
|
|
int iTotalAdd = 0;
|
|
|
|
for(int cObject=0;cObject<m_ObjectSceneNode.num;cObject++)
|
|
{
|
|
delete m_ObjectSceneNode[cObject];
|
|
}
|
|
|
|
m_ObjectSceneNode.num=0;
|
|
CSceneManager::m_PickObjectScene = NULL;
|
|
if(m_iVisLeafs)
|
|
{
|
|
for( i = 0; i < m_iVisLeafs; i++ )
|
|
{
|
|
int iLeafIndex = m_pVisLeafs[i];
|
|
RBspLeafEx *pLeaf = &(m_pLeafExs[iLeafIndex]);
|
|
for( j= 0; j < pLeaf->m_iR3SObjectNum; j++ )
|
|
{
|
|
RBspR3S *pR3SInfo = pLeaf->m_lstR3SObject[j];
|
|
CObjectScene *AddObjectScene = new CObjectScene();
|
|
AddObjectScene->m_TM = pR3SInfo->m_matTm;
|
|
AddObjectScene->m_AccumulateTM = pR3SInfo->m_matTm;
|
|
AddObjectScene->m_pObject = NULL;
|
|
|
|
strcpy(AddObjectScene->m_strObjectName,pR3SInfo->m_strName);
|
|
AddObjectScene->m_isAlpha = pR3SInfo->m_bAlpha;
|
|
AddObjectScene->m_isLight = pR3SInfo->m_bLight;
|
|
AddObjectScene->m_isShadowed=false;
|
|
|
|
AddObjectScene->m_ObjectID = iTotalAdd++;
|
|
//AddObjectScene->Init();
|
|
m_ObjectSceneNode.Add(AddObjectScene);
|
|
// picking 처리
|
|
if(pLeaf->m_lstR3SObject[j]->m_iPickState == RBSPPICK_PICKED)
|
|
CSceneManager::m_PickObjectScene = AddObjectScene;
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
DynamicR3SLoad();
|
|
} |