mirror of
https://github.com/XProger/OpenLara.git
synced 2025-08-21 12:21:33 +02:00
#370 3DO add one mip level and flat shading for room polygons, disable per-poly clipping for object meshes
This commit is contained in:
@@ -427,12 +427,14 @@ extern int32 fps;
|
|||||||
#define FACE_TRIANGLE 0x8000
|
#define FACE_TRIANGLE 0x8000
|
||||||
#define FACE_COLORED 0x4000
|
#define FACE_COLORED 0x4000
|
||||||
#define FACE_CLIPPED 0x2000
|
#define FACE_CLIPPED 0x2000
|
||||||
#define FACE_CCW FACE_CLIPPED // 3DO only
|
|
||||||
#define FACE_FLAT 0x1000
|
#define FACE_FLAT 0x1000
|
||||||
#define FACE_SPRITE 0x0800
|
#define FACE_SPRITE 0x0800
|
||||||
#define FACE_SHADOW (FACE_COLORED | FACE_FLAT | FACE_SPRITE)
|
#define FACE_SHADOW (FACE_COLORED | FACE_FLAT | FACE_SPRITE)
|
||||||
#define FACE_TEXTURE 0x07FF
|
#define FACE_TEXTURE 0x07FF
|
||||||
|
|
||||||
|
#define FACE_CCW (1 << 31) // 3DO only
|
||||||
|
#define FACE_MIP_SHIFT 11 // 3DO only
|
||||||
|
|
||||||
#define NOT_ENEMY -0x4000 // default hp for non enemies
|
#define NOT_ENEMY -0x4000 // default hp for non enemies
|
||||||
#define NO_ROOM 0xFF
|
#define NO_ROOM 0xFF
|
||||||
#define NO_MODEL 0xFF
|
#define NO_MODEL 0xFF
|
||||||
@@ -583,7 +585,8 @@ struct Matrix
|
|||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Quad {
|
struct Quad
|
||||||
|
{
|
||||||
#ifdef __3DO__
|
#ifdef __3DO__
|
||||||
Index indices[4];
|
Index indices[4];
|
||||||
uint32 flags;
|
uint32 flags;
|
||||||
@@ -593,12 +596,20 @@ struct Quad {
|
|||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Triangle {
|
struct Triangle
|
||||||
|
{
|
||||||
|
#ifdef __3DO__
|
||||||
|
Index indices[3];
|
||||||
|
uint16 _unused;
|
||||||
|
uint32 flags;
|
||||||
|
#else
|
||||||
Index indices[3];
|
Index indices[3];
|
||||||
uint16 flags;
|
uint16 flags;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
struct RectMinMax {
|
struct RectMinMax
|
||||||
|
{
|
||||||
int32 x0;
|
int32 x0;
|
||||||
int32 y0;
|
int32 y0;
|
||||||
int32 x1;
|
int32 x1;
|
||||||
@@ -2007,7 +2018,6 @@ extern ItemObj items[MAX_ITEMS];
|
|||||||
|
|
||||||
// level data
|
// level data
|
||||||
extern bool enableClipping;
|
extern bool enableClipping;
|
||||||
extern bool enableMaxSort;
|
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
X_INLINE void swap(T &a, T &b) {
|
X_INLINE void swap(T &a, T &b) {
|
||||||
|
@@ -802,9 +802,7 @@ void drawRoom(const Room* room, Camera* camera)
|
|||||||
|
|
||||||
{
|
{
|
||||||
PROFILE(CNT_ADD);
|
PROFILE(CNT_ADD);
|
||||||
enableMaxSort = true;
|
|
||||||
faceAddRoom(data.quads, info->quadsCount, data.triangles, info->trianglesCount, startVertex);
|
faceAddRoom(data.quads, info->quadsCount, data.triangles, info->trianglesCount, startVertex);
|
||||||
enableMaxSort = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
matrixPop();
|
matrixPop();
|
||||||
|
@@ -109,18 +109,8 @@ struct Game
|
|||||||
drawInit();
|
drawInit();
|
||||||
|
|
||||||
#ifdef __3DO__
|
#ifdef __3DO__
|
||||||
/*
|
//players[0]->angle.y += ANGLE_180;
|
||||||
if (gLevelID == 0)
|
//players[0]->pos.x += 1024;
|
||||||
{
|
|
||||||
players[0]->angle.y += ANGLE_180;
|
|
||||||
players[0]->pos.x += 1024;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gLevelID == 1)
|
|
||||||
{
|
|
||||||
players[0]->pos.z += 1024;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -34,7 +34,6 @@ LIBS = \
|
|||||||
$(LIBPATH)/filesystem.lib \
|
$(LIBPATH)/filesystem.lib \
|
||||||
$(LIBPATH)/graphics.lib \
|
$(LIBPATH)/graphics.lib \
|
||||||
$(LIBPATH)/input.lib \
|
$(LIBPATH)/input.lib \
|
||||||
$(LIBPATH)/exampleslib.lib \
|
|
||||||
|
|
||||||
SRC_S = $(wildcard *.s)
|
SRC_S = $(wildcard *.s)
|
||||||
SRC_C = $(wildcard *.c)
|
SRC_C = $(wildcard *.c)
|
||||||
|
@@ -253,15 +253,17 @@ void* osLoadLevel(const char* name)
|
|||||||
{
|
{
|
||||||
char buf[32];
|
char buf[32];
|
||||||
|
|
||||||
sprintf(buf, "data/%s.3DO", name);
|
sprintf(buf, "data/%s.D", name);
|
||||||
readFile(buf, RAM_LVL, MAX_RAM_LVL);
|
readFile(buf, RAM_LVL, MAX_RAM_LVL);
|
||||||
|
|
||||||
sprintf(buf, "data/%s.TEX", name);
|
sprintf(buf, "data/%s.V", name);
|
||||||
readFile(buf, RAM_TEX, MAX_RAM_TEX);
|
readFile(buf, RAM_TEX, MAX_RAM_TEX);
|
||||||
|
|
||||||
return RAM_LVL;
|
return RAM_LVL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool useMips = true;
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
printf("OpenLara 3DO\n");
|
printf("OpenLara 3DO\n");
|
||||||
@@ -297,9 +299,9 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
RAM_TEX = AllocMem(MAX_RAM_TEX, MEMTYPE_VRAM);
|
RAM_TEX = AllocMem(MAX_RAM_TEX, MEMTYPE_VRAM);
|
||||||
|
|
||||||
uint8* mem = (uint8*)AllocMem(MAX_RAM_LVL + MAX_RAM_CEL, MEMTYPE_DRAM);
|
uint8* memDRAM = (uint8*)AllocMem(MAX_RAM_LVL + MAX_RAM_CEL, MEMTYPE_DRAM);
|
||||||
RAM_LVL = mem;
|
RAM_LVL = memDRAM;
|
||||||
RAM_CEL = mem + MAX_RAM_LVL;
|
RAM_CEL = memDRAM + MAX_RAM_LVL;
|
||||||
|
|
||||||
if (!RAM_LVL) printf("RAM_LVL failed!\n");
|
if (!RAM_LVL) printf("RAM_LVL failed!\n");
|
||||||
if (!RAM_TEX) printf("RAM_TEX failed!\n");
|
if (!RAM_TEX) printf("RAM_TEX failed!\n");
|
||||||
@@ -307,6 +309,11 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
game.init(gLevelNames[gLevelID]);
|
game.init(gLevelNames[gLevelID]);
|
||||||
|
|
||||||
|
AvailMem(&memInfoVRAM, MEMTYPE_DRAM);
|
||||||
|
printf("DRAM: %d\n", memInfoVRAM.minfo_SysFree);
|
||||||
|
AvailMem(&memInfoVRAM, MEMTYPE_VRAM);
|
||||||
|
printf("VRAM: %d\n", memInfoVRAM.minfo_SysFree);
|
||||||
|
|
||||||
GetVBLTime(irqVBL, NULL, &lastFrame);
|
GetVBLTime(irqVBL, NULL, &lastFrame);
|
||||||
lastFrame /= 2;
|
lastFrame /= 2;
|
||||||
lastFrame--;
|
lastFrame--;
|
||||||
@@ -338,9 +345,14 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
if ((keys & IK_SELECT) && !(oldKeys & IK_SELECT))
|
if ((keys & IK_SELECT) && !(oldKeys & IK_SELECT))
|
||||||
{
|
{
|
||||||
gLevelID = (gLevelID + 1) % (sizeof(gLevelNames) / sizeof(gLevelNames[0]));
|
if (useMips) {
|
||||||
game.startLevel(gLevelNames[gLevelID]);
|
useMips = false;
|
||||||
lastFrame = frame - 1;
|
} else {
|
||||||
|
useMips = true;
|
||||||
|
// gLevelID = (gLevelID + 1) % (sizeof(gLevelNames) / sizeof(gLevelNames[0]));
|
||||||
|
// game.startLevel(gLevelNames[gLevelID]);
|
||||||
|
// lastFrame = frame - 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32 updateTime = osGetSystemTimeMS();
|
int32 updateTime = osGetSystemTimeMS();
|
||||||
|
@@ -8,18 +8,12 @@ struct Vertex
|
|||||||
uint16* gPalette;
|
uint16* gPalette;
|
||||||
int32 gPaletteOffset; // offset to the default or underwater PLUTs
|
int32 gPaletteOffset; // offset to the default or underwater PLUTs
|
||||||
|
|
||||||
extern uint8 lightmap[256 * 32];
|
|
||||||
extern Level level;
|
extern Level level;
|
||||||
extern const Sprite* sprites;
|
|
||||||
extern const uint8* tiles;
|
|
||||||
extern int32 lightAmbient;
|
extern int32 lightAmbient;
|
||||||
extern int32 randTable[MAX_RAND_TABLE];
|
extern int32 randTable[MAX_RAND_TABLE];
|
||||||
extern int32 caustics[MAX_CAUSTICS];
|
extern int32 caustics[MAX_CAUSTICS];
|
||||||
extern int32 causticsFrame;
|
extern int32 causticsFrame;
|
||||||
|
|
||||||
const uint8* tile;
|
|
||||||
const Sprite* sprite;
|
|
||||||
|
|
||||||
int32 gVerticesCount;
|
int32 gVerticesCount;
|
||||||
int32 gFacesCount;
|
int32 gFacesCount;
|
||||||
|
|
||||||
@@ -39,10 +33,10 @@ RectMinMax viewportRel;
|
|||||||
|
|
||||||
bool enableAlphaTest;
|
bool enableAlphaTest;
|
||||||
bool enableClipping;
|
bool enableClipping;
|
||||||
bool enableMaxSort;
|
|
||||||
bool secondPalette;
|
bool secondPalette;
|
||||||
|
|
||||||
#define SHADOW_OPACITY 3 // 50%
|
#define SHADOW_OPACITY 3 // 50%
|
||||||
|
#define MIP_DIST (1024 * 5)
|
||||||
|
|
||||||
extern Item screenItem;
|
extern Item screenItem;
|
||||||
|
|
||||||
@@ -67,9 +61,33 @@ enum ShadeValue
|
|||||||
SHADE_14 = DUP16( PPMPC_MF_6 | PPMPC_SF_8 | PPMPC_2D_2 | PPMPC_2S_PDC ), // 14/16
|
SHADE_14 = DUP16( PPMPC_MF_6 | PPMPC_SF_8 | PPMPC_2D_2 | PPMPC_2S_PDC ), // 14/16
|
||||||
SHADE_15 = DUP16( PPMPC_MF_7 | PPMPC_SF_8 | PPMPC_2D_2 | PPMPC_2S_PDC ), // 15/16
|
SHADE_15 = DUP16( PPMPC_MF_7 | PPMPC_SF_8 | PPMPC_2D_2 | PPMPC_2S_PDC ), // 15/16
|
||||||
SHADE_16 = DUP16( PPMPC_MF_8 | PPMPC_SF_8 ), // 1
|
SHADE_16 = DUP16( PPMPC_MF_8 | PPMPC_SF_8 ), // 1
|
||||||
|
SHADE_17 = DUP16( PPMPC_MF_1 | PPMPC_SF_16 | PPMPC_2S_PDC ), // 1 + 1/16
|
||||||
|
SHADE_18 = DUP16( PPMPC_MF_2 | PPMPC_SF_16 | PPMPC_2S_PDC ), // 1 + 2/16
|
||||||
|
SHADE_19 = DUP16( PPMPC_MF_3 | PPMPC_SF_16 | PPMPC_2S_PDC ), // 1 + 3/16
|
||||||
|
SHADE_20 = DUP16( PPMPC_MF_4 | PPMPC_SF_16 | PPMPC_2S_PDC ), // 1 + 4/16
|
||||||
|
SHADE_21 = DUP16( PPMPC_MF_5 | PPMPC_SF_16 | PPMPC_2S_PDC ), // 1 + 5/16
|
||||||
|
SHADE_22 = DUP16( PPMPC_MF_6 | PPMPC_SF_16 | PPMPC_2S_PDC ), // 1 + 6/16
|
||||||
|
SHADE_23 = DUP16( PPMPC_MF_7 | PPMPC_SF_16 | PPMPC_2S_PDC ), // 1 + 7/16
|
||||||
|
SHADE_24 = DUP16( PPMPC_MF_8 | PPMPC_SF_16 | PPMPC_2S_PDC ), // 1 + 8/16
|
||||||
};
|
};
|
||||||
|
|
||||||
static const uint32 shadeTable[16] = {
|
static const uint32 shadeTable[32] = {
|
||||||
|
SHADE_24,
|
||||||
|
SHADE_24,
|
||||||
|
SHADE_23,
|
||||||
|
SHADE_23,
|
||||||
|
SHADE_22,
|
||||||
|
SHADE_22,
|
||||||
|
SHADE_21,
|
||||||
|
SHADE_21,
|
||||||
|
SHADE_20,
|
||||||
|
SHADE_20,
|
||||||
|
SHADE_19,
|
||||||
|
SHADE_19,
|
||||||
|
SHADE_18,
|
||||||
|
SHADE_18,
|
||||||
|
SHADE_17,
|
||||||
|
SHADE_17,
|
||||||
SHADE_16,
|
SHADE_16,
|
||||||
SHADE_15,
|
SHADE_15,
|
||||||
SHADE_14,
|
SHADE_14,
|
||||||
@@ -197,9 +215,11 @@ bool transformBoxRect(const AABBs* box, RectMinMax* rect)
|
|||||||
|
|
||||||
for (int32 i = 0; i < 8; i++)
|
for (int32 i = 0; i < 8; i++)
|
||||||
{
|
{
|
||||||
if (v[i].z < (VIEW_MIN_F >> FIXED_SHIFT) || v[i].z >= (VIEW_MAX_F >> FIXED_SHIFT)) {
|
if (v[i].z <= 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (v[i].z >= (VIEW_MAX_F >> FIXED_SHIFT))
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
if (v[i].x < rect->x0) rect->x0 = v[i].x;
|
if (v[i].x < rect->x0) rect->x0 = v[i].x;
|
||||||
if (v[i].x > rect->x1) rect->x1 = v[i].x;
|
if (v[i].x > rect->x1) rect->x1 = v[i].x;
|
||||||
@@ -298,7 +318,7 @@ void transformMesh(const MeshVertex* vertices, int32 vCount, const uint16* vInte
|
|||||||
int32 y0 = viewportRel.y0;
|
int32 y0 = viewportRel.y0;
|
||||||
int32 x1 = viewportRel.x1;
|
int32 x1 = viewportRel.x1;
|
||||||
int32 y1 = viewportRel.y1;
|
int32 y1 = viewportRel.y1;
|
||||||
|
/*
|
||||||
res = &gVertices[gVerticesCount];
|
res = &gVertices[gVerticesCount];
|
||||||
uint8* clip = &gClip[gVerticesCount];
|
uint8* clip = &gClip[gVerticesCount];
|
||||||
|
|
||||||
@@ -310,7 +330,7 @@ void transformMesh(const MeshVertex* vertices, int32 vCount, const uint16* vInte
|
|||||||
*clip = enableClipping ? classify(res, x0, y0, x1, y1) : 0;
|
*clip = enableClipping ? classify(res, x0, y0, x1, y1) : 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
gVerticesCount += vCount;
|
gVerticesCount += vCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -321,6 +341,9 @@ void transformMesh(const MeshVertex* vertices, int32 vCount, const uint16* vInte
|
|||||||
|
|
||||||
X_INLINE Face* faceAdd(int32 depth)
|
X_INLINE Face* faceAdd(int32 depth)
|
||||||
{
|
{
|
||||||
|
if (depth < 0) depth = 0;
|
||||||
|
if (depth > OT_SIZE - 1) depth = OT_SIZE - 1;
|
||||||
|
|
||||||
if (depth < otMin) otMin = depth;
|
if (depth < otMin) otMin = depth;
|
||||||
if (depth > otMax) otMax = depth;
|
if (depth > otMax) otMax = depth;
|
||||||
|
|
||||||
@@ -391,7 +414,9 @@ X_INLINE void ccbSetColor(Face* face, uint32 flags)
|
|||||||
face->ccb_SourcePtr = (CelData*)&gPalette[flags & 0xFF];
|
face->ccb_SourcePtr = (CelData*)&gPalette[flags & 0xFF];
|
||||||
}
|
}
|
||||||
|
|
||||||
void faceAddRoomQuad(uint32 flags, const Index* indices, int32 startVertex32)
|
extern bool useMips;
|
||||||
|
|
||||||
|
X_INLINE void faceAddRoomQuad(uint32 flags, const Index* indices, int32 startVertex32)
|
||||||
{
|
{
|
||||||
uint32 i01 = startVertex32 + ((uint32*)indices)[0];
|
uint32 i01 = startVertex32 + ((uint32*)indices)[0];
|
||||||
uint32 i23 = startVertex32 + ((uint32*)indices)[1];
|
uint32 i23 = startVertex32 + ((uint32*)indices)[1];
|
||||||
@@ -446,22 +471,20 @@ void faceAddRoomQuad(uint32 flags, const Index* indices, int32 startVertex32)
|
|||||||
|
|
||||||
Face* f = faceAdd(depth);
|
Face* f = faceAdd(depth);
|
||||||
|
|
||||||
//int32 fade = flags >> (24 + 4);
|
uint32 intensity = (flags >> (FACE_MIP_SHIFT + FACE_MIP_SHIFT)) & 0xFF;
|
||||||
//f->ccb_PIXC = shadeTable[fade];
|
if (depth > (FOG_MIN >> OT_SHIFT)) {
|
||||||
|
intensity += (depth - (FOG_MIN >> OT_SHIFT)) >> 1;
|
||||||
int32 fade = depth << OT_SHIFT;
|
intensity = X_MIN(intensity, 255);
|
||||||
if (fade > FOG_MIN)
|
|
||||||
{
|
|
||||||
fade = (fade - FOG_MIN) >> 8;
|
|
||||||
if (fade > 15) {
|
|
||||||
fade = 15;
|
|
||||||
}
|
|
||||||
f->ccb_PIXC = shadeTable[fade];
|
|
||||||
} else {
|
|
||||||
f->ccb_PIXC = SHADE_16;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gTexture = level.textures + (flags & FACE_TEXTURE);
|
f->ccb_PIXC = shadeTable[intensity >> 3];
|
||||||
|
|
||||||
|
uint32 texIndex = flags;
|
||||||
|
if (useMips)
|
||||||
|
if (depth > (MIP_DIST >> OT_SHIFT)) {
|
||||||
|
texIndex >>= FACE_MIP_SHIFT;
|
||||||
|
}
|
||||||
|
gTexture = level.textures + (texIndex & FACE_TEXTURE);
|
||||||
ccbSetTexture(f, gTexture);
|
ccbSetTexture(f, gTexture);
|
||||||
|
|
||||||
int32 x0 = v0->x;
|
int32 x0 = v0->x;
|
||||||
@@ -495,7 +518,7 @@ void faceAddRoomQuad(uint32 flags, const Index* indices, int32 startVertex32)
|
|||||||
f->ccb_HDDY = (hdy1 - hdy0) >> (16 - hs);
|
f->ccb_HDDY = (hdy1 - hdy0) >> (16 - hs);
|
||||||
}
|
}
|
||||||
|
|
||||||
void faceAddRoomTriangle(uint32 flags, const Index* indices, int32 startVertex32)
|
X_INLINE void faceAddRoomTriangle(uint32 flags, const Index* indices, int32 startVertex32)
|
||||||
{
|
{
|
||||||
uint32 i01 = ((uint32*)indices)[0] + startVertex32;
|
uint32 i01 = ((uint32*)indices)[0] + startVertex32;
|
||||||
uint32 i23 = ((uint32*)indices)[1] + startVertex32;
|
uint32 i23 = ((uint32*)indices)[1] + startVertex32;
|
||||||
@@ -525,19 +548,20 @@ void faceAddRoomTriangle(uint32 flags, const Index* indices, int32 startVertex32
|
|||||||
|
|
||||||
Face* f = faceAdd(depth);
|
Face* f = faceAdd(depth);
|
||||||
|
|
||||||
int32 fade = depth << OT_SHIFT;
|
uint32 intensity = (flags >> (FACE_MIP_SHIFT + FACE_MIP_SHIFT)) & 0xFF;
|
||||||
if (fade > FOG_MIN)
|
if (depth > (FOG_MIN >> OT_SHIFT)) {
|
||||||
{
|
intensity += (depth - (FOG_MIN >> OT_SHIFT)) >> 1;
|
||||||
fade = (fade - FOG_MIN) >> 8;
|
intensity = X_MIN(intensity, 255);
|
||||||
if (fade > 15) {
|
|
||||||
fade = 15;
|
|
||||||
}
|
|
||||||
f->ccb_PIXC = shadeTable[fade];
|
|
||||||
} else {
|
|
||||||
f->ccb_PIXC = SHADE_16;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gTexture = level.textures + (flags & FACE_TEXTURE);
|
f->ccb_PIXC = shadeTable[intensity >> 3];
|
||||||
|
|
||||||
|
uint32 texIndex = flags;
|
||||||
|
if (useMips)
|
||||||
|
if (depth > (MIP_DIST >> OT_SHIFT)) {
|
||||||
|
texIndex >>= FACE_MIP_SHIFT;
|
||||||
|
}
|
||||||
|
gTexture = level.textures + (texIndex & FACE_TEXTURE);
|
||||||
ccbSetTexture(f, gTexture);
|
ccbSetTexture(f, gTexture);
|
||||||
|
|
||||||
int32 x0 = v0->x;
|
int32 x0 = v0->x;
|
||||||
@@ -567,7 +591,7 @@ void faceAddRoomTriangle(uint32 flags, const Index* indices, int32 startVertex32
|
|||||||
f->ccb_HDDY = -hdy0 >> (16 - hs);
|
f->ccb_HDDY = -hdy0 >> (16 - hs);
|
||||||
}
|
}
|
||||||
|
|
||||||
void faceAddMeshQuad(uint32 flags, const Index* indices, int32 startVertex32, uint32 shade)
|
X_INLINE void faceAddMeshQuad(uint32 flags, const Index* indices, int32 startVertex32, uint32 shade)
|
||||||
{
|
{
|
||||||
uint32 i01 = startVertex32 + ((uint32*)indices)[0];
|
uint32 i01 = startVertex32 + ((uint32*)indices)[0];
|
||||||
uint32 i23 = startVertex32 + ((uint32*)indices)[1];
|
uint32 i23 = startVertex32 + ((uint32*)indices)[1];
|
||||||
@@ -576,7 +600,7 @@ void faceAddMeshQuad(uint32 flags, const Index* indices, int32 startVertex32, ui
|
|||||||
uint32 i1 = (i01 & 0xFFFF);
|
uint32 i1 = (i01 & 0xFFFF);
|
||||||
uint32 i2 = (i23 >> 16);
|
uint32 i2 = (i23 >> 16);
|
||||||
uint32 i3 = (i23 & 0xFFFF);
|
uint32 i3 = (i23 & 0xFFFF);
|
||||||
|
/*
|
||||||
uint8 c0 = gClip[i0];
|
uint8 c0 = gClip[i0];
|
||||||
uint8 c1 = gClip[i1];
|
uint8 c1 = gClip[i1];
|
||||||
uint8 c2 = gClip[i2];
|
uint8 c2 = gClip[i2];
|
||||||
@@ -587,7 +611,7 @@ void faceAddMeshQuad(uint32 flags, const Index* indices, int32 startVertex32, ui
|
|||||||
|
|
||||||
if (c0 == 32 || c1 == 32 || c2 == 32 || c3 == 32)
|
if (c0 == 32 || c1 == 32 || c2 == 32 || c3 == 32)
|
||||||
return;
|
return;
|
||||||
|
*/
|
||||||
const Vertex* v0 = gVertices + i0;
|
const Vertex* v0 = gVertices + i0;
|
||||||
const Vertex* v1 = gVertices + i1;
|
const Vertex* v1 = gVertices + i1;
|
||||||
const Vertex* v2 = gVertices + i2;
|
const Vertex* v2 = gVertices + i2;
|
||||||
@@ -635,7 +659,7 @@ void faceAddMeshQuad(uint32 flags, const Index* indices, int32 startVertex32, ui
|
|||||||
f->ccb_HDDY = (hdy1 - hdy0) >> (16 - hs);
|
f->ccb_HDDY = (hdy1 - hdy0) >> (16 - hs);
|
||||||
}
|
}
|
||||||
|
|
||||||
void faceAddMeshTriangle(uint32 flags, const Index* indices, int32 startVertex32, uint32 shade)
|
X_INLINE void faceAddMeshTriangle(uint32 flags, const Index* indices, int32 startVertex32, uint32 shade)
|
||||||
{
|
{
|
||||||
uint32 i01 = ((uint32*)indices)[0] + startVertex32;
|
uint32 i01 = ((uint32*)indices)[0] + startVertex32;
|
||||||
uint32 i23 = ((uint32*)indices)[1] + startVertex32;
|
uint32 i23 = ((uint32*)indices)[1] + startVertex32;
|
||||||
@@ -643,7 +667,7 @@ void faceAddMeshTriangle(uint32 flags, const Index* indices, int32 startVertex32
|
|||||||
uint32 i0 = (i01 >> 16);
|
uint32 i0 = (i01 >> 16);
|
||||||
uint32 i1 = (i01 & 0xFFFF);
|
uint32 i1 = (i01 & 0xFFFF);
|
||||||
uint32 i2 = (i23 >> 16);
|
uint32 i2 = (i23 >> 16);
|
||||||
|
/*
|
||||||
uint8 c0 = gClip[i0];
|
uint8 c0 = gClip[i0];
|
||||||
uint8 c1 = gClip[i1];
|
uint8 c1 = gClip[i1];
|
||||||
uint8 c2 = gClip[i2];
|
uint8 c2 = gClip[i2];
|
||||||
@@ -653,7 +677,7 @@ void faceAddMeshTriangle(uint32 flags, const Index* indices, int32 startVertex32
|
|||||||
|
|
||||||
if (c0 == 32 || c1 == 32 || c2 == 32)
|
if (c0 == 32 || c1 == 32 || c2 == 32)
|
||||||
return;
|
return;
|
||||||
|
*/
|
||||||
const Vertex* v0 = gVertices + i0;
|
const Vertex* v0 = gVertices + i0;
|
||||||
const Vertex* v1 = gVertices + i1;
|
const Vertex* v1 = gVertices + i1;
|
||||||
const Vertex* v2 = gVertices + i2;
|
const Vertex* v2 = gVertices + i2;
|
||||||
@@ -696,7 +720,7 @@ void faceAddMeshTriangle(uint32 flags, const Index* indices, int32 startVertex32
|
|||||||
f->ccb_HDDY = -hdy0 >> (16 - hs);
|
f->ccb_HDDY = -hdy0 >> (16 - hs);
|
||||||
}
|
}
|
||||||
|
|
||||||
void faceAddMeshQuadFlat(uint32 flags, const Index* indices, int32 startVertex32, uint32 shade)
|
X_INLINE void faceAddMeshQuadFlat(uint32 flags, const Index* indices, int32 startVertex32, uint32 shade)
|
||||||
{
|
{
|
||||||
uint32 i01 = startVertex32 + ((uint32*)indices)[0];
|
uint32 i01 = startVertex32 + ((uint32*)indices)[0];
|
||||||
uint32 i23 = startVertex32 + ((uint32*)indices)[1];
|
uint32 i23 = startVertex32 + ((uint32*)indices)[1];
|
||||||
@@ -705,7 +729,7 @@ void faceAddMeshQuadFlat(uint32 flags, const Index* indices, int32 startVertex32
|
|||||||
uint32 i1 = (i01 & 0xFFFF);
|
uint32 i1 = (i01 & 0xFFFF);
|
||||||
uint32 i2 = (i23 >> 16);
|
uint32 i2 = (i23 >> 16);
|
||||||
uint32 i3 = (i23 & 0xFFFF);
|
uint32 i3 = (i23 & 0xFFFF);
|
||||||
|
/*
|
||||||
uint8 c0 = gClip[i0];
|
uint8 c0 = gClip[i0];
|
||||||
uint8 c1 = gClip[i1];
|
uint8 c1 = gClip[i1];
|
||||||
uint8 c2 = gClip[i2];
|
uint8 c2 = gClip[i2];
|
||||||
@@ -716,13 +740,13 @@ void faceAddMeshQuadFlat(uint32 flags, const Index* indices, int32 startVertex32
|
|||||||
|
|
||||||
if (c0 == 32 || c1 == 32 || c2 == 32 || c3 == 32)
|
if (c0 == 32 || c1 == 32 || c2 == 32 || c3 == 32)
|
||||||
return;
|
return;
|
||||||
|
*/
|
||||||
const Vertex* v0 = gVertices + i0;
|
const Vertex* v0 = gVertices + i0;
|
||||||
const Vertex* v1 = gVertices + i1;
|
const Vertex* v1 = gVertices + i1;
|
||||||
const Vertex* v2 = gVertices + i2;
|
const Vertex* v2 = gVertices + i2;
|
||||||
const Vertex* v3 = gVertices + i3;
|
const Vertex* v3 = gVertices + i3;
|
||||||
|
|
||||||
if (checkBackface(v0, v1, v2) == !(flags & FACE_CCW))
|
if (checkBackface(v0, v1, v2))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
int32 depth = DEPTH_Q_AVG();
|
int32 depth = DEPTH_Q_AVG();
|
||||||
@@ -760,7 +784,7 @@ void faceAddMeshQuadFlat(uint32 flags, const Index* indices, int32 startVertex32
|
|||||||
f->ccb_HDDY = (hdy1 - hdy0);
|
f->ccb_HDDY = (hdy1 - hdy0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void faceAddMeshTriangleFlat(uint32 flags, const Index* indices, int32 startVertex32, uint32 shade)
|
X_INLINE void faceAddMeshTriangleFlat(uint32 flags, const Index* indices, int32 startVertex32, uint32 shade)
|
||||||
{
|
{
|
||||||
uint32 i01 = ((uint32*)indices)[0] + startVertex32;
|
uint32 i01 = ((uint32*)indices)[0] + startVertex32;
|
||||||
uint32 i23 = ((uint32*)indices)[1] + startVertex32;
|
uint32 i23 = ((uint32*)indices)[1] + startVertex32;
|
||||||
@@ -768,7 +792,7 @@ void faceAddMeshTriangleFlat(uint32 flags, const Index* indices, int32 startVert
|
|||||||
uint32 i0 = (i01 >> 16);
|
uint32 i0 = (i01 >> 16);
|
||||||
uint32 i1 = (i01 & 0xFFFF);
|
uint32 i1 = (i01 & 0xFFFF);
|
||||||
uint32 i2 = (i23 >> 16);
|
uint32 i2 = (i23 >> 16);
|
||||||
|
/*
|
||||||
uint8 c0 = gClip[i0];
|
uint8 c0 = gClip[i0];
|
||||||
uint8 c1 = gClip[i1];
|
uint8 c1 = gClip[i1];
|
||||||
uint8 c2 = gClip[i2];
|
uint8 c2 = gClip[i2];
|
||||||
@@ -778,7 +802,7 @@ void faceAddMeshTriangleFlat(uint32 flags, const Index* indices, int32 startVert
|
|||||||
|
|
||||||
if (c0 == 32 || c1 == 32 || c2 == 32)
|
if (c0 == 32 || c1 == 32 || c2 == 32)
|
||||||
return;
|
return;
|
||||||
|
*/
|
||||||
const Vertex* v0 = gVertices + i0;
|
const Vertex* v0 = gVertices + i0;
|
||||||
const Vertex* v1 = gVertices + i1;
|
const Vertex* v1 = gVertices + i1;
|
||||||
const Vertex* v2 = gVertices + i2;
|
const Vertex* v2 = gVertices + i2;
|
||||||
@@ -895,18 +919,14 @@ void faceAddSprite(int32 vx, int32 vy, int32 vz, int32 vg, int32 index)
|
|||||||
|
|
||||||
Face* f = faceAdd(depth);
|
Face* f = faceAdd(depth);
|
||||||
|
|
||||||
int32 fade = depth << OT_SHIFT;
|
if (depth > (FOG_MIN >> OT_SHIFT)) {
|
||||||
if (fade > FOG_MIN)
|
vg += (depth - (FOG_MIN >> OT_SHIFT)) << 4;
|
||||||
{
|
vg = X_MIN(vg, 8191);
|
||||||
fade = (fade - FOG_MIN) >> 8;
|
|
||||||
if (fade > 15) {
|
|
||||||
fade = 15;
|
|
||||||
}
|
|
||||||
f->ccb_PIXC = shadeTable[fade];
|
|
||||||
} else {
|
|
||||||
f->ccb_PIXC = SHADE_16;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vg >>= 8;
|
||||||
|
f->ccb_PIXC = shadeTable[vg];
|
||||||
|
|
||||||
Texture* texture = level.textures + sprite->texture;
|
Texture* texture = level.textures + sprite->texture;
|
||||||
ccbSetTexture(f, texture);
|
ccbSetTexture(f, texture);
|
||||||
|
|
||||||
@@ -948,12 +968,12 @@ void faceAddRoom(const Quad* quads, int32 qCount, const Triangle* triangles, int
|
|||||||
{
|
{
|
||||||
startVertex |= startVertex << 16;
|
startVertex |= startVertex << 16;
|
||||||
|
|
||||||
for (int32 i = 0; i < qCount; i++) {
|
for (int32 i = 0; i < qCount; i++, quads++) {
|
||||||
faceAddRoomQuad(quads[i].flags, quads[i].indices, startVertex);
|
faceAddRoomQuad(quads->flags, quads->indices, startVertex);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32 i = 0; i < tCount; i++) {
|
for (int32 i = 0; i < tCount; i++, triangles++) {
|
||||||
faceAddRoomTriangle(triangles[i].flags, triangles[i].indices, startVertex);
|
faceAddRoomTriangle(triangles->flags, triangles->indices, startVertex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -963,7 +983,7 @@ void faceAddMesh(const Quad* rFaces, const Quad* crFaces, const Triangle* tFaces
|
|||||||
|
|
||||||
uint32 shade;
|
uint32 shade;
|
||||||
if (lightAmbient > 4096) {
|
if (lightAmbient > 4096) {
|
||||||
shade = shadeTable[(lightAmbient - 4096) >> 8];
|
shade = shadeTable[lightAmbient >> 8];
|
||||||
} else {
|
} else {
|
||||||
shade = SHADE_16;
|
shade = SHADE_16;
|
||||||
}
|
}
|
||||||
|
@@ -11,6 +11,8 @@ struct Channel
|
|||||||
Item frequency;
|
Item frequency;
|
||||||
Item amplitude;
|
Item amplitude;
|
||||||
|
|
||||||
|
Item playing; // TODO
|
||||||
|
|
||||||
void setPitch(uint32 value)
|
void setPitch(uint32 value)
|
||||||
{
|
{
|
||||||
TweakKnob(frequency, value);
|
TweakKnob(frequency, value);
|
||||||
@@ -66,6 +68,15 @@ void sndInit()
|
|||||||
|
|
||||||
void sndInitSamples()
|
void sndInitSamples()
|
||||||
{
|
{
|
||||||
|
for (int32 i = 0; i < SND_CHANNELS; i++)
|
||||||
|
{
|
||||||
|
StopInstrument(channels[i].sample, NULL);
|
||||||
|
if (channels[i].attach) {
|
||||||
|
DetachSample(channels[i].attach);
|
||||||
|
}
|
||||||
|
channels[i].playing = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
for (int32 i = 0; i < level.soundOffsetsCount; i++)
|
for (int32 i = 0; i < level.soundOffsetsCount; i++)
|
||||||
{
|
{
|
||||||
uint8* data = (uint8*)level.soundData + level.soundOffsets[i];
|
uint8* data = (uint8*)level.soundData + level.soundOffsets[i];
|
||||||
@@ -86,6 +97,27 @@ int32 idx = 0;
|
|||||||
|
|
||||||
void* sndPlaySample(int32 index, int32 volume, int32 pitch, int32 mode)
|
void* sndPlaySample(int32 index, int32 volume, int32 pitch, int32 mode)
|
||||||
{
|
{
|
||||||
|
if (mode == UNIQUE || mode == REPLAY)
|
||||||
|
{
|
||||||
|
for (int32 i = 0; i < SND_CHANNELS; i++)
|
||||||
|
{
|
||||||
|
if (channels[i].playing != samples[index])
|
||||||
|
continue;
|
||||||
|
|
||||||
|
channels[i].setVolume(0x7FFF * volume >> SND_VOL_SHIFT);
|
||||||
|
channels[i].setPitch(0x2000 * pitch >> SND_PITCH_SHIFT);
|
||||||
|
|
||||||
|
//if (mode == REPLAY) TODO
|
||||||
|
{
|
||||||
|
StopInstrument(channels[i].sample, NULL);
|
||||||
|
StartInstrument(channels[i].sample, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (void*)channels[i].sample;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO
|
||||||
idx = (idx + 1) % SND_CHANNELS;
|
idx = (idx + 1) % SND_CHANNELS;
|
||||||
|
|
||||||
StopInstrument(channels[idx].sample, NULL);
|
StopInstrument(channels[idx].sample, NULL);
|
||||||
@@ -94,6 +126,8 @@ void* sndPlaySample(int32 index, int32 volume, int32 pitch, int32 mode)
|
|||||||
}
|
}
|
||||||
|
|
||||||
channels[idx].attach = AttachSample(channels[idx].sample, samples[index], NULL);
|
channels[idx].attach = AttachSample(channels[idx].sample, samples[index], NULL);
|
||||||
|
channels[idx].playing = samples[index];
|
||||||
|
|
||||||
StartInstrument(channels[idx].sample, NULL);
|
StartInstrument(channels[idx].sample, NULL);
|
||||||
|
|
||||||
channels[idx].setVolume(0x7FFF * volume >> SND_VOL_SHIFT);
|
channels[idx].setVolume(0x7FFF * volume >> SND_VOL_SHIFT);
|
||||||
|
Reference in New Issue
Block a user