1
0
mirror of https://github.com/rwengine/openrw.git synced 2024-10-06 09:07:19 +02:00

Improved colour representation

This commit is contained in:
Daniel Evans 2014-02-10 09:22:12 +00:00
parent d9bb0be308
commit be39a691cf
5 changed files with 29 additions and 19 deletions

View File

@ -148,7 +148,8 @@ void dumpModelFile(char* data)
std::cout << " Vertex Colours Present" << std::endl;
for(size_t v = 0; v < geom.numverts; ++v)
{
std::cout << " " << v << ": " << static_cast<unsigned long>(readStructure<BSColor>(data, dataI)) << std::endl;
auto c = readStructure<BSColor>(data, dataI);
std::cout << " " << v << ": " << c.r << " " << c.g << " " << c.b << std::endl;
}
}
@ -210,7 +211,7 @@ void dumpModelFile(char* data)
auto material = readStructure<BSMaterial>(data, dataI);
std::cout << " Material Data" << std::endl;
std::cout << " Textures = " << std::dec << material.numtextures << std::endl;
std::cout << " Color = 0x" << std::hex << material.color << std::endl;
std::cout << " Color = " << material.color.r << " " << material.color.g << " " << material.color.b << std::endl;
for(size_t t = 0; t < material.numtextures; ++t)
{

View File

@ -111,7 +111,7 @@ namespace RW
};
};
typedef uint32_t BSColor;
typedef glm::detail::tvec4<uint8_t> BSColor;
struct BSGeometryColor
{

View File

@ -77,9 +77,16 @@ public:
std::string alphaName;
};
enum {
MTF_PrimaryColour = 1 << 0,
MTF_SecondaryColour = 1 << 1
};
struct Material {
std::vector<Texture> textures;
uint32_t colour;
glm::detail::tvec4<uint8_t> colour;
uint8_t flags;
float diffuseIntensity;
float ambientIntensity;

View File

@ -94,11 +94,7 @@ Model* LoaderDFF::loadFromMemory(char *data, GameData *gameData)
if ((geometry.flags & RW::BSGeometry::VertexColors) == RW::BSGeometry::VertexColors) {
for (size_t v = 0; v < geometry.numverts; ++v) {
auto s = readStructure<RW::BSColor>(data, dataI);
size_t R = s % 256; s /= 256;
size_t G = s % 256; s /= 256;
size_t B = s % 256; s /= 256;
size_t A = s % 256;
vertices[v].colour = glm::vec4(R/255.f, G/255.f, B/255.f, A/255.f);
vertices[v].colour = glm::vec4(s.r/255.f, s.g/255.f, s.b/255.f, s.a/255.f);
}
}
else {
@ -188,6 +184,14 @@ Model* LoaderDFF::loadFromMemory(char *data, GameData *gameData)
geom->materials[m].colour = material.color;
geom->materials[m].diffuseIntensity = material.diffuse;
geom->materials[m].ambientIntensity = material.ambient;
geom->materials[m].flags = 0;
if( material.color.r == 60 && material.color.g == 255 && material.color.b == 0 ) {
geom->materials[m].flags |= Model::MTF_PrimaryColour;
}
else if( material.color.r == 255 && material.color.g == 0 && material.color.b == 175 ) {
geom->materials[m].flags |= Model::MTF_SecondaryColour;
}
size_t texI = 0;
materialsec.getNextChildSection(texI);
@ -255,6 +259,8 @@ Model* LoaderDFF::loadFromMemory(char *data, GameData *gameData)
}
/* Upload Vertex Data */
geom->dbuff.setFaceType(geom->facetype == Model::Triangles ?
GL_TRIANGLES : GL_TRIANGLE_STRIP);
/* uploadVertices uses magic to determine what is inside vertices */
geom->gbuff.uploadVertices(vertices);

View File

@ -498,24 +498,21 @@ bool GTARenderer::renderSubgeometry(Model* model, size_t g, size_t sg, const glm
}
if( (model->geometries[g]->flags & RW::BSGeometry::ModuleMaterialColor) == RW::BSGeometry::ModuleMaterialColor) {
auto colmasked = mat.colour;
size_t R = colmasked % 256; colmasked /= 256;
size_t G = colmasked % 256; colmasked /= 256;
size_t B = colmasked % 256; colmasked /= 256;
auto col = mat.colour;
if( object && object->type() == GTAObject::Vehicle ) {
auto vehicle = static_cast<GTAVehicle*>(object);
if( R == 60 && G == 255 && B == 0 ) {
if( (mat.flags&Model::MTF_PrimaryColour) != 0 ) {
glUniform4f(uniCol, vehicle->colourPrimary.r, vehicle->colourPrimary.g, vehicle->colourPrimary.b, 1.f);
}
else if( R == 255 && G == 0 && B == 175 ) {
else if( (mat.flags&Model::MTF_SecondaryColour) != 0 ) {
glUniform4f(uniCol, vehicle->colourSecondary.r, vehicle->colourSecondary.g, vehicle->colourSecondary.b, 1.f);
}
else {
glUniform4f(uniCol, R/255.f, G/255.f, B/255.f, 1.f);
glUniform4f(uniCol, col.r/255.f, col.g/255.f, col.b/255.f, 1.f);
}
}
else {
glUniform4f(uniCol, R/255.f, G/255.f, B/255.f, 1.f);
glUniform4f(uniCol, col.r/255.f, col.g/255.f, col.b/255.f, 1.f);
}
}
@ -525,8 +522,7 @@ bool GTARenderer::renderSubgeometry(Model* model, size_t g, size_t sg, const glm
rendered++;
glDrawElements((model->geometries[g]->facetype == Model::Triangles ?
GL_TRIANGLES : GL_TRIANGLE_STRIP),
glDrawElements(model->geometries[g]->dbuff.getFaceType(),
subgeom.numIndices, GL_UNSIGNED_INT, (void*)(sizeof(uint32_t) * subgeom.start));
return true;