mirror of
https://github.com/XProger/OpenLara.git
synced 2025-08-05 04:37:50 +02:00
#368 GBA move rooms data to VRAM (experimental), simplify room transform code
This commit is contained in:
@@ -29,6 +29,10 @@ EWRAM_DATA const char* const* STR = STR_EN;
|
|||||||
|
|
||||||
EWRAM_DATA ExtraInfoLara playersExtra[MAX_PLAYERS];
|
EWRAM_DATA ExtraInfoLara playersExtra[MAX_PLAYERS];
|
||||||
|
|
||||||
|
#if defined(USE_VRAM_MESH) || defined(USE_VRAM_ROOM)
|
||||||
|
uint8* vramPtr = (uint8*)0x06014000;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(__GBA__)
|
#if defined(__GBA__)
|
||||||
#include "TRACKS_IMA.h"
|
#include "TRACKS_IMA.h"
|
||||||
#include "TITLE_SCR.h"
|
#include "TITLE_SCR.h"
|
||||||
|
@@ -67,6 +67,7 @@
|
|||||||
|
|
||||||
#define USE_FMT (LVL_FMT_PKD)
|
#define USE_FMT (LVL_FMT_PKD)
|
||||||
#define USE_VRAM_MESH // experimental
|
#define USE_VRAM_MESH // experimental
|
||||||
|
//#define USE_VRAM_ROOM // experimental
|
||||||
|
|
||||||
#include <tonc.h>
|
#include <tonc.h>
|
||||||
#elif defined(__NDS__)
|
#elif defined(__NDS__)
|
||||||
@@ -357,6 +358,10 @@ X_INLINE int32 abs(int32 x) {
|
|||||||
|
|
||||||
extern int32 fps;
|
extern int32 fps;
|
||||||
|
|
||||||
|
#if defined(USE_VRAM_MESH) || defined(USE_VRAM_ROOM)
|
||||||
|
extern uint8* vramPtr;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef F16_SHIFT
|
#ifndef F16_SHIFT
|
||||||
#define F16_SHIFT 0
|
#define F16_SHIFT 0
|
||||||
#endif
|
#endif
|
||||||
@@ -2796,7 +2801,7 @@ void renderLevelFree();
|
|||||||
void setViewport(const RectMinMax &vp);
|
void setViewport(const RectMinMax &vp);
|
||||||
void setPaletteIndex(int32 index);
|
void setPaletteIndex(int32 index);
|
||||||
void clear();
|
void clear();
|
||||||
void renderRoom(const Room* room);
|
void renderRoom(Room* room);
|
||||||
void renderMesh(const Mesh* mesh);
|
void renderMesh(const Mesh* mesh);
|
||||||
void renderShadow(int32 x, int32 z, int32 sx, int32 sz);
|
void renderShadow(int32 x, int32 z, int32 sx, int32 sz);
|
||||||
void renderSprite(int32 vx, int32 vy, int32 vz, int32 vg, int32 index);
|
void renderSprite(int32 vx, int32 vy, int32 vz, int32 vg, int32 index);
|
||||||
|
@@ -701,7 +701,7 @@ void drawModel(const ItemObj* item)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void drawRoom(const Room* room)
|
void drawRoom(Room* room)
|
||||||
{
|
{
|
||||||
setViewport(room->clip);
|
setViewport(room->clip);
|
||||||
|
|
||||||
|
@@ -189,18 +189,17 @@ void readLevel(const uint8* data)
|
|||||||
|
|
||||||
#ifdef USE_VRAM_MESH // experimental, should be per level or dynamic
|
#ifdef USE_VRAM_MESH // experimental, should be per level or dynamic
|
||||||
vramMeshesCount = 0;
|
vramMeshesCount = 0;
|
||||||
uint8* ptr = (uint8*)0x06014000; // 16k available
|
vramPtr = pushToVRAM(vramPtr, models + ITEM_LARA);
|
||||||
ptr = pushToVRAM(ptr, models + ITEM_LARA);
|
vramPtr = pushToVRAM(vramPtr, models + ITEM_LARA_PISTOLS);
|
||||||
ptr = pushToVRAM(ptr, models + ITEM_LARA_PISTOLS);
|
vramPtr = pushToVRAM(vramPtr, models + ITEM_LARA_SHOTGUN);
|
||||||
ptr = pushToVRAM(ptr, models + ITEM_LARA_SHOTGUN);
|
vramPtr = pushToVRAM(vramPtr, models + ITEM_LARA_MAGNUMS);
|
||||||
ptr = pushToVRAM(ptr, models + ITEM_LARA_MAGNUMS);
|
vramPtr = pushToVRAM(vramPtr, models + ITEM_LARA_UZIS);
|
||||||
ptr = pushToVRAM(ptr, models + ITEM_LARA_UZIS);
|
vramPtr = pushToVRAM(vramPtr, models + ITEM_WOLF);
|
||||||
ptr = pushToVRAM(ptr, models + ITEM_WOLF);
|
vramPtr = pushToVRAM(vramPtr, models + ITEM_BAT);
|
||||||
ptr = pushToVRAM(ptr, models + ITEM_BAT);
|
vramPtr = pushToVRAM(vramPtr, models + ITEM_BRIDGE_FLAT);
|
||||||
ptr = pushToVRAM(ptr, models + ITEM_BRIDGE_FLAT);
|
vramPtr = pushToVRAM(vramPtr, models + ITEM_BRIDGE_TILT_1);
|
||||||
ptr = pushToVRAM(ptr, models + ITEM_BRIDGE_TILT_1);
|
vramPtr = pushToVRAM(vramPtr, models + ITEM_BRIDGE_TILT_2);
|
||||||
ptr = pushToVRAM(ptr, models + ITEM_BRIDGE_TILT_2);
|
//printf("%d\n", vramPtr - (uint8*)0x06014000);
|
||||||
//printf("%d\n", ptr - (uint8*)0x06014000);
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -49,14 +49,11 @@ transformRoom_asm:
|
|||||||
|
|
||||||
ldr res, =gVerticesBase
|
ldr res, =gVerticesBase
|
||||||
ldr res, [res]
|
ldr res, [res]
|
||||||
add res, #VERTEX_G
|
|
||||||
|
|
||||||
ldr tmp, =viewportRel
|
ldr tmp, =viewportRel
|
||||||
ldmia tmp, {minXY, maxXY}
|
ldmia tmp, {minXY, maxXY}
|
||||||
stmfd sp!, {minXY, maxXY}
|
stmfd sp!, {minXY, maxXY}
|
||||||
|
|
||||||
mov mask, #0xFF
|
|
||||||
|
|
||||||
ldr m, =gMatrixPtr
|
ldr m, =gMatrixPtr
|
||||||
ldr m, [m]
|
ldr m, [m]
|
||||||
fiq_on
|
fiq_on
|
||||||
@@ -69,11 +66,13 @@ transformRoom_asm:
|
|||||||
|
|
||||||
.loop:
|
.loop:
|
||||||
// unpack vertex
|
// unpack vertex
|
||||||
ldmia vertices!, {v}
|
ldr v, [vertices], #4
|
||||||
|
|
||||||
and vz, mask, v, lsr #16
|
mov mask, #0xFF
|
||||||
and vy, mask, v, lsr #8
|
|
||||||
and vx, mask, v
|
and vx, mask, v
|
||||||
|
and vy, mask, v, lsr #8
|
||||||
|
and vz, mask, v, lsr #16
|
||||||
|
mov vg, v, lsr #(24 + 3)
|
||||||
|
|
||||||
// transform z
|
// transform z
|
||||||
mul z, mx2, vx
|
mul z, mx2, vx
|
||||||
@@ -81,15 +80,6 @@ transformRoom_asm:
|
|||||||
mla z, mz2, vz, z
|
mla z, mz2, vz, z
|
||||||
add z, mw2, z, asr #(FIXED_SHIFT - 8 + OT_SHIFT)
|
add z, mw2, z, asr #(FIXED_SHIFT - 8 + OT_SHIFT)
|
||||||
|
|
||||||
// skip if vertex is out of z-range
|
|
||||||
add z, #(VIEW_OFF >> OT_SHIFT)
|
|
||||||
cmp z, #((VIEW_OFF + VIEW_OFF + VIEW_MAX) >> OT_SHIFT)
|
|
||||||
movhi vg, #(CLIP_NEAR + CLIP_FAR)
|
|
||||||
bhi .skip
|
|
||||||
|
|
||||||
mov vg, v, lsr #(24 + 3)
|
|
||||||
sub z, #(VIEW_OFF >> OT_SHIFT)
|
|
||||||
|
|
||||||
fiq_on
|
fiq_on
|
||||||
// transform y
|
// transform y
|
||||||
mul y, mx1, vx
|
mul y, mx1, vx
|
||||||
@@ -151,13 +141,10 @@ transformRoom_asm:
|
|||||||
orrhi vg, #CLIP_FRAME
|
orrhi vg, #CLIP_FRAME
|
||||||
|
|
||||||
// store the result
|
// store the result
|
||||||
strh x, [res, #-6]
|
strh x, [res], #2
|
||||||
strh y, [res, #-4]
|
strh y, [res], #2
|
||||||
strh z, [res, #-2]
|
strh z, [res], #2
|
||||||
|
strh vg, [res], #2
|
||||||
mov mask, #0xFF
|
|
||||||
.skip:
|
|
||||||
strh vg, [res], #8
|
|
||||||
|
|
||||||
subs count, #1
|
subs count, #1
|
||||||
bne .loop
|
bne .loop
|
||||||
|
@@ -808,7 +808,7 @@ void clear()
|
|||||||
dmaFill((void*)fb, 0, FRAME_WIDTH * FRAME_HEIGHT);
|
dmaFill((void*)fb, 0, FRAME_WIDTH * FRAME_HEIGHT);
|
||||||
}
|
}
|
||||||
|
|
||||||
void renderRoom(const Room* room)
|
void renderRoom(Room* room)
|
||||||
{
|
{
|
||||||
int32 vCount = room->info->verticesCount;
|
int32 vCount = room->info->verticesCount;
|
||||||
if (vCount <= 0)
|
if (vCount <= 0)
|
||||||
@@ -820,6 +820,27 @@ void renderRoom(const Room* room)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef USE_VRAM_ROOM
|
||||||
|
if (playersExtra[0].camera.view.room == room && !((uint32)room->data.vertices & 0x06000000))
|
||||||
|
{
|
||||||
|
memcpy(vramPtr, room->data.quads, room->info->quadsCount * sizeof(RoomQuad));
|
||||||
|
room->data.quads = (RoomQuad*)vramPtr;
|
||||||
|
vramPtr += room->info->quadsCount * sizeof(RoomQuad);
|
||||||
|
|
||||||
|
if ((uint32)vramPtr & 3) vramPtr += 2;
|
||||||
|
|
||||||
|
memcpy(vramPtr, room->data.triangles, room->info->trianglesCount * sizeof(RoomTriangle));
|
||||||
|
room->data.triangles = (RoomTriangle*)vramPtr;
|
||||||
|
vramPtr += room->info->trianglesCount * sizeof(RoomTriangle);
|
||||||
|
|
||||||
|
if ((uint32)vramPtr & 3) vramPtr += 2;
|
||||||
|
|
||||||
|
memcpy(vramPtr, room->data.vertices, room->info->verticesCount * sizeof(RoomVertex));
|
||||||
|
room->data.vertices = (RoomVertex*)vramPtr;
|
||||||
|
vramPtr += room->info->verticesCount * sizeof(RoomVertex);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
{
|
{
|
||||||
PROFILE(CNT_TRANSFORM);
|
PROFILE(CNT_TRANSFORM);
|
||||||
if (ROOM_FLAG_WATER(room->info->flags)) {
|
if (ROOM_FLAG_WATER(room->info->flags)) {
|
||||||
@@ -1098,20 +1119,15 @@ void renderGlyph(int32 vx, int32 vy, int32 index)
|
|||||||
Vertex* v1 = gVerticesBase++;
|
Vertex* v1 = gVerticesBase++;
|
||||||
v1->x = l;
|
v1->x = l;
|
||||||
v1->y = t;
|
v1->y = t;
|
||||||
//v1->z = z;
|
|
||||||
v1->g = 16;
|
v1->g = 16;
|
||||||
|
|
||||||
Vertex* v2 = gVerticesBase++;
|
Vertex* v2 = gVerticesBase++;
|
||||||
v2->x = r;
|
v2->x = r;
|
||||||
v2->y = b;
|
v2->y = b;
|
||||||
//v2->z = z;
|
|
||||||
//v2->g = vg;
|
|
||||||
|
|
||||||
Face* f = faceAdd(0);
|
Face* f = faceAdd(0);
|
||||||
f->flags = (FACE_TYPE_SPRITE << FACE_TYPE_SHIFT) | index;
|
f->flags = (FACE_TYPE_SPRITE << FACE_TYPE_SHIFT) | index;
|
||||||
f->indices[0] = v1 - gVertices;
|
f->indices[0] = v1 - gVertices;
|
||||||
|
|
||||||
gVerticesBase += 2;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define BAR_HEIGHT 5
|
#define BAR_HEIGHT 5
|
||||||
|
Reference in New Issue
Block a user