Symbian^3 port

This commit is contained in:
Shinovon 2026-04-29 05:15:13 +05:00
parent 77cdaaf97e
commit 3eb71f2cc5
106 changed files with 2098 additions and 745 deletions

View file

@ -25,7 +25,7 @@ namespace gl3 {
#ifdef RW_OPENGL
static Shader *skinShader, *skinShader_noAT;
static Shader *skinShader_fullLight, *skinShader_fullLight_noAT;
//static Shader *skinShader_fullLight, *skinShader_fullLight_noAT;
static int32 u_boneMatrices;
void
@ -189,17 +189,9 @@ skinInstanceCB(Geometry *geo, InstanceDataHeader *header, bool32 reinstance)
header->totalNumVertex, a->stride);
}
#ifdef RW_GL_USE_VAOS
glBindVertexArray(header->vao);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, header->ibo);
#endif
glBindBuffer(GL_ARRAY_BUFFER, header->vbo);
glBufferData(GL_ARRAY_BUFFER, header->totalNumVertex*attribs[0].stride,
header->vertexBuffer, GL_STATIC_DRAW);
#ifdef RW_GL_USE_VAOS
setAttribPointers(header->attribDesc, header->numAttribs);
glBindVertexArray(0);
#endif
}
void
@ -208,7 +200,8 @@ skinUninstanceCB(Geometry *geo, InstanceDataHeader *header)
assert(0 && "can't uninstance");
}
static float skinMatrices[64*16];
#define MAX_BONES 24
static float skinMatrices[MAX_BONES*16];
void
uploadSkinMatrices(Atomic *a)
@ -218,13 +211,18 @@ uploadSkinMatrices(Atomic *a)
Matrix *m = (Matrix*)skinMatrices;
HAnimHierarchy *hier = Skin::getHierarchy(a);
int numBones = skin->numBones;
if (numBones > MAX_BONES) numBones = MAX_BONES;
if(hier){
Matrix *invMats = (Matrix*)skin->inverseMatrices;
Matrix tmp;
int numNodes = hier->numNodes;
if (numNodes > MAX_BONES) numNodes = MAX_BONES;
assert(skin->numBones == hier->numNodes);
if(hier->flags & HAnimHierarchy::LOCALSPACEMATRICES){
for(i = 0; i < hier->numNodes; i++){
for(i = 0; i < numNodes; i++){
invMats[i].flags = 0;
Matrix::mult(m, &invMats[i], &hier->matrices[i]);
m++;
@ -232,7 +230,7 @@ uploadSkinMatrices(Atomic *a)
}else{
Matrix invAtmMat;
Matrix::invert(&invAtmMat, a->getFrame()->getLTM());
for(i = 0; i < hier->numNodes; i++){
for(i = 0; i < numNodes; i++){
invMats[i].flags = 0;
Matrix::mult(&tmp, &hier->matrices[i], &invAtmMat);
Matrix::mult(m, &invMats[i], &tmp);
@ -240,7 +238,7 @@ uploadSkinMatrices(Atomic *a)
}
}
}else{
for(i = 0; i < skin->numBones; i++){
for(i = 0; i < numBones; i++){
m->setIdentity();
m++;
}
@ -273,18 +271,20 @@ skinRenderCB(Atomic *atomic, InstanceDataHeader *header)
rw::SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 0xFF);
if((vsBits & VSLIGHT_MASK) == 0){
// if((vsBits & VSLIGHT_MASK) == 0){
if(getAlphaTest())
skinShader->use();
else
skinShader_noAT->use();
}else{
if(getAlphaTest())
skinShader_fullLight->use();
else
skinShader_fullLight_noAT->use();
}
// }else{
// if(getAlphaTest())
// skinShader_fullLight->use();
// else
// skinShader_fullLight_noAT->use();
// }
// defaultShader->use();
drawInst(header, inst);
inst++;
}
@ -295,7 +295,7 @@ static void*
skinOpen(void *o, int32, int32)
{
skinGlobals.pipelines[PLATFORM_GL3] = makeSkinPipeline();
#include "shaders/simple_fs_gl.inc"
#include "shaders/skin_gl.inc"
const char *vs[] = { shaderDecl, header_vert_src, skin_vert_src, nil };
@ -307,11 +307,11 @@ skinOpen(void *o, int32, int32)
assert(skinShader);
skinShader_noAT = Shader::create(vs, fs_noAT);
assert(skinShader_noAT);
skinShader_fullLight = Shader::create(vs_fullLight, fs);
assert(skinShader_fullLight);
skinShader_fullLight_noAT = Shader::create(vs_fullLight, fs_noAT);
assert(skinShader_fullLight_noAT);
//
// skinShader_fullLight = Shader::create(vs_fullLight, fs);
// assert(skinShader_fullLight);
// skinShader_fullLight_noAT = Shader::create(vs_fullLight, fs_noAT);
// assert(skinShader_fullLight_noAT);
return o;
}
@ -326,10 +326,10 @@ skinClose(void *o, int32, int32)
skinShader = nil;
skinShader_noAT->destroy();
skinShader_noAT = nil;
skinShader_fullLight->destroy();
skinShader_fullLight = nil;
skinShader_fullLight_noAT->destroy();
skinShader_fullLight_noAT = nil;
// skinShader_fullLight->destroy();
// skinShader_fullLight = nil;
// skinShader_fullLight_noAT->destroy();
// skinShader_fullLight_noAT = nil;
return o;
}
@ -337,10 +337,11 @@ skinClose(void *o, int32, int32)
void
initSkin(void)
{
u_boneMatrices = registerUniform("u_boneMatrices", UNIFORM_MAT4, 64);
Driver::registerPlugin(PLATFORM_GL3, 0, ID_SKIN,
skinOpen, skinClose);
// TODO
// u_boneMatrices = registerUniform("u_boneMatrices", UNIFORM_MAT4, MAX_BONES);
//
// Driver::registerPlugin(PLATFORM_GL3, 0, ID_SKIN,
// skinOpen, skinClose);
}
ObjPipeline*