Match vertex colors data type to source

pull/2234/head
bzzt 6 years ago committed by Capostrophic
parent 0ab0e6ef93
commit e131e6699c

@ -158,7 +158,7 @@ namespace ESMTerrain
normal.normalize(); normal.normalize();
} }
void Storage::fixColour (osg::Vec4f& color, int cellX, int cellY, int col, int row, LandCache& cache) void Storage::fixColour (osg::Vec4ub& color, int cellX, int cellY, int col, int row, LandCache& cache)
{ {
if (col == ESM::Land::LAND_SIZE-1) if (col == ESM::Land::LAND_SIZE-1)
{ {
@ -175,22 +175,22 @@ namespace ESMTerrain
const ESM::Land::LandData* data = land ? land->getData(ESM::Land::DATA_VCLR) : 0; const ESM::Land::LandData* data = land ? land->getData(ESM::Land::DATA_VCLR) : 0;
if (data) if (data)
{ {
color.r() = data->mColours[col*ESM::Land::LAND_SIZE*3+row*3] / 255.f; color.r() = data->mColours[col*ESM::Land::LAND_SIZE*3+row*3];
color.g() = data->mColours[col*ESM::Land::LAND_SIZE*3+row*3+1] / 255.f; color.g() = data->mColours[col*ESM::Land::LAND_SIZE*3+row*3+1];
color.b() = data->mColours[col*ESM::Land::LAND_SIZE*3+row*3+2] / 255.f; color.b() = data->mColours[col*ESM::Land::LAND_SIZE*3+row*3+2];
} }
else else
{ {
color.r() = 1; color.r() = 255;
color.g() = 1; color.g() = 255;
color.b() = 1; color.b() = 255;
} }
} }
void Storage::fillVertexBuffers (int lodLevel, float size, const osg::Vec2f& center, void Storage::fillVertexBuffers (int lodLevel, float size, const osg::Vec2f& center,
osg::ref_ptr<osg::Vec3Array> positions, osg::ref_ptr<osg::Vec3Array> positions,
osg::ref_ptr<osg::Vec3Array> normals, osg::ref_ptr<osg::Vec3Array> normals,
osg::ref_ptr<osg::Vec4Array> colours) osg::ref_ptr<osg::Vec4ubArray> colours)
{ {
// LOD level n means every 2^n-th vertex is kept // LOD level n means every 2^n-th vertex is kept
size_t increment = static_cast<size_t>(1) << lodLevel; size_t increment = static_cast<size_t>(1) << lodLevel;
@ -207,7 +207,7 @@ namespace ESMTerrain
colours->resize(numVerts*numVerts); colours->resize(numVerts*numVerts);
osg::Vec3f normal; osg::Vec3f normal;
osg::Vec4f color; osg::Vec4ub color;
float vertY = 0; float vertY = 0;
float vertX = 0; float vertX = 0;
@ -295,20 +295,20 @@ namespace ESMTerrain
if (colourData) if (colourData)
{ {
for (int i=0; i<3; ++i) for (int i=0; i<3; ++i)
color[i] = colourData->mColours[srcArrayIndex+i] / 255.f; color[i] = colourData->mColours[srcArrayIndex+i];
} }
else else
{ {
color.r() = 1; color.r() = 255;
color.g() = 1; color.g() = 255;
color.b() = 1; color.b() = 255;
} }
// Unlike normals, colors mostly connect seamlessly between cells, but not always... // Unlike normals, colors mostly connect seamlessly between cells, but not always...
if (col == ESM::Land::LAND_SIZE-1 || row == ESM::Land::LAND_SIZE-1) if (col == ESM::Land::LAND_SIZE-1 || row == ESM::Land::LAND_SIZE-1)
fixColour(color, cellX, cellY, col, row, cache); fixColour(color, cellX, cellY, col, row, cache);
color.a() = 1; color.a() = 255;
(*colours)[static_cast<unsigned int>(vertX*numVerts + vertY)] = color; (*colours)[static_cast<unsigned int>(vertX*numVerts + vertY)] = color;

@ -75,7 +75,7 @@ namespace ESMTerrain
virtual void fillVertexBuffers (int lodLevel, float size, const osg::Vec2f& center, virtual void fillVertexBuffers (int lodLevel, float size, const osg::Vec2f& center,
osg::ref_ptr<osg::Vec3Array> positions, osg::ref_ptr<osg::Vec3Array> positions,
osg::ref_ptr<osg::Vec3Array> normals, osg::ref_ptr<osg::Vec3Array> normals,
osg::ref_ptr<osg::Vec4Array> colours); osg::ref_ptr<osg::Vec4ubArray> colours);
/// Create textures holding layer blend values for a terrain chunk. /// Create textures holding layer blend values for a terrain chunk.
/// @note The terrain chunk shouldn't be larger than one cell since otherwise we might /// @note The terrain chunk shouldn't be larger than one cell since otherwise we might
@ -106,7 +106,7 @@ namespace ESMTerrain
const VFS::Manager* mVFS; const VFS::Manager* mVFS;
void fixNormal (osg::Vec3f& normal, int cellX, int cellY, int col, int row, LandCache& cache); void fixNormal (osg::Vec3f& normal, int cellX, int cellY, int col, int row, LandCache& cache);
void fixColour (osg::Vec4f& colour, int cellX, int cellY, int col, int row, LandCache& cache); void fixColour (osg::Vec4ub& colour, int cellX, int cellY, int col, int row, LandCache& cache);
void averageNormal (osg::Vec3f& normal, int cellX, int cellY, int col, int row, LandCache& cache); void averageNormal (osg::Vec3f& normal, int cellX, int cellY, int col, int row, LandCache& cache);
float getVertexHeight (const ESM::Land::LandData* data, int x, int y); float getVertexHeight (const ESM::Land::LandData* data, int x, int y);

@ -172,7 +172,8 @@ osg::ref_ptr<osg::Node> ChunkManager::createChunk(float chunkSize, const osg::Ve
osg::ref_ptr<osg::Vec3Array> positions (new osg::Vec3Array); osg::ref_ptr<osg::Vec3Array> positions (new osg::Vec3Array);
osg::ref_ptr<osg::Vec3Array> normals (new osg::Vec3Array); osg::ref_ptr<osg::Vec3Array> normals (new osg::Vec3Array);
osg::ref_ptr<osg::Vec4Array> colors (new osg::Vec4Array); osg::ref_ptr<osg::Vec4ubArray> colors (new osg::Vec4ubArray);
colors->setNormalize(true);
osg::ref_ptr<osg::VertexBufferObject> vbo (new osg::VertexBufferObject); osg::ref_ptr<osg::VertexBufferObject> vbo (new osg::VertexBufferObject);
positions->setVertexBufferObject(vbo); positions->setVertexBufferObject(vbo);

@ -52,7 +52,7 @@ namespace Terrain
virtual void fillVertexBuffers (int lodLevel, float size, const osg::Vec2f& center, virtual void fillVertexBuffers (int lodLevel, float size, const osg::Vec2f& center,
osg::ref_ptr<osg::Vec3Array> positions, osg::ref_ptr<osg::Vec3Array> positions,
osg::ref_ptr<osg::Vec3Array> normals, osg::ref_ptr<osg::Vec3Array> normals,
osg::ref_ptr<osg::Vec4Array> colours) = 0; osg::ref_ptr<osg::Vec4ubArray> colours) = 0;
typedef std::vector<osg::ref_ptr<osg::Image> > ImageVector; typedef std::vector<osg::ref_ptr<osg::Image> > ImageVector;
/// Create textures holding layer blend values for a terrain chunk. /// Create textures holding layer blend values for a terrain chunk.

Loading…
Cancel
Save