Added some OpenGL specific code.

This commit is contained in:
Angelo Papenhoff 2014-12-24 11:38:25 +01:00
parent a2982d58e4
commit 521656dc1e
5 changed files with 93 additions and 27 deletions

View File

@ -4,7 +4,7 @@ SRC := $(patsubst %.cpp,$(SRCDIR)/%.cpp, rwbase.cpp clump.cpp\
geometry.cpp plugins.cpp ps2.cpp\ geometry.cpp plugins.cpp ps2.cpp\
ogl.cpp) ogl.cpp)
OBJ := $(patsubst $(SRCDIR)/%.cpp,$(BUILDDIR)/%.o,$(SRC)) OBJ := $(patsubst $(SRCDIR)/%.cpp,$(BUILDDIR)/%.o,$(SRC))
OBJ := $(patsubst $(SRCDIR)/%.cpp,$(BUILDDIR)/%.d,$(SRC)) DEP := $(patsubst $(SRCDIR)/%.cpp,$(BUILDDIR)/%.d,$(SRC))
CFLAGS=-Wall -Wextra -g #-Wno-parentheses #-Wconversion CFLAGS=-Wall -Wextra -g #-Wno-parentheses #-Wconversion
librw.a: $(OBJ) librw.a: $(OBJ)

View File

@ -19,6 +19,12 @@ Frame::Frame(void)
this->child = NULL; this->child = NULL;
this->next = NULL; this->next = NULL;
this->root = NULL; this->root = NULL;
for(int i = 0; i < 16; i++)
this->matrix[i] = 0.0f;
this->matrix[0] = 1.0f;
this->matrix[5] = 1.0f;
this->matrix[10] = 1.0f;
this->matrix[15] = 1.0f;
constructPlugins(); constructPlugins();
} }

View File

