softgpu: Add vertex position transformation code. Seems to be doing something, even though it's not the right thing :/
This commit is contained in:
parent
55a94f9852
commit
40cdabeb7d
3 changed files with 50 additions and 16 deletions
|
@ -16,7 +16,6 @@
|
|||
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
|
||||
|
||||
|
||||
#include "SoftGpu.h"
|
||||
#include "../GPUState.h"
|
||||
#include "../ge_constants.h"
|
||||
#include "../../Core/MemMap.h"
|
||||
|
@ -25,6 +24,9 @@
|
|||
#include "../GLES/VertexDecoder.h"
|
||||
#include "gfx/gl_common.h"
|
||||
|
||||
#include "SoftGpu.h"
|
||||
#include "TransformUnit.h"
|
||||
|
||||
static GLuint temp_texture = 0;
|
||||
|
||||
static GLint attr_pos = -1, attr_tex = -1;
|
||||
|
@ -32,7 +34,9 @@ static GLint uni_tex = -1;
|
|||
|
||||
static GLuint program;
|
||||
|
||||
u8 fb_dummy[480*272*4]; // TODO: Should replace this one with the actual framebuffer
|
||||
#define FB_WIDTH 480
|
||||
#define FB_HEIGHT 272
|
||||
u8 fb_dummy[FB_WIDTH*FB_HEIGHT*4]; // TODO: Should replace this one with the actual framebuffer
|
||||
u8* fb = fb_dummy;
|
||||
|
||||
GLuint OpenGL_CompileProgram(const char* vertexShader, const char* fragmentShader)
|
||||
|
@ -187,7 +191,11 @@ void SoftGPU::CopyDisplayToOutput()
|
|||
// for (unsigned int i = 0; i < sizeof(fb_dummy); ++i)
|
||||
// fb_dummy[i] = ((i%4)==2) ? i*255/sizeof(fb_dummy) : 0xff;
|
||||
|
||||
CopyToCurrentFboFromRam(fb, 480, 272, PSP_CoreParameter().renderWidth, PSP_CoreParameter().renderHeight);
|
||||
CopyToCurrentFboFromRam(fb, FB_WIDTH, FB_HEIGHT, PSP_CoreParameter().renderWidth, PSP_CoreParameter().renderHeight);
|
||||
|
||||
// dummy clear
|
||||
for (unsigned int i = 0; i < sizeof(fb_dummy); ++i)
|
||||
fb_dummy[i] = 0;
|
||||
}
|
||||
|
||||
u32 SoftGPU::DrawSync(int mode)
|
||||
|
@ -248,7 +256,10 @@ void SoftGPU::ExecuteOp(u32 op, u32 diff)
|
|||
"TRIANGLE_FAN=5,",
|
||||
"RECTANGLES=6,",
|
||||
};
|
||||
DEBUG_LOG(G3D, "DL DrawPrim type: %s count: %i vaddr= %08x, iaddr= %08x", type<7 ? types[type] : "INVALID", count, gstate_c.vertexAddr, gstate_c.indexAddr);
|
||||
if (type != 3)
|
||||
break;
|
||||
|
||||
ERROR_LOG(G3D, "DL DrawPrim type: %s count: %i vaddr= %08x, iaddr= %08x", type<7 ? types[type] : "INVALID", count, gstate_c.vertexAddr, gstate_c.indexAddr);
|
||||
|
||||
void *verts = Memory::GetPointer(gstate_c.vertexAddr);
|
||||
if ((gstate.vertType & GE_VTYPE_IDX_MASK) != GE_VTYPE_IDX_NONE) {
|
||||
|
@ -264,7 +275,23 @@ void SoftGPU::ExecuteOp(u32 op, u32 diff)
|
|||
vdecoder.DecodeVerts(buf, verts, 0, count - 1);
|
||||
|
||||
VertexReader vreader(buf, vtxfmt, gstate.vertType);
|
||||
PrintDecodedVertex(vreader);
|
||||
|
||||
for (int vtx = 0; vtx < count; ++vtx)
|
||||
{
|
||||
vreader.Goto(vtx);
|
||||
|
||||
float pos[3];
|
||||
vreader.ReadPos(pos);
|
||||
|
||||
ModelCoords mcoords(pos[0], pos[1], pos[2]);
|
||||
DrawingCoords dcoords(TransformUnit::ScreenToDrawing(TransformUnit::ClipToScreen(TransformUnit::ViewToClip(TransformUnit::WorldToView(TransformUnit::ModelToWorld(mcoords))))));
|
||||
if (dcoords.x >= FB_WIDTH) break;
|
||||
if (dcoords.y >= FB_HEIGHT) break;
|
||||
fb_dummy[dcoords.x*4 + dcoords.y * FB_WIDTH * 4] = 0xff;
|
||||
fb_dummy[dcoords.x*4 + dcoords.y * FB_WIDTH * 4+1] = 0xff;
|
||||
fb_dummy[dcoords.x*4 + dcoords.y * FB_WIDTH * 4+2] = 0xff;
|
||||
fb_dummy[dcoords.x*4 + dcoords.y * FB_WIDTH * 4+3] = 0xff;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
|
@ -40,14 +40,20 @@ ClipCoords TransformUnit::ViewToClip(const ViewCoords& coords)
|
|||
ScreenCoords TransformUnit::ClipToScreen(const ClipCoords& coords)
|
||||
{
|
||||
ScreenCoords ret;
|
||||
float viewport_dx = gstate.viewportx2 - gstate.viewportx1; // TODO: -1?
|
||||
float viewport_dy = gstate.viewporty2 - gstate.viewporty1; // TODO: -1?
|
||||
float viewport_dz = gstate.viewportz2 - gstate.viewportz1; // TODO: -1?
|
||||
float vpx1 = getFloat24(gstate.viewportx1);
|
||||
float vpx2 = getFloat24(gstate.viewportx2);
|
||||
float vpy1 = getFloat24(gstate.viewporty1);
|
||||
float vpy2 = getFloat24(gstate.viewporty2);
|
||||
float vpz1 = getFloat24(gstate.viewportz1);
|
||||
float vpz2 = getFloat24(gstate.viewportz2);
|
||||
float viewport_dx = vpx2 - vpx1; // TODO: -1?
|
||||
float viewport_dy = vpy2 - vpy1; // TODO: -1?
|
||||
float viewport_dz = vpz2 - vpz1; // TODO: -1?
|
||||
// TODO: Check for invalid parameters (x2 < x1, etc)
|
||||
|
||||
ret.x = (coords.x * viewport_dx / coords.w + gstate.viewportx1) * 0xFFFF;
|
||||
ret.y = (coords.y * viewport_dy / coords.w + gstate.viewporty1) * 0xFFFF;
|
||||
ret.z = (coords.z * viewport_dz / coords.w + gstate.viewportz1) * 0xFFFF;
|
||||
ret.x = (coords.x * viewport_dx / coords.w + vpx1) * 0xFFFF;
|
||||
ret.y = (coords.y * viewport_dy / coords.w + vpy1) * 0xFFFF;
|
||||
ret.z = (coords.z * viewport_dz / coords.w + vpz1) * 0xFFFF;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -39,9 +39,10 @@ typedef Vec2<u10> DrawingCoords; // TODO: Keep z component?
|
|||
|
||||
class TransformUnit
|
||||
{
|
||||
WorldCoords ModelToWorld(const ModelCoords& coords);
|
||||
ViewCoords WorldToView(const WorldCoords& coords);
|
||||
ClipCoords ViewToClip(const ViewCoords& coords);
|
||||
ScreenCoords ClipToScreen(const ClipCoords& coords);
|
||||
DrawingCoords ScreenToDrawing(const ScreenCoords& coords);
|
||||
public:
|
||||
static WorldCoords ModelToWorld(const ModelCoords& coords);
|
||||
static ViewCoords WorldToView(const WorldCoords& coords);
|
||||
static ClipCoords ViewToClip(const ViewCoords& coords);
|
||||
static ScreenCoords ClipToScreen(const ClipCoords& coords);
|
||||
static DrawingCoords ScreenToDrawing(const ScreenCoords& coords);
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue