mirror of https://github.com/axmolengine/axmol.git
commit
984babc9c9
|
@ -1,7 +1,6 @@
|
||||||
#include "CCTerrain.h"
|
#include "CCTerrain.h"
|
||||||
#include <CCImage.h>
|
#include <CCImage.h>
|
||||||
USING_NS_CC;
|
USING_NS_CC;
|
||||||
|
|
||||||
#include "renderer/CCGLProgram.h"
|
#include "renderer/CCGLProgram.h"
|
||||||
#include "renderer/CCGLProgramCache.h"
|
#include "renderer/CCGLProgramCache.h"
|
||||||
#include "renderer/CCGLProgramState.h"
|
#include "renderer/CCGLProgramState.h"
|
||||||
|
@ -16,10 +15,10 @@ NS_CC_BEGIN
|
||||||
Terrain * Terrain::create(TerrainData ¶meter, CrackFixedType fixedType)
|
Terrain * Terrain::create(TerrainData ¶meter, CrackFixedType fixedType)
|
||||||
{
|
{
|
||||||
Terrain * terrain = new (std::nothrow)Terrain();
|
Terrain * terrain = new (std::nothrow)Terrain();
|
||||||
|
terrain->setSkirtHeightRatio(1.0f);
|
||||||
terrain->_terrainData = parameter;
|
terrain->_terrainData = parameter;
|
||||||
terrain->_crackFixedType = fixedType;
|
terrain->_crackFixedType = fixedType;
|
||||||
terrain->_isCameraViewChanged = true;
|
terrain->_isCameraViewChanged = true;
|
||||||
terrain->_isTerrainModelMatrixChanged = true;
|
|
||||||
//chunksize
|
//chunksize
|
||||||
terrain->_chunkSize = parameter.chunkSize;
|
terrain->_chunkSize = parameter.chunkSize;
|
||||||
//heightmap
|
//heightmap
|
||||||
|
@ -30,7 +29,14 @@ Terrain * Terrain::create(TerrainData ¶meter, CrackFixedType fixedType)
|
||||||
textImage->initWithImageFile(parameter.detailMaps[0].detailMapSrc);
|
textImage->initWithImageFile(parameter.detailMaps[0].detailMapSrc);
|
||||||
auto texture = new (std::nothrow)Texture2D();
|
auto texture = new (std::nothrow)Texture2D();
|
||||||
texture->initWithImage(textImage);
|
texture->initWithImage(textImage);
|
||||||
|
texture->generateMipmap();
|
||||||
terrain->_detailMapTextures[0] = texture;
|
terrain->_detailMapTextures[0] = texture;
|
||||||
|
delete textImage;
|
||||||
|
glBindTexture(GL_TEXTURE_2D,texture->getName());
|
||||||
|
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
||||||
|
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR_MIPMAP_LINEAR);
|
||||||
}else
|
}else
|
||||||
{
|
{
|
||||||
//alpha map
|
//alpha map
|
||||||
|
@ -38,13 +44,28 @@ Terrain * Terrain::create(TerrainData ¶meter, CrackFixedType fixedType)
|
||||||
image->initWithImageFile(parameter.alphaMapSrc);
|
image->initWithImageFile(parameter.alphaMapSrc);
|
||||||
terrain->_alphaMap = new (std::nothrow)Texture2D();
|
terrain->_alphaMap = new (std::nothrow)Texture2D();
|
||||||
terrain->_alphaMap->initWithImage(image);
|
terrain->_alphaMap->initWithImage(image);
|
||||||
|
delete image;
|
||||||
|
glBindTexture(GL_TEXTURE_2D,terrain->_alphaMap->getName());
|
||||||
|
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
||||||
|
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
|
||||||
|
|
||||||
for(int i =0;i<4;i++)
|
for(int i =0;i<4;i++)
|
||||||
{
|
{
|
||||||
auto textImage = new (std::nothrow)Image();
|
auto textImage = new (std::nothrow)Image();
|
||||||
textImage->initWithImageFile(parameter.detailMaps[i].detailMapSrc);
|
textImage->initWithImageFile(parameter.detailMaps[i].detailMapSrc);
|
||||||
auto texture = new (std::nothrow)Texture2D();
|
auto texture = new (std::nothrow)Texture2D();
|
||||||
texture->initWithImage(textImage);
|
texture->initWithImage(textImage);
|
||||||
|
delete textImage;
|
||||||
|
texture->generateMipmap();
|
||||||
terrain->_detailMapTextures[i] = texture;
|
terrain->_detailMapTextures[i] = texture;
|
||||||
|
|
||||||
|
glBindTexture(GL_TEXTURE_2D,texture->getName());
|
||||||
|
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
||||||
|
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR_MIPMAP_LINEAR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
terrain->init();
|
terrain->init();
|
||||||
|
@ -65,6 +86,13 @@ bool Terrain::init()
|
||||||
_normalLocation = glGetAttribLocation(this->getGLProgram()->getProgram(),"a_normal");
|
_normalLocation = glGetAttribLocation(this->getGLProgram()->getProgram(),"a_normal");
|
||||||
setDrawWire(false);
|
setDrawWire(false);
|
||||||
setIsEnableFrustumCull(true);
|
setIsEnableFrustumCull(true);
|
||||||
|
|
||||||
|
_alphaMapLocation = -1;
|
||||||
|
for(int i =0;i<4;i++)
|
||||||
|
{
|
||||||
|
_detailMapLocation[4] = -1;
|
||||||
|
_detailMapSizeLocation[4] = -1;
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,39 +124,24 @@ void Terrain::onDraw(const Mat4 &transform, uint32_t flags)
|
||||||
{
|
{
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
glBindTexture(GL_TEXTURE_2D,_detailMapTextures[0]->getName());
|
glBindTexture(GL_TEXTURE_2D,_detailMapTextures[0]->getName());
|
||||||
auto texture_location = glGetUniformLocation(glProgram->getProgram(),"u_texture0");
|
glUniform1i(_detailMapLocation[0],0);
|
||||||
glUniform1i(texture_location,0);
|
glUniform1i(_alphaIsHasAlphaMapLocation,0);
|
||||||
auto alpha_location = glGetUniformLocation(glProgram->getProgram(),"u_has_alpha");
|
|
||||||
glUniform1i(alpha_location,0);
|
|
||||||
}else
|
}else
|
||||||
{
|
{
|
||||||
for(int i =0;i<_maxDetailMapValue;i++)
|
for(int i =0;i<_maxDetailMapValue;i++)
|
||||||
{
|
{
|
||||||
glActiveTexture(GL_TEXTURE0+i);
|
glActiveTexture(GL_TEXTURE0+i);
|
||||||
glBindTexture(GL_TEXTURE_2D,_detailMapTextures[i]->getName());
|
glBindTexture(GL_TEXTURE_2D,_detailMapTextures[i]->getName());
|
||||||
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
|
glUniform1i(_detailMapLocation[i],i);
|
||||||
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
|
|
||||||
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
|
|
||||||
char str[20];
|
|
||||||
sprintf(str,"u_texture%d",i);
|
|
||||||
auto texture_location = glGetUniformLocation(glProgram->getProgram(),str);
|
|
||||||
glUniform1i(texture_location,i);
|
|
||||||
|
|
||||||
sprintf(str,"u_detailSize[%d]",i);
|
glUniform1f(_detailMapSizeLocation[i],_terrainData.detailMaps[i].detailMapSize);
|
||||||
auto detailSizeLocation = glGetUniformLocation(glProgram->getProgram(),str);
|
|
||||||
glUniform1f(detailSizeLocation,_terrainData.detailMaps[i].detailMapSize);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
auto alpha_location = glGetUniformLocation(glProgram->getProgram(),"u_has_alpha");
|
glUniform1i(_alphaIsHasAlphaMapLocation,1);
|
||||||
glUniform1i(alpha_location,1);
|
|
||||||
|
|
||||||
glActiveTexture(GL_TEXTURE4);
|
glActiveTexture(GL_TEXTURE4);
|
||||||
glBindTexture(GL_TEXTURE_2D,_alphaMap->getName());
|
glBindTexture(GL_TEXTURE_2D,_alphaMap->getName());
|
||||||
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
|
glUniform1i(_alphaMapLocation,4);
|
||||||
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
|
|
||||||
auto alpha_map_location = glGetUniformLocation(glProgram->getProgram(),"u_alphaMap");
|
|
||||||
glUniform1i(alpha_map_location,4);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
auto camera = Camera::getVisitingCamera();
|
auto camera = Camera::getVisitingCamera();
|
||||||
|
@ -139,38 +152,25 @@ void Terrain::onDraw(const Mat4 &transform, uint32_t flags)
|
||||||
_CameraMatrix = camera->getViewMatrix();
|
_CameraMatrix = camera->getViewMatrix();
|
||||||
}
|
}
|
||||||
|
|
||||||
auto terrainWorldTransform = getNodeToWorldTransform();
|
|
||||||
if(memcmp(&_oldTerrrainModelMatrix,&terrainWorldTransform,sizeof(Mat4))!=0)
|
|
||||||
{
|
|
||||||
_isTerrainModelMatrixChanged = true;
|
|
||||||
_oldTerrrainModelMatrix = terrainWorldTransform;
|
|
||||||
}
|
|
||||||
|
|
||||||
_quadRoot->updateAABB(_oldTerrrainModelMatrix);
|
if(_isCameraViewChanged )
|
||||||
|
|
||||||
if(_isCameraViewChanged || _isTerrainModelMatrixChanged)
|
|
||||||
{
|
{
|
||||||
auto camPos = camera->getPosition3D();
|
auto camPos = camera->getPosition3D();
|
||||||
//set lod
|
//set lod
|
||||||
setChunksLOD(camPos);
|
setChunksLOD(camPos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(_isCameraViewChanged )
|
||||||
if(_isCameraViewChanged || _isTerrainModelMatrixChanged)
|
|
||||||
{
|
{
|
||||||
_quadRoot->resetNeedDraw(true);//reset it
|
_quadRoot->resetNeedDraw(true);//reset it
|
||||||
//camera frustum culling
|
//camera frustum culling
|
||||||
_quadRoot->cullByCamera(camera,_oldTerrrainModelMatrix);
|
_quadRoot->cullByCamera(camera,_terrainModelMatrix);
|
||||||
}
|
}
|
||||||
_quadRoot->draw();
|
_quadRoot->draw();
|
||||||
if(_isCameraViewChanged)
|
if(_isCameraViewChanged)
|
||||||
{
|
{
|
||||||
_isCameraViewChanged = false;
|
_isCameraViewChanged = false;
|
||||||
}
|
}
|
||||||
if(_isTerrainModelMatrixChanged)
|
|
||||||
{
|
|
||||||
_isTerrainModelMatrixChanged = false;
|
|
||||||
}
|
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
if(depthTestCheck)
|
if(depthTestCheck)
|
||||||
{
|
{
|
||||||
|
@ -406,7 +406,16 @@ void Terrain::setIsEnableFrustumCull(bool bool_value)
|
||||||
|
|
||||||
Terrain::~Terrain()
|
Terrain::~Terrain()
|
||||||
{
|
{
|
||||||
free(_data);
|
_alphaMap->release();
|
||||||
|
_heightMapImage->release();
|
||||||
|
delete _quadRoot;
|
||||||
|
for(int i=0;i<4;i++)
|
||||||
|
{
|
||||||
|
if(_detailMapTextures[i])
|
||||||
|
{
|
||||||
|
_detailMapTextures[i]->release();
|
||||||
|
}
|
||||||
|
}
|
||||||
for(int i = 0;i<MAX_CHUNKES;i++)
|
for(int i = 0;i<MAX_CHUNKES;i++)
|
||||||
{
|
{
|
||||||
for(int j = 0;j<MAX_CHUNKES;j++)
|
for(int j = 0;j<MAX_CHUNKES;j++)
|
||||||
|
@ -417,6 +426,17 @@ Terrain::~Terrain()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for(int i =0;i<_chunkLodIndicesSet.size();i++)
|
||||||
|
{
|
||||||
|
glDeleteBuffers(1,&(_chunkLodIndicesSet[i]._chunkIndices.indices));
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i =0;i<_chunkLodIndicesSkirtSet.size();i++)
|
||||||
|
{
|
||||||
|
glDeleteBuffers(1,&(_chunkLodIndicesSkirtSet[i]._chunkIndices.indices));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cocos2d::Vec3 Terrain::getNormal(int pixel_x, int pixel_y)
|
cocos2d::Vec3 Terrain::getNormal(int pixel_x, int pixel_y)
|
||||||
|
@ -636,6 +656,42 @@ Terrain::ChunkIndices Terrain::insertIndicesLODSkirt(int selfLod, GLushort * ind
|
||||||
return skirtIndices._chunkIndices;
|
return skirtIndices._chunkIndices;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Terrain::setSkirtHeightRatio(float ratio)
|
||||||
|
{
|
||||||
|
_skirtRatio = ratio;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Terrain::onEnter()
|
||||||
|
{
|
||||||
|
Node::onEnter();
|
||||||
|
_terrainModelMatrix = getNodeToWorldTransform();
|
||||||
|
_quadRoot->preCalculateAABB(_terrainModelMatrix);
|
||||||
|
cacheUniformLocation();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Terrain::cacheUniformLocation()
|
||||||
|
{
|
||||||
|
auto glProgram = getGLProgram();
|
||||||
|
_alphaIsHasAlphaMapLocation = glGetUniformLocation(glProgram->getProgram(),"u_has_alpha");
|
||||||
|
if(!_alphaMap)
|
||||||
|
{
|
||||||
|
_detailMapLocation[0] = glGetUniformLocation(glProgram->getProgram(),"u_texture0");
|
||||||
|
|
||||||
|
}else
|
||||||
|
{
|
||||||
|
for(int i =0;i<_maxDetailMapValue;i++)
|
||||||
|
{
|
||||||
|
char str[20];
|
||||||
|
sprintf(str,"u_texture%d",i);
|
||||||
|
_detailMapLocation[i] = glGetUniformLocation(glProgram->getProgram(),str);
|
||||||
|
|
||||||
|
sprintf(str,"u_detailSize[%d]",i);
|
||||||
|
_detailMapSizeLocation[i] = glGetUniformLocation(glProgram->getProgram(),str);
|
||||||
|
}
|
||||||
|
_alphaMapLocation = glGetUniformLocation(glProgram->getProgram(),"u_alphaMap");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Terrain::Chunk::finish()
|
void Terrain::Chunk::finish()
|
||||||
{
|
{
|
||||||
//genearate two VBO ,the first for vertices, we just setup datas once ,won't changed at all
|
//genearate two VBO ,the first for vertices, we just setup datas once ,won't changed at all
|
||||||
|
@ -725,22 +781,45 @@ void Terrain::Chunk::generate(int imgWidth, int imageHei, int m, int n, const un
|
||||||
vertices.push_back (v);
|
vertices.push_back (v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// add two skirt
|
// add four skirts
|
||||||
|
|
||||||
|
float skirtHeight = _terrain->_skirtRatio *_terrain->_terrainData.mapScale*int(powf(2.0f, float(3)));
|
||||||
//#1
|
//#1
|
||||||
|
_terrain->_skirtVerticesOffset[0] = vertices.size();
|
||||||
for(int i =_size.height*m;i<=_size.height*(m+1);i++)
|
for(int i =_size.height*m;i<=_size.height*(m+1);i++)
|
||||||
{
|
{
|
||||||
auto v = _terrain->vertices[i*imgWidth +_size.width*(n+1)];
|
auto v = _terrain->vertices[i*imgWidth +_size.width*(n+1)];
|
||||||
v.position.y = -5;
|
v.position.y -= skirtHeight;
|
||||||
vertices.push_back (v);
|
|
||||||
}
|
|
||||||
//#2
|
|
||||||
for(int j =_size.width*n;j<=_size.width*(n+1);j++)
|
|
||||||
{
|
|
||||||
auto v = _terrain->vertices[_size.height*(m+1)*imgWidth + j];
|
|
||||||
v.position.y = -5;
|
|
||||||
vertices.push_back (v);
|
vertices.push_back (v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//#2
|
||||||
|
_terrain->_skirtVerticesOffset[1] = vertices.size();
|
||||||
|
for(int j =_size.width*n;j<=_size.width*(n+1);j++)
|
||||||
|
{
|
||||||
|
auto v = _terrain->vertices[_size.height*(m+1)*imgWidth + j];
|
||||||
|
v.position.y -=skirtHeight;
|
||||||
|
vertices.push_back (v);
|
||||||
|
}
|
||||||
|
|
||||||
|
//#3
|
||||||
|
_terrain->_skirtVerticesOffset[2] = vertices.size();
|
||||||
|
for(int i =_size.height*m;i<=_size.height*(m+1);i++)
|
||||||
|
{
|
||||||
|
auto v = _terrain->vertices[i*imgWidth + _size.width*n];
|
||||||
|
v.position.y -= skirtHeight;
|
||||||
|
vertices.push_back (v);
|
||||||
|
}
|
||||||
|
|
||||||
|
//#4
|
||||||
|
_terrain->_skirtVerticesOffset[3] = vertices.size();
|
||||||
|
for(int j =_size.width*n;j<=_size.width*(n+1);j++)
|
||||||
|
{
|
||||||
|
auto v = _terrain->vertices[_size.height*m*imgWidth+j];
|
||||||
|
v.position.y -= skirtHeight;
|
||||||
|
//v.position.y = -5;
|
||||||
|
vertices.push_back (v);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CrackFixedType::INCREASE_LOWER:
|
case CrackFixedType::INCREASE_LOWER:
|
||||||
|
@ -1051,7 +1130,7 @@ void Terrain::Chunk::updateVerticesForLOD()
|
||||||
|
|
||||||
Terrain::Chunk::~Chunk()
|
Terrain::Chunk::~Chunk()
|
||||||
{
|
{
|
||||||
// glDeleteBuffers(2,vbo);
|
glDeleteBuffers(2,vbo);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Terrain::Chunk::updateIndicesLODSkirt()
|
void Terrain::Chunk::updateIndicesLODSkirt()
|
||||||
|
@ -1066,8 +1145,8 @@ void Terrain::Chunk::updateIndicesLODSkirt()
|
||||||
int gridX = _size.width;
|
int gridX = _size.width;
|
||||||
int step = int(powf(2.0f, float(_currentLod)));
|
int step = int(powf(2.0f, float(_currentLod)));
|
||||||
|
|
||||||
|
int k =0,m=0;
|
||||||
for(int i =0;i<gridY;i+=step)
|
for(int i =0;i<gridY;i+=step,k+=step)
|
||||||
{
|
{
|
||||||
for(int j = 0;j<gridX;j+=step)
|
for(int j = 0;j<gridX;j+=step)
|
||||||
{
|
{
|
||||||
|
@ -1085,7 +1164,7 @@ void Terrain::Chunk::updateIndicesLODSkirt()
|
||||||
//#1
|
//#1
|
||||||
for(int i =0;i<gridY;i+=step)
|
for(int i =0;i<gridY;i+=step)
|
||||||
{
|
{
|
||||||
int nLocIndex = i * (gridX+1) + gridX-step+1;
|
int nLocIndex = i * (gridX+1) + gridX;
|
||||||
_lod[_currentLod].indices.push_back (nLocIndex);
|
_lod[_currentLod].indices.push_back (nLocIndex);
|
||||||
_lod[_currentLod].indices.push_back (nLocIndex + step * (gridX+1));
|
_lod[_currentLod].indices.push_back (nLocIndex + step * (gridX+1));
|
||||||
_lod[_currentLod].indices.push_back ((gridY+1) *(gridX+1)+i);
|
_lod[_currentLod].indices.push_back ((gridY+1) *(gridX+1)+i);
|
||||||
|
@ -1098,16 +1177,42 @@ void Terrain::Chunk::updateIndicesLODSkirt()
|
||||||
//#2
|
//#2
|
||||||
for(int j =0;j<gridX;j+=step)
|
for(int j =0;j<gridX;j+=step)
|
||||||
{
|
{
|
||||||
int nLocIndex = (gridY-step+1)* (gridX+1) + j;
|
int nLocIndex = (gridY)* (gridX+1) + j;
|
||||||
_lod[_currentLod].indices.push_back (nLocIndex);
|
_lod[_currentLod].indices.push_back (nLocIndex);
|
||||||
_lod[_currentLod].indices.push_back ((gridX+1)*(gridY+1)+_size.height+1 +j);
|
_lod[_currentLod].indices.push_back (_terrain->_skirtVerticesOffset[1] +j);
|
||||||
_lod[_currentLod].indices.push_back (nLocIndex + step);
|
_lod[_currentLod].indices.push_back (nLocIndex + step);
|
||||||
|
|
||||||
_lod[_currentLod].indices.push_back (nLocIndex + step);
|
_lod[_currentLod].indices.push_back (nLocIndex + step);
|
||||||
_lod[_currentLod].indices.push_back ((gridX+1)*(gridY+1)+_size.height+1 +j);
|
_lod[_currentLod].indices.push_back (_terrain->_skirtVerticesOffset[1] +j);
|
||||||
_lod[_currentLod].indices.push_back ((gridX+1)*(gridY+1)+_size.height+1 +j+step);
|
_lod[_currentLod].indices.push_back (_terrain->_skirtVerticesOffset[1] +j + step);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//#3
|
||||||
|
for(int i =0;i<gridY;i+=step)
|
||||||
|
{
|
||||||
|
int nLocIndex = i * (gridX+1);
|
||||||
|
_lod[_currentLod].indices.push_back (nLocIndex);
|
||||||
|
_lod[_currentLod].indices.push_back (_terrain->_skirtVerticesOffset[2]+i);
|
||||||
|
_lod[_currentLod].indices.push_back ((i+step)*(gridX+1));
|
||||||
|
|
||||||
|
_lod[_currentLod].indices.push_back ((i+step)*(gridX+1));
|
||||||
|
_lod[_currentLod].indices.push_back (_terrain->_skirtVerticesOffset[2]+i);
|
||||||
|
_lod[_currentLod].indices.push_back (_terrain->_skirtVerticesOffset[2]+i +step);
|
||||||
|
}
|
||||||
|
|
||||||
|
//#4
|
||||||
|
for(int j =0;j<gridX;j+=step)
|
||||||
|
{
|
||||||
|
int nLocIndex = j;
|
||||||
|
_lod[_currentLod].indices.push_back (nLocIndex + step);
|
||||||
|
_lod[_currentLod].indices.push_back (_terrain->_skirtVerticesOffset[3]+j);
|
||||||
|
_lod[_currentLod].indices.push_back (nLocIndex);
|
||||||
|
|
||||||
|
|
||||||
|
_lod[_currentLod].indices.push_back (_terrain->_skirtVerticesOffset[3] + j + step);
|
||||||
|
_lod[_currentLod].indices.push_back (_terrain->_skirtVerticesOffset[3] +j);
|
||||||
|
_lod[_currentLod].indices.push_back (nLocIndex + step);
|
||||||
|
}
|
||||||
|
|
||||||
_chunkIndices = _terrain->insertIndicesLODSkirt(_currentLod,&_lod[_currentLod].indices[0],_lod[_currentLod].indices.size());
|
_chunkIndices = _terrain->insertIndicesLODSkirt(_currentLod,&_lod[_currentLod].indices[0],_lod[_currentLod].indices.size());
|
||||||
}
|
}
|
||||||
|
@ -1182,11 +1287,6 @@ void Terrain::QuadTree::resetNeedDraw(bool value)
|
||||||
|
|
||||||
void Terrain::QuadTree::cullByCamera(const Camera * camera, const Mat4 & worldTransform)
|
void Terrain::QuadTree::cullByCamera(const Camera * camera, const Mat4 & worldTransform)
|
||||||
{
|
{
|
||||||
if(_terrain->_isTerrainModelMatrixChanged)
|
|
||||||
{
|
|
||||||
_worldSpaceAABB = _aabb;
|
|
||||||
_worldSpaceAABB.transform(worldTransform);
|
|
||||||
}
|
|
||||||
if(!camera->isVisibleInFrustum(&_worldSpaceAABB))
|
if(!camera->isVisibleInFrustum(&_worldSpaceAABB))
|
||||||
{
|
{
|
||||||
this->resetNeedDraw(false);
|
this->resetNeedDraw(false);
|
||||||
|
@ -1201,21 +1301,27 @@ void Terrain::QuadTree::cullByCamera(const Camera * camera, const Mat4 & worldTr
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Terrain::QuadTree::updateAABB(const Mat4 & worldTransform)
|
void Terrain::QuadTree::preCalculateAABB(const Mat4 & worldTransform)
|
||||||
{
|
|
||||||
if(_terrain->_isTerrainModelMatrixChanged)
|
|
||||||
{
|
{
|
||||||
|
|
||||||
_worldSpaceAABB = _aabb;
|
_worldSpaceAABB = _aabb;
|
||||||
_worldSpaceAABB.transform(worldTransform);
|
_worldSpaceAABB.transform(worldTransform);
|
||||||
}
|
|
||||||
if(!_isTerminal){
|
if(!_isTerminal){
|
||||||
tl->updateAABB(worldTransform);
|
tl->preCalculateAABB(worldTransform);
|
||||||
tr->updateAABB(worldTransform);
|
tr->preCalculateAABB(worldTransform);
|
||||||
bl->updateAABB(worldTransform);
|
bl->preCalculateAABB(worldTransform);
|
||||||
br->updateAABB(worldTransform);
|
br->preCalculateAABB(worldTransform);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Terrain::QuadTree::~QuadTree()
|
||||||
|
{
|
||||||
|
if(tl) delete tl;
|
||||||
|
if(tr) delete tr;
|
||||||
|
if(bl) delete bl;
|
||||||
|
if(br) delete br;
|
||||||
|
}
|
||||||
|
|
||||||
Terrain::TerrainData::TerrainData(const char * heightMapsrc , const char * textureSrc, const Size & chunksize, float height, float scale)
|
Terrain::TerrainData::TerrainData(const char * heightMapsrc , const char * textureSrc, const Size & chunksize, float height, float scale)
|
||||||
{
|
{
|
||||||
this->heightMapSrc = heightMapsrc;
|
this->heightMapSrc = heightMapsrc;
|
||||||
|
|
|
@ -31,6 +31,7 @@ THE SOFTWARE.
|
||||||
#include "2d/CCCamera.h"
|
#include "2d/CCCamera.h"
|
||||||
#include "3d/CCRay.h"
|
#include "3d/CCRay.h"
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include "vld.h"
|
||||||
NS_CC_BEGIN
|
NS_CC_BEGIN
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -238,10 +239,11 @@ private:
|
||||||
struct QuadTree
|
struct QuadTree
|
||||||
{
|
{
|
||||||
QuadTree(int x, int y, int width, int height, Terrain * terrain);
|
QuadTree(int x, int y, int width, int height, Terrain * terrain);
|
||||||
|
~QuadTree();
|
||||||
void draw();
|
void draw();
|
||||||
void resetNeedDraw(bool value);
|
void resetNeedDraw(bool value);
|
||||||
void cullByCamera(const Camera * camera, const Mat4 & worldTransform);
|
void cullByCamera(const Camera * camera, const Mat4 & worldTransform);
|
||||||
void updateAABB(const Mat4 & worldTransform);
|
void preCalculateAABB(const Mat4 & worldTransform);
|
||||||
QuadTree * tl;
|
QuadTree * tl;
|
||||||
QuadTree * tr;
|
QuadTree * tr;
|
||||||
QuadTree * bl;
|
QuadTree * bl;
|
||||||
|
@ -315,6 +317,8 @@ public:
|
||||||
|
|
||||||
ChunkIndices insertIndicesLODSkirt(int selfLod, GLushort * indices, int size);
|
ChunkIndices insertIndicesLODSkirt(int selfLod, GLushort * indices, int size);
|
||||||
|
|
||||||
|
void setSkirtHeightRatio(float ratio);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
Terrain();
|
Terrain();
|
||||||
|
@ -326,6 +330,10 @@ protected:
|
||||||
void loadVertices();
|
void loadVertices();
|
||||||
//calculate Normal Line for each Vertex
|
//calculate Normal Line for each Vertex
|
||||||
void calculateNormal();
|
void calculateNormal();
|
||||||
|
//override
|
||||||
|
virtual void onEnter() override;
|
||||||
|
|
||||||
|
void cacheUniformLocation();
|
||||||
protected:
|
protected:
|
||||||
std::vector <ChunkLODIndices> _chunkLodIndicesSet;
|
std::vector <ChunkLODIndices> _chunkLodIndicesSet;
|
||||||
std::vector<ChunkLODIndicesSkirt> _chunkLodIndicesSkirtSet;
|
std::vector<ChunkLODIndicesSkirt> _chunkLodIndicesSkirtSet;
|
||||||
|
@ -350,12 +358,17 @@ protected:
|
||||||
int _maxDetailMapValue;
|
int _maxDetailMapValue;
|
||||||
cocos2d::Image * _heightMapImage;
|
cocos2d::Image * _heightMapImage;
|
||||||
Mat4 _oldCameraModelMatrix;
|
Mat4 _oldCameraModelMatrix;
|
||||||
Mat4 _oldTerrrainModelMatrix;
|
Mat4 _terrainModelMatrix;
|
||||||
bool _isTerrainModelMatrixChanged;
|
|
||||||
GLuint _normalLocation;
|
GLuint _normalLocation;
|
||||||
float m_maxHeight;
|
float m_maxHeight;
|
||||||
float m_minHeight;
|
float m_minHeight;
|
||||||
CrackFixedType _crackFixedType;
|
CrackFixedType _crackFixedType;
|
||||||
|
float _skirtRatio;
|
||||||
|
int _skirtVerticesOffset[4];
|
||||||
|
GLint _detailMapLocation[4];
|
||||||
|
GLint _alphaMapLocation;
|
||||||
|
GLint _alphaIsHasAlphaMapLocation;
|
||||||
|
GLint _detailMapSizeLocation[4];
|
||||||
};
|
};
|
||||||
|
|
||||||
// end of actions group
|
// end of actions group
|
||||||
|
|
|
@ -57,7 +57,7 @@ TerrainSimple::TerrainSimple()
|
||||||
_terrain->setMaxDetailMapAmount(4);
|
_terrain->setMaxDetailMapAmount(4);
|
||||||
addChild(_terrain);
|
addChild(_terrain);
|
||||||
_terrain->setCameraMask(2);
|
_terrain->setCameraMask(2);
|
||||||
_terrain->setDrawWire(true);
|
_terrain->setDrawWire(false);
|
||||||
auto listener = EventListenerTouchAllAtOnce::create();
|
auto listener = EventListenerTouchAllAtOnce::create();
|
||||||
listener->onTouchesMoved = CC_CALLBACK_2(TerrainSimple::onTouchesMoved, this);
|
listener->onTouchesMoved = CC_CALLBACK_2(TerrainSimple::onTouchesMoved, this);
|
||||||
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
|
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
|
||||||
|
@ -183,11 +183,12 @@ TerrainWalkThru::TerrainWalkThru()
|
||||||
Terrain::DetailMap r("TerrainTest/dirt.dds"),g("TerrainTest/Grass2.dds",10),b("TerrainTest/road.dds"),a("TerrainTest/GreenSkin.jpg",20);
|
Terrain::DetailMap r("TerrainTest/dirt.dds"),g("TerrainTest/Grass2.dds",10),b("TerrainTest/road.dds"),a("TerrainTest/GreenSkin.jpg",20);
|
||||||
|
|
||||||
Terrain::TerrainData data("TerrainTest/heightmap16.jpg","TerrainTest/alphamap.png",r,g,b,a,Size(32,32),40.0f,2);
|
Terrain::TerrainData data("TerrainTest/heightmap16.jpg","TerrainTest/alphamap.png",r,g,b,a,Size(32,32),40.0f,2);
|
||||||
_terrain = Terrain::create(data);
|
_terrain = Terrain::create(data,Terrain::CrackFixedType::SKIRT);
|
||||||
_terrain->setMaxDetailMapAmount(4);
|
_terrain->setMaxDetailMapAmount(4);
|
||||||
_terrain->setCameraMask(2);
|
_terrain->setCameraMask(2);
|
||||||
_terrain->setDrawWire(false);
|
_terrain->setDrawWire(false);
|
||||||
|
|
||||||
|
_terrain->setSkirtHeightRatio(3);
|
||||||
_terrain->setLODDistance(64,128,192);
|
_terrain->setLODDistance(64,128,192);
|
||||||
_player = Player::create("Sprite3DTest/girl.c3b",_camera,_terrain);
|
_player = Player::create("Sprite3DTest/girl.c3b",_camera,_terrain);
|
||||||
_player->setCameraMask(2);
|
_player->setCameraMask(2);
|
||||||
|
|
Loading…
Reference in New Issue