mirror of
https://github.com/blawar/GLideN64.git
synced 2024-07-07 03:13:49 +00:00
Fix DKR microcode.
gSPDMATriangles worked incorrect because vertex's s and t can change between triangles. Need to copy original vertex to an array and modify s and t for copied vertex.
This commit is contained in:
parent
e4fa0b5717
commit
254f315803
25
OpenGL.cpp
25
OpenGL.cpp
|
@ -605,7 +605,7 @@ void OGLRender::_setTexCoordArrays() const
|
|||
glDisableVertexAttribArray(SC_STSCALED);
|
||||
}
|
||||
|
||||
void OGLRender::_prepareDrawTriangle()
|
||||
void OGLRender::_prepareDrawTriangle(bool _dma)
|
||||
{
|
||||
#ifndef GLES2
|
||||
if (m_bImageTexture)
|
||||
|
@ -624,13 +624,14 @@ void OGLRender::_prepareDrawTriangle()
|
|||
}
|
||||
|
||||
if (updateArrays) {
|
||||
glVertexAttribPointer(SC_POSITION, 4, GL_FLOAT, GL_FALSE, sizeof(SPVertex), &triangles.vertices[0].x);
|
||||
glVertexAttribPointer(SC_COLOR, 4, GL_FLOAT, GL_FALSE, sizeof(SPVertex), &triangles.vertices[0].r);
|
||||
glVertexAttribPointer(SC_TEXCOORD0, 2, GL_FLOAT, GL_FALSE, sizeof(SPVertex), &triangles.vertices[0].s);
|
||||
glVertexAttribPointer(SC_STSCALED, 1, GL_UNSIGNED_BYTE, GL_FALSE, sizeof(SPVertex), &triangles.vertices[0].st_scaled);
|
||||
SPVertex * pVtx = _dma ? triangles.dmaVertices.data() : &triangles.vertices[0];
|
||||
glVertexAttribPointer(SC_POSITION, 4, GL_FLOAT, GL_FALSE, sizeof(SPVertex), &pVtx->x);
|
||||
glVertexAttribPointer(SC_COLOR, 4, GL_FLOAT, GL_FALSE, sizeof(SPVertex), &pVtx->r);
|
||||
glVertexAttribPointer(SC_TEXCOORD0, 2, GL_FLOAT, GL_FALSE, sizeof(SPVertex), &pVtx->s);
|
||||
glVertexAttribPointer(SC_STSCALED, 1, GL_UNSIGNED_BYTE, GL_FALSE, sizeof(SPVertex), &pVtx->st_scaled);
|
||||
if (config.enableHWLighting) {
|
||||
glEnableVertexAttribArray(SC_NUMLIGHTS);
|
||||
glVertexAttribPointer(SC_NUMLIGHTS, 1, GL_BYTE, GL_FALSE, sizeof(SPVertex), &triangles.vertices[0].HWLight);
|
||||
glVertexAttribPointer(SC_NUMLIGHTS, 1, GL_BYTE, GL_FALSE, sizeof(SPVertex), &pVtx->HWLight);
|
||||
}
|
||||
|
||||
_updateCullFace();
|
||||
|
@ -648,7 +649,7 @@ void OGLRender::drawLLETriangle(u32 _numVtx)
|
|||
if (_numVtx == 0)
|
||||
return;
|
||||
|
||||
_prepareDrawTriangle();
|
||||
_prepareDrawTriangle(false);
|
||||
glDisable(GL_CULL_FACE);
|
||||
|
||||
FrameBufferList & fbList = frameBufferList();
|
||||
|
@ -681,11 +682,19 @@ void OGLRender::drawLLETriangle(u32 _numVtx)
|
|||
#endif
|
||||
}
|
||||
|
||||
void OGLRender::drawDMATriangles(u32 _numVtx)
|
||||
{
|
||||
if (_numVtx == 0)
|
||||
return;
|
||||
_prepareDrawTriangle(true);
|
||||
glDrawArrays(GL_TRIANGLES, 0, _numVtx);
|
||||
}
|
||||
|
||||
void OGLRender::drawTriangles()
|
||||
{
|
||||
if (triangles.num == 0) return;
|
||||
|
||||
_prepareDrawTriangle();
|
||||
_prepareDrawTriangle(false);
|
||||
glDrawElements(GL_TRIANGLES, triangles.num, GL_UNSIGNED_BYTE, triangles.elements);
|
||||
triangles.num = 0;
|
||||
|
||||
|
|
7
OpenGL.h
7
OpenGL.h
|
@ -1,6 +1,7 @@
|
|||
#ifndef OPENGL_H
|
||||
#define OPENGL_H
|
||||
|
||||
#include <vector>
|
||||
#ifdef _WINDOWS
|
||||
#include <windows.h>
|
||||
#include <GL/gl.h>
|
||||
|
@ -35,6 +36,7 @@ public:
|
|||
void addTriangle(int _v0, int _v1, int _v2);
|
||||
void drawTriangles();
|
||||
void drawLLETriangle(u32 _numVtx);
|
||||
void drawDMATriangles(u32 _numVtx);
|
||||
void drawLine(int _v0, int _v1, float _width);
|
||||
void drawRect(int _ulx, int _uly, int _lrx, int _lry, float * _pColor);
|
||||
void drawTexturedRect(
|
||||
|
@ -52,6 +54,8 @@ public:
|
|||
}
|
||||
bool isImageTexturesSupported() const {return m_bImageTexture;}
|
||||
SPVertex & getVertex(u32 _v) {return triangles.vertices[_v];}
|
||||
void setDMAVerticesSize(u32 _size) { if (triangles.dmaVertices.size() < _size) triangles.dmaVertices.resize(_size); }
|
||||
SPVertex * getDMAVerticesData() { return triangles.dmaVertices.data(); }
|
||||
|
||||
enum RENDER_STATE {
|
||||
rsNone = 0,
|
||||
|
@ -85,7 +89,7 @@ private:
|
|||
void _updateViewport() const;
|
||||
void _updateDepthUpdate() const;
|
||||
void _updateStates() const;
|
||||
void _prepareDrawTriangle();
|
||||
void _prepareDrawTriangle(bool _dma);
|
||||
|
||||
#ifdef __TRIBUFFER_OPT
|
||||
void _indexmap_init();
|
||||
|
@ -95,6 +99,7 @@ private:
|
|||
|
||||
struct {
|
||||
SPVertex vertices[VERTBUFF_SIZE];
|
||||
std::vector<SPVertex> dmaVertices;
|
||||
GLubyte elements[ELEMBUFF_SIZE];
|
||||
int num;
|
||||
u32 indexmap[INDEXMAP_SIZE];
|
||||
|
|
50
gSP.cpp
50
gSP.cpp
|
@ -774,8 +774,6 @@ void gSPDMAVertex( u32 a, u32 n, u32 v0 )
|
|||
u32 v = i;
|
||||
#ifdef __TRIBUFFER_OPT
|
||||
v = render.getIndexmapNew(v, 1);
|
||||
#else
|
||||
v = i;
|
||||
#endif
|
||||
SPVertex & vtx = render.getVertex(v);
|
||||
vtx.x = *(s16*)&RDRAM[address ^ 2];
|
||||
|
@ -793,6 +791,7 @@ void gSPDMAVertex( u32 a, u32 n, u32 v0 )
|
|||
vtx.b = *(u8*)&RDRAM[(address + 8) ^ 3] * 0.0039215689f;
|
||||
vtx.a = *(u8*)&RDRAM[(address + 9) ^ 3] * 0.0039215689f;
|
||||
}
|
||||
vtx.st_scaled = 0;
|
||||
|
||||
gSPProcessVertex(v);
|
||||
address += 10;
|
||||
|
@ -1024,12 +1023,13 @@ void gSPDMATriangles( u32 tris, u32 n ){
|
|||
}
|
||||
|
||||
OGLRender & render = video().getRender();
|
||||
render.setDMAVerticesSize(n * 3);
|
||||
#ifdef __TRIBUFFER_OPT
|
||||
render.indexmapUndo();
|
||||
#endif
|
||||
|
||||
DKRTriangle *triangles = (DKRTriangle*)&RDRAM[address];
|
||||
|
||||
SPVertex * pVtx = render.getDMAVerticesData();
|
||||
for (u32 i = 0; i < n; ++i) {
|
||||
int mode = 0;
|
||||
if (!(triangles->flag & 0x40)) {
|
||||
|
@ -1038,34 +1038,36 @@ void gSPDMATriangles( u32 tris, u32 n ){
|
|||
else
|
||||
mode |= G_CULL_FRONT;
|
||||
}
|
||||
|
||||
if ((gSP.geometryMode&G_CULL_BOTH) != mode) {
|
||||
render.drawTriangles();
|
||||
render.drawDMATriangles(pVtx - render.getDMAVerticesData());
|
||||
pVtx = render.getDMAVerticesData();
|
||||
gSP.geometryMode &= ~G_CULL_BOTH;
|
||||
gSP.geometryMode |= mode;
|
||||
gSP.changed |= CHANGED_GEOMETRYMODE;
|
||||
}
|
||||
|
||||
|
||||
s32 v0 = triangles->v0;
|
||||
s32 v1 = triangles->v1;
|
||||
s32 v2 = triangles->v2;
|
||||
SPVertex & vtx0 = render.getVertex(v0);
|
||||
vtx0.s = _FIXED2FLOAT( triangles->s0, 5 );
|
||||
vtx0.t = _FIXED2FLOAT( triangles->t0, 5 );
|
||||
SPVertex & vtx1 = render.getVertex(v1);
|
||||
vtx1.s = _FIXED2FLOAT( triangles->s1, 5 );
|
||||
vtx1.t = _FIXED2FLOAT( triangles->t1, 5 );
|
||||
SPVertex & vtx2 = render.getVertex(v2);
|
||||
vtx2.s = _FIXED2FLOAT( triangles->s2, 5 );
|
||||
vtx2.t = _FIXED2FLOAT( triangles->t2, 5 );
|
||||
gSPTriangle(triangles->v0, triangles->v1, triangles->v2);
|
||||
triangles++;
|
||||
const s32 v0 = triangles->v0;
|
||||
const s32 v1 = triangles->v1;
|
||||
const s32 v2 = triangles->v2;
|
||||
if (render.isClipped(v0, v1, v2)) {
|
||||
++triangles;
|
||||
continue;
|
||||
}
|
||||
*pVtx = render.getVertex(v0);
|
||||
pVtx->s = _FIXED2FLOAT(triangles->s0, 5);
|
||||
pVtx->t = _FIXED2FLOAT(triangles->t0, 5);
|
||||
++pVtx;
|
||||
*pVtx = render.getVertex(v1);
|
||||
pVtx->s = _FIXED2FLOAT(triangles->s1, 5);
|
||||
pVtx->t = _FIXED2FLOAT(triangles->t1, 5);
|
||||
++pVtx;
|
||||
*pVtx = render.getVertex(v2);
|
||||
pVtx->s = _FIXED2FLOAT(triangles->s2, 5);
|
||||
pVtx->t = _FIXED2FLOAT(triangles->t2, 5);
|
||||
++pVtx;
|
||||
++triangles;
|
||||
}
|
||||
|
||||
#ifdef __TRIBUFFER_OPT
|
||||
render.drawTriangles();
|
||||
#endif
|
||||
render.drawDMATriangles(pVtx - render.getDMAVerticesData());
|
||||
}
|
||||
|
||||
void gSP1Quadrangle( s32 v0, s32 v1, s32 v2, s32 v3 )
|
||||
|
|
Loading…
Reference in New Issue
Block a user