mirror of
https://github.com/isledecomp/isle-portable.git
synced 2026-02-03 12:31:15 +00:00
parent
ebb8284af0
commit
e1c02d05dd
@ -652,7 +652,7 @@ if(NINTENDO_3DS)
|
|||||||
DESCRIPTION "LEGO Island for the Nintendo 3DS"
|
DESCRIPTION "LEGO Island for the Nintendo 3DS"
|
||||||
AUTHOR "LEGO Island Decompilation and Porting Team"
|
AUTHOR "LEGO Island Decompilation and Porting Team"
|
||||||
VERSION "${PROJECT_VERSION}"
|
VERSION "${PROJECT_VERSION}"
|
||||||
ICON "isle/res/3ds/isle.png"
|
ICON "ISLE/res/3ds/isle.png"
|
||||||
)
|
)
|
||||||
|
|
||||||
ctr_create_3dsx(isle SMDH isle.smdh)
|
ctr_create_3dsx(isle SMDH isle.smdh)
|
||||||
|
|||||||
@ -264,12 +264,6 @@ Uint32 Citro3DRenderer::GetTextureId(IDirect3DRMTexture* iTexture)
|
|||||||
return (Uint32) (m_textures.size() - 1);
|
return (Uint32) (m_textures.size() - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct vertex {
|
|
||||||
float position[3];
|
|
||||||
float texcoord[2];
|
|
||||||
float normal[3];
|
|
||||||
};
|
|
||||||
|
|
||||||
C3DMeshCacheEntry C3DUploadMesh(const MeshGroup& meshGroup)
|
C3DMeshCacheEntry C3DUploadMesh(const MeshGroup& meshGroup)
|
||||||
{
|
{
|
||||||
C3DMeshCacheEntry cache{&meshGroup, meshGroup.version};
|
C3DMeshCacheEntry cache{&meshGroup, meshGroup.version};
|
||||||
@ -293,15 +287,21 @@ C3DMeshCacheEntry C3DUploadMesh(const MeshGroup& meshGroup)
|
|||||||
indexBuffer.assign(meshGroup.indices.begin(), meshGroup.indices.end());
|
indexBuffer.assign(meshGroup.indices.begin(), meshGroup.indices.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t vertexBufferSize = vertexBuffer.size() * sizeof(vertex);
|
MINIWIN_NOT_IMPLEMENTED();
|
||||||
size_t indexBufferSize = indexBuffer.size() * sizeof(uint16_t);
|
|
||||||
|
|
||||||
|
// TODO use ibo instead of flattening verticies, see
|
||||||
|
// https://github.com/devkitPro/3ds-examples/blob/44faa81d79d5781c0e149e4a7005f2e005edb736/graphics/gpu/loop_subdivision/source/main.c#L104
|
||||||
|
std::vector<D3DRMVERTEX> vertexUploadBuffer;
|
||||||
|
vertexUploadBuffer.reserve(indexBuffer.size());
|
||||||
|
|
||||||
|
for (size_t i = 0; i < indexBuffer.size(); ++i) {
|
||||||
|
vertexUploadBuffer.emplace_back(vertexBuffer[indexBuffer[i]]);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t vertexBufferSize = vertexUploadBuffer.size() * sizeof(D3DRMVERTEX);
|
||||||
cache.vbo = linearAlloc(vertexBufferSize);
|
cache.vbo = linearAlloc(vertexBufferSize);
|
||||||
memcpy(cache.vbo, vertexBuffer.data(), vertexBufferSize);
|
memcpy(cache.vbo, vertexUploadBuffer.data(), vertexBufferSize);
|
||||||
cache.ibo = linearAlloc(indexBufferSize);
|
cache.vertexCount = vertexUploadBuffer.size();
|
||||||
memcpy(cache.ibo, indexBuffer.data(), indexBufferSize);
|
|
||||||
|
|
||||||
cache.indexCount = indexBuffer.size();
|
|
||||||
|
|
||||||
return cache;
|
return cache;
|
||||||
}
|
}
|
||||||
@ -316,7 +316,7 @@ void Citro3DRenderer::AddMeshDestroyCallback(Uint32 id, IDirect3DRMMesh* mesh)
|
|||||||
if (cacheEntry.meshGroup) {
|
if (cacheEntry.meshGroup) {
|
||||||
cacheEntry.meshGroup = nullptr;
|
cacheEntry.meshGroup = nullptr;
|
||||||
linearFree(cacheEntry.vbo);
|
linearFree(cacheEntry.vbo);
|
||||||
linearFree(cacheEntry.ibo);
|
cacheEntry.vertexCount = 0;
|
||||||
}
|
}
|
||||||
delete ctx;
|
delete ctx;
|
||||||
},
|
},
|
||||||
@ -450,7 +450,8 @@ void Citro3DRenderer::SubmitDraw(
|
|||||||
const Appearance& appearance
|
const Appearance& appearance
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
C3D_Mtx modelView;
|
C3D_Mtx projection, modelView;
|
||||||
|
ConvertPerspective(m_projection, &projection);
|
||||||
ConvertMatrix(modelViewMatrix, &modelView);
|
ConvertMatrix(modelViewMatrix, &modelView);
|
||||||
C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uLoc_modelView, &modelView);
|
C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uLoc_modelView, &modelView);
|
||||||
|
|
||||||
@ -458,7 +459,7 @@ void Citro3DRenderer::SubmitDraw(
|
|||||||
|
|
||||||
C3D_BufInfo* bufInfo = C3D_GetBufInfo();
|
C3D_BufInfo* bufInfo = C3D_GetBufInfo();
|
||||||
BufInfo_Init(bufInfo);
|
BufInfo_Init(bufInfo);
|
||||||
BufInfo_Add(bufInfo, mesh.vbo, sizeof(vertex), 3, 0x210);
|
BufInfo_Add(bufInfo, mesh.vbo, sizeof(D3DRMVERTEX), 3, 0x210);
|
||||||
|
|
||||||
C3D_FVUnifSet(
|
C3D_FVUnifSet(
|
||||||
GPU_VERTEX_SHADER,
|
GPU_VERTEX_SHADER,
|
||||||
@ -486,7 +487,7 @@ void Citro3DRenderer::SubmitDraw(
|
|||||||
C3D_TexEnvFunc(env, C3D_Both, GPU_REPLACE);
|
C3D_TexEnvFunc(env, C3D_Both, GPU_REPLACE);
|
||||||
}
|
}
|
||||||
|
|
||||||
C3D_DrawElements(GPU_GEOMETRY_PRIM, mesh.indexCount, C3D_UNSIGNED_SHORT, mesh.ibo);
|
C3D_DrawArrays(GPU_TRIANGLES, 0, mesh.vertexCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT Citro3DRenderer::FinalizeFrame()
|
HRESULT Citro3DRenderer::FinalizeFrame()
|
||||||
|
|||||||
@ -20,8 +20,7 @@ struct C3DMeshCacheEntry {
|
|||||||
const MeshGroup* meshGroup = nullptr;
|
const MeshGroup* meshGroup = nullptr;
|
||||||
int version = 0;
|
int version = 0;
|
||||||
void* vbo = nullptr;
|
void* vbo = nullptr;
|
||||||
void* ibo = nullptr;
|
int vertexCount = 0;
|
||||||
int indexCount = 0;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class Citro3DRenderer : public Direct3DRMRenderer {
|
class Citro3DRenderer : public Direct3DRMRenderer {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user