Path: blob/master/RSDKv5/RSDK/Graphics/Scene3D.hpp
1167 views
#ifndef SCENE3D_H1#define SCENE3D_H23namespace RSDK4{56#define RSDK_SIGNATURE_MDL (0x4C444D) // "MDL"78#define SCENE3D_COUNT (0x20)9#define MODEL_COUNT (0x100)10#define SCENE3D_VERT_COUNT (0x4000)1112enum Scene3DDrawTypes {13S3D_WIREFRAME,14S3D_SOLIDCOLOR,1516S3D_UNUSED_1,17S3D_UNUSED_2,1819S3D_WIREFRAME_SHADED,20S3D_SOLIDCOLOR_SHADED,2122S3D_SOLIDCOLOR_SHADED_BLENDED,2324S3D_WIREFRAME_SCREEN,25S3D_SOLIDCOLOR_SCREEN,2627S3D_WIREFRAME_SHADED_SCREEN,28S3D_SOLIDCOLOR_SHADED_SCREEN,2930S3D_SOLIDCOLOR_SHADED_BLENDED_SCREEN,31};3233struct ScanEdge {34int32 start;35int32 end;3637int32 startR;38int32 endR;39int32 startG;40int32 endG;41int32 startB;42int32 endB;43};4445struct Matrix {46int32 values[4][4];47};4849struct ModelVertex {50int32 x;51int32 y;52int32 z;5354int32 nx;55int32 ny;56int32 nz;57};5859struct TexCoord {60float x;61float y;62};6364struct Model {65RETRO_HASH_MD5(hash);66ModelVertex *vertices;67TexCoord *texCoords;68Color *colors;69uint16 *indices;70uint16 vertCount;71uint16 indexCount;72uint16 frameCount;73uint8 flags;74uint8 faceVertCount;75uint8 scope;76};7778struct Scene3DVertex {79int32 x;80int32 y;81int32 z;8283int32 nx;84int32 ny;85int32 nz;8687int32 tx;88int32 ty;8990uint32 color;91};9293struct Scene3DFace {94int32 depth;95int32 index;96};9798struct Scene3D {99RETRO_HASH_MD5(hash);100Scene3DVertex *vertices;101Scene3DVertex *normals;102Scene3DFace *faceBuffer;103uint8 *faceVertCounts;104105int32 projectionX;106int32 projectionY;107108int32 diffuseX;109int32 diffuseY;110int32 diffuseZ;111112int32 diffuseIntensityX;113int32 diffuseIntensityY;114int32 diffuseIntensityZ;115116int32 specularIntensityX;117int32 specularIntensityY;118int32 specularIntensityZ;119120uint16 vertLimit;121uint16 vertexCount;122uint16 faceCount;123uint8 drawMode;124uint8 scope;125};126127extern Model modelList[MODEL_COUNT];128extern Scene3D scene3DList[SCENE3D_COUNT];129130extern ScanEdge scanEdgeBuffer[SCREEN_YSIZE * 2];131132void ProcessScanEdge(int32 x1, int32 y1, int32 x2, int32 y2);133void ProcessScanEdgeClr(uint32 c1, uint32 c2, int32 x1, int32 y1, int32 x2, int32 y2);134135void SetIdentityMatrix(Matrix *matrix);136void MatrixMultiply(Matrix *dest, Matrix *matrixA, Matrix *matrixB);137void MatrixTranslateXYZ(Matrix *Matrix, int32 x, int32 y, int32 z, bool32 setIdentity);138void MatrixScaleXYZ(Matrix *matrix, int32 scaleX, int32 scaleY, int32 scaleZ);139void MatrixRotateX(Matrix *matrix, int16 angle);140void MatrixRotateY(Matrix *matrix, int16 angle);141void MatrixRotateZ(Matrix *matrix, int16 angle);142void MatrixRotateXYZ(Matrix *matrix, int16 rotationX, int16 rotationY, int16 rotationZ);143void MatrixInverse(Matrix *dest, Matrix *matrix);144inline void MatrixCopy(Matrix *matDst, Matrix *matSrc) { memcpy(matDst, matSrc, sizeof(Matrix)); }145146uint16 LoadMesh(const char *filepath, uint8 scope);147uint16 Create3DScene(const char *name, uint16 faceCnt, uint8 scope);148inline void Prepare3DScene(uint16 sceneID)149{150if (sceneID < SCENE3D_COUNT) {151Scene3D *scn = &scene3DList[sceneID];152153scn->vertexCount = 0;154scn->faceCount = 0;155156memset(scn->vertices, 0, sizeof(Scene3DVertex) * scn->vertLimit);157memset(scn->normals, 0, sizeof(Scene3DVertex) * scn->vertLimit);158memset(scn->faceVertCounts, 0, sizeof(uint8) * scn->vertLimit);159memset(scn->faceBuffer, 0, sizeof(Scene3DFace) * scn->vertLimit);160}161}162163inline void SetMeshAnimation(uint16 model, Animator *animator, int16 speed, uint8 loopIndex, bool32 forceApply, int16 frameID)164{165if (model >= MODEL_COUNT) {166if (animator)167animator->frames = NULL;168169return;170}171172if (!animator)173return;174175if (animator->animationID == model && !forceApply)176return;177178animator->frames = (SpriteFrame *)1;179animator->timer = 0;180animator->frameID = frameID;181animator->frameCount = modelList[model].frameCount;182animator->speed = speed;183animator->prevAnimationID = animator->animationID;184animator->frameDuration = 0x100;185animator->loopIndex = loopIndex;186animator->animationID = model;187}188inline void SetDiffuseColor(uint16 sceneID, uint8 x, uint8 y, uint8 z)189{190if (sceneID < SCENE3D_COUNT) {191Scene3D *scn = &scene3DList[sceneID];192scn->diffuseX = x;193scn->diffuseY = y;194scn->diffuseZ = z;195}196}197inline void SetDiffuseIntensity(uint16 sceneID, uint8 x, uint8 y, uint8 z)198{199if (sceneID < SCENE3D_COUNT) {200Scene3D *scn = &scene3DList[sceneID];201scn->diffuseIntensityX = x;202scn->diffuseIntensityY = y;203scn->diffuseIntensityZ = z;204}205}206inline void SetSpecularIntensity(uint16 sceneID, uint8 x, uint8 y, uint8 z)207{208if (sceneID < SCENE3D_COUNT) {209Scene3D *scn = &scene3DList[sceneID];210scn->specularIntensityX = x;211scn->specularIntensityY = y;212scn->specularIntensityZ = z;213}214}215void AddModelToScene(uint16 modelFrames, uint16 sceneIndex, uint8 drawMode, Matrix *matWorld, Matrix *matView, color color);216void AddMeshFrameToScene(uint16 modelFrames, uint16 sceneIndex, Animator *animator, uint8 drawMode, Matrix *matWorld, Matrix *matView, color color);217void Sort3DDrawList(Scene3D *scn, int32 first, int32 last);218void Draw3DScene(uint16 sceneID);219220inline void Clear3DScenes()221{222// Unload Models223for (int32 m = 0; m < MODEL_COUNT; ++m) {224if (modelList[m].scope != SCOPE_GLOBAL) {225MEM_ZERO(modelList[m]);226modelList[m].scope = SCOPE_NONE;227}228}229230// Unload 3D Scenes231for (int32 s = 0; s < SCENE3D_COUNT; ++s) {232if (scene3DList[s].scope != SCOPE_GLOBAL) {233MEM_ZERO(scene3DList[s]);234scene3DList[s].scope = SCOPE_NONE;235}236}237}238239#if RETRO_REV0U240#include "Legacy/Scene3DLegacy.hpp"241#endif242243} // namespace RSDK244245#endif246247248