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:
parent
d9bb0be308
commit
be39a691cf
@ -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)
|
||||
{
|
||||
|
@ -111,7 +111,7 @@ namespace RW
|
||||
};
|
||||
};
|
||||
|
||||
typedef uint32_t BSColor;
|
||||
typedef glm::detail::tvec4<uint8_t> BSColor;
|
||||
|
||||
struct BSGeometryColor
|
||||
{
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user