mirror of
https://github.com/scummvm/scummvm.git
synced 2025-04-02 10:52:32 -04:00
182 lines
5.8 KiB
C++
182 lines
5.8 KiB
C++
/* ScummVM - Graphic Adventure Engine
|
|
*
|
|
* ScummVM is the legal property of its developers, whose names
|
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
|
* file distributed with this source distribution.
|
|
*
|
|
* Additional copyright for this file:
|
|
* Copyright (C) 1999-2000 Revolution Software Ltd.
|
|
* This code is based on source code created by Revolution Software,
|
|
* used with permission.
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
*/
|
|
|
|
#ifndef ICB_RAP_API_HH
|
|
#define ICB_RAP_API_HH
|
|
|
|
#include "engines/icb/gfx/psx_pcdefines.h"
|
|
|
|
#include "common/endian.h"
|
|
|
|
namespace ICB {
|
|
|
|
#define RAP_API_SCHEMA 10
|
|
|
|
#define RAP_API_ID "RAP"
|
|
|
|
// A bone-bone link
|
|
// tx, ty, tz : is translation
|
|
// parent : is the parent bone ID
|
|
// = nBones means no linkage
|
|
typedef struct BoneLink {
|
|
int16 tx, ty, tz;
|
|
uint16 parent;
|
|
} BoneLink;
|
|
|
|
// A simple vertex description
|
|
typedef struct Vertex {
|
|
int16 vx, vy, vz;
|
|
uint16 vertId;
|
|
} Vertex;
|
|
|
|
// A vertex-bone link
|
|
typedef struct VertexLink {
|
|
int16 vx, vy, vz; // the position in bone co-ordinate frame
|
|
int16 primId; // bone id - -ve number means no bone just "local" frame
|
|
uint32 vertId; // vertex id
|
|
} VertexLink;
|
|
|
|
// A weighted vertex-bone link
|
|
typedef struct WeightedVertexLink {
|
|
VertexLink link;
|
|
uint32 weight; // % weight (fixed-point int scaled to weightScale)
|
|
} WeightedVertexLink;
|
|
|
|
// Each polygon is 6 32-bit WORDS
|
|
// Bit 31 ----> Bit 0
|
|
//
|
|
// 8-bits | 8-bits | 16-bits
|
|
// --------------------------
|
|
// u0 | v0 | cba
|
|
// u1 | v1 | tsb
|
|
// u2 | v2 | pad
|
|
// --------------------------
|
|
// n0 | v0
|
|
// n1 | v1
|
|
// n2 | v2
|
|
//
|
|
// u0, v0 = u,v of vertex 0 : 0-255
|
|
// u1, v1 = u,v of vertex 1 : 0-255
|
|
// u2, v2 = u,v of vertex 2 : 0-255
|
|
// cba = weird PSX flag, giving the VRAM x,y of the CLUT to use
|
|
// tsb = weird PSX flag, giving the VRAM texture page to use
|
|
// pad = padding !
|
|
//
|
|
// n0, v0 = index into the normal and vertex pool for normal/vertex 0
|
|
// n1, v1 = index into the normal and vertex pool for normal/vertex 1
|
|
// n2, v2 = index into the normal and vertex pool for normal/vertex 2
|
|
//
|
|
// The .rap file format
|
|
//
|
|
// Notice, how poor ANSI C/C++ is at its representation
|
|
//
|
|
|
|
typedef struct {
|
|
char id[4];
|
|
uint32 schema;
|
|
uint32 platform;
|
|
uint32 worldScaleShift;
|
|
uint32 weightScaleShift;
|
|
uint32 bothScaleShift;
|
|
uint32 nNone;
|
|
uint32 nSingle;
|
|
uint32 nMultiple;
|
|
uint32 nFUS3;
|
|
uint32 nGUS3;
|
|
uint32 nFTS3;
|
|
uint32 nGTS3;
|
|
uint32 nFUL3;
|
|
uint32 nGUL3;
|
|
uint32 nFTL3;
|
|
uint32 nGTL3;
|
|
uint16 nTRI3;
|
|
uint16 nFrames;
|
|
uint32 nAnimTypes;
|
|
uint32 animPolySize; // in bytes
|
|
uint16 nBones;
|
|
int8 jawBone; // -1 - means not there
|
|
int8 neckBone; // - 1 - means not there
|
|
uint32 singleLinkOffset; // in bytes
|
|
uint32 multiLinkOffset; // in bytes
|
|
uint32 FUS3offset; // in bytes
|
|
uint32 GUS3offset; // in bytes
|
|
uint32 FTS3offset; // in bytes
|
|
uint32 GTS3offset; // in bytes
|
|
uint32 FUL3offset; // in bytes
|
|
uint32 GUL3offset; // in bytes
|
|
uint32 FTL3offset; // in bytes
|
|
uint32 GTL3offset; // in bytes
|
|
uint16 TRI3offset; // in bytes
|
|
uint16 animPolyOffset; // in bytes
|
|
uint32 normalOffset; // in bytes
|
|
uint32 boneOffset; // in bytes
|
|
Vertex noneLinkData[1]; // Vertex noLinkData[nNone];
|
|
} RapAPI;
|
|
|
|
class RapAPIObject {
|
|
public:
|
|
static Vertex *GetNoneLinkPtr(RapAPI *rap) { return rap->noneLinkData; }
|
|
|
|
static VertexLink *GetSingleLinkPtr(RapAPI *rap) { return (VertexLink *)(rap->id + rap->singleLinkOffset); }
|
|
|
|
static WeightedVertexLink *GetMultiLinkPtr(RapAPI *rap) { return (WeightedVertexLink *)(rap->id + rap->multiLinkOffset); }
|
|
|
|
static uint32 *GetFUS3Ptr(RapAPI *rap) { return (uint32 *)(rap->id + rap->FUS3offset); }
|
|
static uint32 *GetGUS3Ptr(RapAPI *rap) { return (uint32 *)(rap->id + rap->GUS3offset); }
|
|
static uint32 *GetFTS3Ptr(RapAPI *rap) { return (uint32 *)(rap->id + rap->FTS3offset); }
|
|
static uint32 *GetGTS3Ptr(RapAPI *rap) { return (uint32 *)(rap->id + rap->GTS3offset); }
|
|
static uint32 *GetFUL3Ptr(RapAPI *rap) { return (uint32 *)(rap->id + rap->FUL3offset); }
|
|
static uint32 *GetGUL3Ptr(RapAPI *rap) { return (uint32 *)(rap->id + rap->GUL3offset); }
|
|
static uint32 *GetFTL3Ptr(RapAPI *rap) { return (uint32 *)(rap->id + rap->FTL3offset); }
|
|
static uint32 *GetGTL3Ptr(RapAPI *rap) { return (uint32 *)(rap->id + rap->GTL3offset); }
|
|
static uint32 *GetTRI3Ptr(RapAPI *rap) { return (uint32 *)(rap->id + rap->TRI3offset); }
|
|
static uint32 *GetNormalPtr(RapAPI *rap) { return (uint32 *)(rap->id + rap->normalOffset); }
|
|
static BoneLink *GetBonePtr(RapAPI *rap) { return (BoneLink *)(rap->id + rap->boneOffset); }
|
|
static uint32 *GetBoneHashPtr(RapAPI *rap) {
|
|
BoneLink *bPtr = GetBonePtr(rap);
|
|
return (uint32 *)(bPtr + rap->nBones);
|
|
}
|
|
static uint32 *GetAnimPolyPtr(RapAPI *rap) {
|
|
return (uint32 *)(rap->id + rap->animPolyOffset);
|
|
|
|
}
|
|
static uint32 *GetAnimPolyFrame(RapAPI *rap, int32 frame) {
|
|
return (uint32 *)(rap->id + rap->animPolyOffset + rap->nAnimTypes * 2 * sizeof(uint32) + frame * rap->animPolySize);
|
|
}
|
|
};
|
|
|
|
inline void ConvertRAP(RapAPI *rap) {
|
|
// Do we need to do any conversion ?
|
|
if (FROM_LE_32(rap->schema) == RAP_API_SCHEMA)
|
|
return;
|
|
|
|
// You can't so a schema check will fail !
|
|
return;
|
|
}
|
|
|
|
} // End of namespace ICB
|
|
|
|
#endif // #ifndef RAP_API_HH
|