@ -11,17 +11,20 @@
#include "rwobjects.h" #include "rwobjects.h"
#include "rwogl.h" #include "rwogl.h"
#include <GL/glew.h>
using namespace std; using namespace std;
namespace Rw { namespace Rw {
namespace Gl {
void* void*
DestroyNativeDataOGL(void *object, int32, int32) DestroyNativeData(void *object, int32, int32)
{ {
Geometry *geometry = (Geometry*)object; Geometry *geometry = (Geometry*)object;
assert(geometry->instData->platform == PLATFORM_OGL); assert(geometry->instData->platform == PLATFORM_OGL);
OGLInstanceDataHeader *header = InstanceDataHeader *header =
(OGLInstanceDataHeader*)geometry->instData; (InstanceDataHeader*)geometry->instData;
delete[] header->attribs; delete[] header->attribs;
delete[] header->data; delete[] header->data;
delete header; delete header;
@ -29,16 +32,18 @@ DestroyNativeDataOGL(void *object, int32, int32)
} }
void void
ReadNativeDataOGL(istream &stream, int32, void *object, int32, int32) ReadNativeData(istream &stream, int32, void *object, int32, int32)
{ {
Geometry *geometry = (Geometry*)object; Geometry *geometry = (Geometry*)object;
OGLInstanceDataHeader *header = new OGLInstanceDataHeader; InstanceDataHeader *header = new InstanceDataHeader;
geometry->instData = header; geometry->instData = header;
header->platform = PLATFORM_OGL; header->platform = PLATFORM_OGL;
header->vbo = 0;
header->ibo = 0;
header->numAttribs = readUInt32(stream); header->numAttribs = readUInt32(stream);
header->attribs = new OGLAttrib[header->numAttribs]; header->attribs = new AttribDesc[header->numAttribs];
stream.read((char*)header->attribs, stream.read((char*)header->attribs,
header->numAttribs*sizeof(OGLAttrib)); header->numAttribs*sizeof(AttribDesc));
// Any better way to find out the size? (header length can be wrong) // Any better way to find out the size? (header length can be wrong)
header->dataSize = header->attribs[0].stride*geometry->numVertices; header->dataSize = header->attribs[0].stride*geometry->numVertices;
header->data = new uint8[header->dataSize]; header->data = new uint8[header->dataSize];
@ -46,26 +51,72 @@ ReadNativeDataOGL(istream &stream, int32, void *object, int32, int32)
} }
void void
WriteNativeDataOGL(ostream &stream, int32 len, void *object, int32, int32) WriteNativeData(ostream &stream, int32 len, void *object, int32, int32)
{ {
Geometry *geometry = (Geometry*)object; Geometry *geometry = (Geometry*)object;
assert(geometry->instData->platform == PLATFORM_OGL); assert(geometry->instData->platform == PLATFORM_OGL);
OGLInstanceDataHeader *header = InstanceDataHeader *header =
(OGLInstanceDataHeader*)geometry->instData; (InstanceDataHeader*)geometry->instData;
writeUInt32(header->numAttribs, stream); writeUInt32(header->numAttribs, stream);
stream.write((char*)header->attribs, stream.write((char*)header->attribs,
header->numAttribs*sizeof(OGLAttrib)); header->numAttribs*sizeof(AttribDesc));
stream.write((char*)header->data, header->dataSize); stream.write((char*)header->data, header->dataSize);
} }
int32 int32
GetSizeNativeDataOGL(void *object, int32, int32) GetSizeNativeData(void *object, int32, int32)
{ {
Geometry *geometry = (Geometry*)object; Geometry *geometry = (Geometry*)object;
assert(geometry->instData->platform == PLATFORM_OGL); assert(geometry->instData->platform == PLATFORM_OGL);
OGLInstanceDataHeader *header = InstanceDataHeader *header =
(OGLInstanceDataHeader*)geometry->instData; (InstanceDataHeader*)geometry->instData;
return 4 + header->numAttribs*sizeof(OGLAttrib) + header->dataSize; return 4 + header->numAttribs*sizeof(AttribDesc) + header->dataSize;
}
void
UploadGeo(Geometry *geo)
{
using namespace Rw;
InstanceDataHeader *inst = (InstanceDataHeader*)geo->instData;
MeshHeader *meshHeader = geo->meshHeader;
glGenBuffers(1, &inst->vbo);
glBindBuffer(GL_ARRAY_BUFFER, inst->vbo);
glBufferData(GL_ARRAY_BUFFER, inst->dataSize,
inst->data, GL_STATIC_DRAW);
glGenBuffers(1, &inst->ibo);
glBindBuffer(GL_ARRAY_BUFFER, inst->ibo);
glBufferData(GL_ARRAY_BUFFER, meshHeader->totalIndices*2,
0, GL_STATIC_DRAW);
GLintptr offset = 0;
for(uint32 i = 0; i < meshHeader->numMeshes; i++){
Mesh *mesh = &meshHeader->mesh[i];
glBufferSubData(GL_ARRAY_BUFFER, offset, mesh->numIndices*2,
mesh->indices);
offset += mesh->numIndices*2;
}
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
void
SetAttribPointers(InstanceDataHeader *inst)
{
using namespace Rw;
static GLenum attribType[] = {
GL_FLOAT,
GL_BYTE, GL_UNSIGNED_BYTE,
GL_SHORT, GL_UNSIGNED_SHORT
};
for(int32 i = 0; i < inst->numAttribs; i++){
AttribDesc *a = &inst->attribs[i];
glEnableVertexAttribArray(a->index);
glVertexAttribPointer(a->index, a->size, attribType[a->type],
a->normalized, a->stride,
(void*)(uint64)a->offset);
}
} }
} }
}

View File

@ -199,7 +199,7 @@ destroyNativeData(void *object, int32 offset, int32 size)
if(geometry->instData->platform == PLATFORM_PS2) if(geometry->instData->platform == PLATFORM_PS2)
return DestroyNativeDataPS2(object, offset, size); return DestroyNativeDataPS2(object, offset, size);
if(geometry->instData->platform == PLATFORM_OGL) if(geometry->instData->platform == PLATFORM_OGL)
return DestroyNativeDataOGL(object, offset, size); return Gl::DestroyNativeData(object, offset, size);
return object; return object;
} }
@ -224,7 +224,7 @@ readNativeData(istream &stream, int32 len, void *object, int32 o, int32 s)
stream.seekg(len, ios::cur); stream.seekg(len, ios::cur);
}else{ }else{
stream.seekg(-12, ios::cur); stream.seekg(-12, ios::cur);
ReadNativeDataOGL(stream, len, object, o, s); Gl::ReadNativeData(stream, len, object, o, s);
} }
} }
@ -237,7 +237,7 @@ writeNativeData(ostream &stream, int32 len, void *object, int32 o, int32 s)
if(geometry->instData->platform == PLATFORM_PS2) if(geometry->instData->platform == PLATFORM_PS2)
WriteNativeDataPS2(stream, len, object, o, s); WriteNativeDataPS2(stream, len, object, o, s);
else if(geometry->instData->platform == PLATFORM_OGL) else if(geometry->instData->platform == PLATFORM_OGL)
WriteNativeDataOGL(stream, len, object, o, s); Gl::WriteNativeData(stream, len, object, o, s);
} }
static int32 static int32
@ -251,7 +251,7 @@ getSizeNativeData(void *object, int32 offset, int32 size)
else if(geometry->instData->platform == PLATFORM_XBOX) else if(geometry->instData->platform == PLATFORM_XBOX)
return -1; return -1;
else if(geometry->instData->platform == PLATFORM_OGL) else if(geometry->instData->platform == PLATFORM_OGL)
return GetSizeNativeDataOGL(object, offset, size); return Gl::GetSizeNativeData(object, offset, size);
return -1; return -1;
} }

View File

@ -1,6 +1,7 @@
namespace Rw { namespace Rw {
namespace Gl {
struct OGLAttrib struct AttribDesc
{ {
// arguments to glVertexAttribPointer (should use OpenGL types here) // arguments to glVertexAttribPointer (should use OpenGL types here)
// Vertex = 0, TexCoord, Normal, Color, Weight, Bone Index // Vertex = 0, TexCoord, Normal, Color, Weight, Bone Index
@ -13,17 +14,25 @@ struct OGLAttrib
uint32 offset; uint32 offset;
}; };
struct OGLInstanceDataHeader : InstanceDataHeader struct InstanceDataHeader : Rw::InstanceDataHeader
{ {
int32 numAttribs; int32 numAttribs;
OGLAttrib *attribs; AttribDesc *attribs;
uint32 dataSize; uint32 dataSize;
uint8 *data; uint8 *data;
// needed for rendering
uint32 vbo;
uint32 ibo;
}; };
void *DestroyNativeDataOGL(void *object, int32, int32); void *DestroyNativeData(void *object, int32, int32);
void ReadNativeDataOGL(std::istream &stream, int32 len, void *object, int32, int32); void ReadNativeData(std::istream &stream, int32 len, void *object, int32, int32);
void WriteNativeDataOGL(std::ostream &stream, int32 len, void *object, int32, int32); void WriteNativeData(std::ostream &stream, int32 len, void *object, int32, int32);
int32 GetSizeNativeDataOGL(void *object, int32, int32); int32 GetSizeNativeData(void *object, int32, int32);
void UploadGeo(Geometry *geo);
void SetAttribPointers(InstanceDataHeader *inst);
} }
}