Bonsoir,
J'essaye en ce moment d'écrire une Scene node de terrain, à partir d'une heightmap évidemment.
Je ne parviens pas à le texturer.
Lors du rendu, j'ai mis une lumière ambiente mais le terrain reste noir.
Les paramètres du Material ne semblent pas être pris en compte par le driver video
lors du rendu (le paramètre Wireframe n'influence pas le rendu, par exemple)
Voici son code source, vraiment basique :
\\*
STerrainMeshSceneNode hérite de ISceneNode
*/
void STerrainMeshSceneNode::loadFromHeightMap(video::ITexture *heightMap)
{
if(heightMap != NULL)
{
if(heightMap->getSize().Height == heightMap->getSize().Width)
{
mSize = heightMap->getSize().Height;
scene::SMeshBufferLightMap *meshBuffer = new scene::SMeshBufferLightMap;
meshBuffer->Vertices.set_used(mSize*mSize);
meshBuffer->Indices.set_used(6*mSize*mSize);
meshBuffer->Indices.clear();
setMaterialFlag(video::EMF_WIREFRAME, true);
setMaterialFlag(video::EMF_LIGHTING, true);
setMaterialTexture(0, heightMap);
video::S3DVertex2TCoords vertex;
vertex.Normal.set( 0.0f, 1.0f, 0.0f );
vertex.Color = video::SColor(255, 127, 127, 127);
void* data = heightMap->lock();
if(heightMap->getColorFormat() != video::ECF_A8R8G8B8)
throw Exception("terrainSceneNode::loadFromTexture", "Impossible de charger la heightmap : format de couleur invalide.\
");
int vertexCount = 0;
for(int x = 0; x < mSize; x++)
{
for(int z = 0; z < mSize; z++)
{
vertex.Pos.X = (f32)x*2;
video::SColor pixelColor(video::SColor(((u32*)data)[x*mSize+z]));
vertex.Pos.Y = (f32)pixelColor.getRed()*0.25;
vertex.Pos.Z = (f32)z*2;
vertex.TCoords.X = vertex.TCoords2.X = x;
vertex.TCoords.Y = vertex.TCoords2.Y = z;
meshBuffer->Vertices[x*mSize+z] = vertex;
vertexCount++;
if(x < mSize && z < mSize)
{
meshBuffer->Indices.push_back(x*mSize+z);
meshBuffer->Indices.push_back(x*mSize+z+1);
meshBuffer->Indices.push_back((x+1)*mSize+z+1);
meshBuffer->Indices.push_back((x+1)*mSize+z+1);
meshBuffer->Indices.push_back((x+1)*mSize+z);
meshBuffer->Indices.push_back(x*mSize+z);
}
}
}
mMeshBuffer = meshBuffer;
heightMap->unlock();
cout << "Loaded "<<mMeshBuffer->getIndexCount()<<" indices ("<<mMeshBuffer->getVertexCount()<<"x6 = "<<mMeshBuffer->getVertexCount()*6<<")\
";
}
else throw Exception("STerrainMeshSceneNode::loadFromHeightMap", "La texture n'est pas carrée.");
}
else throw Exception("STerrainMeshSceneNode::loadFromHeightMap", "Texture invalide.");
}
void STerrainMeshSceneNode::saveToTexture(video::IImage *heightMap)
{
}
/**
* La méthode de rendu...
*/
void STerrainMeshSceneNode::render()
{
if(IsVisible)
SceneManager->getVideoDriver()->drawMeshBuffer(mMeshBuffer);
}
Merci !