1
0
mirror of https://github.com/rwengine/openrw.git synced 2024-09-15 06:52:34 +02:00

UV data fixed

This commit is contained in:
Daniel Evans 2013-07-01 22:16:47 +01:00
parent 01a2575f8f
commit bc89bd0592
3 changed files with 115 additions and 39 deletions

View File

@ -41,7 +41,8 @@ std::unique_ptr<Model> LoaderDFF::loadFromMemory(char *data)
}
/** TEX COORDS **/
if (geometry.flags & RW::BSGeometry::TexCoords1 || geometry.flags & RW::BSGeometry::TexCoords2) {
if ((geometry.flags & RW::BSGeometry::TexCoords1) == RW::BSGeometry::TexCoords1 ||
(geometry.flags & RW::BSGeometry::TexCoords2) == RW::BSGeometry::TexCoords1) {
for (size_t v = 0; v < geometry.numverts; ++v) {
geometryStruct.texcoords.push_back(readStructure<RW::BSGeometryUV>(data, dataI));
}
@ -110,14 +111,40 @@ std::unique_ptr<Model> LoaderDFF::loadFromMemory(char *data)
glGenBuffers(1, &geometryStruct.VBO);
glGenBuffers(1, &geometryStruct.EBO);
size_t buffsize = (geometryStruct.vertices.size() * sizeof(float) * 3)
+ (geometryStruct.texcoords.size() * sizeof(float) * 2)
+ (geometryStruct.normals.size() * sizeof(float) * 3);
// Vertices
glBindBuffer(GL_ARRAY_BUFFER, geometryStruct.VBO);
glBufferData(
glBufferData(GL_ARRAY_BUFFER, buffsize, NULL, GL_STATIC_DRAW);
glBufferSubData(
GL_ARRAY_BUFFER,
geometryStruct.vertices.size() * 3 * sizeof(float),
&geometryStruct.vertices[0],
GL_STATIC_DRAW
0,
(geometryStruct.vertices.size() * sizeof(float) * 3),
&geometryStruct.vertices[0]
);
if(geometryStruct.texcoords.size() > 0)
{
glBufferSubData(
GL_ARRAY_BUFFER,
(geometryStruct.vertices.size() * sizeof(float) * 3),
(geometryStruct.texcoords.size() * sizeof(float) * 2),
&geometryStruct.texcoords[0]
);
}
if(geometryStruct.normals.size() > 0 )
{
glBufferSubData(
GL_ARRAY_BUFFER,
(geometryStruct.vertices.size() * sizeof(float) * 3) + (geometryStruct.texcoords.size() * sizeof(float) * 2),
geometryStruct.normals.size() * 3 * sizeof(float),
&geometryStruct.normals[0]
);
}
// Elements
uint16_t indicies[geometryStruct.triangles.size() * 3];

View File

@ -33,45 +33,94 @@ bool TextureLoader::loadFromMemory(char *data)
continue;
auto texNative = rootSection.readStructure<RW::BSTextureNative>();
if ( ! (texNative.rasterformat & RW::BSTextureNative::FORMAT_EXT_PAL8))
if(texNative.platform != 8)
{
std::cerr << "Unsupported texture platform " << std::dec << texNative.platform << std::endl;
continue;
auto palette = rootSection.readSubStructure<RW::BSPaletteData>(sizeof(RW::BSTextureNative));
auto coldata = rootSection.raw() + sizeof(RW::BSTextureNative) + sizeof(RW::BSPaletteData);
uint8_t fullColor[texNative.width * texNative.height * 4];
for (size_t y = 0; y < texNative.height; y++) {
for (size_t x = 0; x < texNative.width; x++) {
size_t texI = ((y * texNative.width) + x) * 4;
size_t palI = 4 * static_cast<size_t>(
coldata[(y * texNative.width) + x]
);
fullColor[texI+0] = palette.palette[palI+2];
fullColor[texI+1] = palette.palette[palI+1];
fullColor[texI+2] = palette.palette[palI+0];
fullColor[texI+3] = palette.palette[palI+3];
}
}
GLuint texture = 0;
if((texNative.rasterformat & RW::BSTextureNative::FORMAT_EXT_PAL8) == RW::BSTextureNative::FORMAT_EXT_PAL8)
{
auto palette = rootSection.readSubStructure<RW::BSPaletteData>(sizeof(RW::BSTextureNative));
auto coldata = rootSection.raw() + sizeof(RW::BSTextureNative) + sizeof(RW::BSPaletteData);
GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
// todo: not completely ignore everything the TXD says.
glTexImage2D(
GL_TEXTURE_2D, 0, GL_RGBA,
texNative.width, texNative.height, 0,
GL_BGRA, GL_UNSIGNED_BYTE, fullColor
);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
uint8_t fullColor[texNative.width * texNative.height * 4];
glGenerateMipmap(GL_TEXTURE_2D);
for (size_t y = 0; y < texNative.height; y++) {
for (size_t x = 0; x < texNative.width; x++) {
size_t texI = ((y * texNative.width) + x) * 4;
size_t palI = 4 * static_cast<size_t>(
coldata[(y * texNative.width) + x]
);
std::string name = std::string(texNative.diffuseName);
fullColor[texI+0] = palette.palette[palI+2];
fullColor[texI+1] = palette.palette[palI+1];
fullColor[texI+2] = palette.palette[palI+0];
fullColor[texI+3] = palette.palette[palI+3];
}
}
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(
GL_TEXTURE_2D, 0, GL_RGBA,
texNative.width, texNative.height, 0,
GL_BGRA, GL_UNSIGNED_BYTE, fullColor
);
}
else if(
texNative.rasterformat == RW::BSTextureNative::FORMAT_1555 ||
texNative.rasterformat == RW::BSTextureNative::FORMAT_8888 ||
texNative.rasterformat == RW::BSTextureNative::FORMAT_888
)
{
auto coldata = rootSection.raw() + sizeof(RW::BSTextureNative) + sizeof(uint32_t);
GLenum type, format;
switch(texNative.rasterformat)
{
case RW::BSTextureNative::FORMAT_1555:
format = GL_RGBA;
type = GL_UNSIGNED_SHORT_1_5_5_5_REV;
break;
case RW::BSTextureNative::FORMAT_8888:
format = GL_BGRA;
type = GL_UNSIGNED_BYTE;
break;
case RW::BSTextureNative::FORMAT_888:
format = GL_BGR;
type = GL_UNSIGNED_BYTE;
break;
}
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(
GL_TEXTURE_2D, 0, GL_RGBA,
texNative.width, texNative.height, 0,
format, type, coldata
);
}
else
{
std::cerr << "Unsuported raster format " << std::hex << texNative.rasterformat << std::endl;
}
if(texture != 0)
{
// todo: not completely ignore everything the TXD says.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
textures[name] = texture;
glGenerateMipmap(GL_TEXTURE_2D);
std::string name = std::string(texNative.diffuseName);
textures[name] = texture;
}
// std::cout << "Loaded texture '" << name << "'" << std::endl;
}

View File

@ -217,7 +217,7 @@ void render()
glBindBuffer(GL_ARRAY_BUFFER, model->geometries[g].VBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, model->geometries[g].EBO);
glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 0, 0);
glVertexAttribPointer(texAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0);
glVertexAttribPointer(texAttrib, 2, GL_FLOAT, GL_FALSE, 0, (void*)(model->geometries[g].vertices.size() * sizeof(float) * 3));
glEnableVertexAttribArray(posAttrib);
glEnableVertexAttribArray(texAttrib);