mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-14 05:38:56 +00:00
EMI: import costume, model resource loaders from klusark fork with some modifications
This commit is contained in:
parent
0c67b7c8c2
commit
7cb42a7595
@ -761,11 +761,7 @@ void SoundComponent::reset() {
|
||||
Costume::Costume(const char *fname, const char *data, int len, Costume *prevCost) :
|
||||
Object() {
|
||||
|
||||
load(fname, data, len, prevCost);
|
||||
}
|
||||
|
||||
void Costume::load(const char *filename, const char *data, int len, Costume *prevCost) {
|
||||
_fname = filename;
|
||||
_fname = fname;
|
||||
_head.maxPitch = 0;
|
||||
_head.joint1 = -1;
|
||||
_head.joint2 = -1;
|
||||
@ -776,9 +772,16 @@ void Costume::load(const char *filename, const char *data, int len, Costume *pre
|
||||
_headYaw = 0;
|
||||
_headPitch = 0;
|
||||
_prevCostume = prevCost;
|
||||
if (g_grim->getGameType() == GType_MONKEY4) {
|
||||
Common::MemoryReadStream ms((const byte *)data, len);
|
||||
loadEMI(ms, prevCost);
|
||||
} else {
|
||||
TextSplitter ts(data, len);
|
||||
loadGRIM(ts, prevCost);
|
||||
}
|
||||
}
|
||||
|
||||
TextSplitter ts(data, len);
|
||||
|
||||
void Costume::loadGRIM(TextSplitter &ts, Costume *prevCost) {
|
||||
ts.expectString("costume v0.1");
|
||||
ts.expectString("section tags");
|
||||
int numTags;
|
||||
@ -863,6 +866,68 @@ void Costume::load(const char *filename, const char *data, int len, Costume *pre
|
||||
}
|
||||
}
|
||||
|
||||
void Costume::loadEMI(Common::MemoryReadStream &ms, Costume *prevCost) {
|
||||
Common::List<Component *>components;
|
||||
|
||||
_numChores = ms.readUint32LE();
|
||||
_chores = new Chore[_numChores];
|
||||
for (int i = 0; i < _numChores; i++) {
|
||||
uint32 nameLength;
|
||||
nameLength = ms.readUint32LE();
|
||||
ms.read(_chores[i]._name, nameLength);
|
||||
float length;
|
||||
ms.read(&length, 4);
|
||||
_chores[i]._length = (int)length;
|
||||
|
||||
_chores[i]._owner = this;
|
||||
_chores[i]._numTracks = ms.readUint32LE();
|
||||
_chores[i]._tracks = new ChoreTrack[_chores[i]._numTracks];
|
||||
|
||||
for (int k = 0; k < _chores[i]._numTracks; k++) {
|
||||
int componentNameLength = ms.readUint32LE();
|
||||
assert(componentNameLength < 64);
|
||||
|
||||
char name[64];
|
||||
ms.read(name, componentNameLength);
|
||||
|
||||
int trackID = ms.readUint32LE();
|
||||
int parent = ms.readUint32LE();
|
||||
assert(parent == -1);
|
||||
|
||||
Component *component = loadComponentEMI(name, parent);
|
||||
|
||||
components.push_back(component);
|
||||
|
||||
ChoreTrack &track = _chores[i]._tracks[k];
|
||||
track.numKeys = ms.readUint32LE();
|
||||
track.keys = new TrackKey[track.numKeys];
|
||||
|
||||
// this is probably wrong
|
||||
track.compID = 0;
|
||||
for (int j = 0; j < track.numKeys; j++) {
|
||||
float time, value;
|
||||
ms.read(&time, 4);
|
||||
ms.read(&value, 4);
|
||||
track.keys[j].time = time;
|
||||
track.keys[j].value = value;
|
||||
}
|
||||
}
|
||||
_chores[i]._tracks->compID;
|
||||
}
|
||||
|
||||
_numComponents = components.size();
|
||||
_components = new Component *[_numComponents];
|
||||
int i = 0;
|
||||
for (Common::List<Component *>::iterator it = components.begin(); it != components.end(); ++it, ++i) {
|
||||
_components[i] = *it;
|
||||
if (!_components[i])
|
||||
continue;
|
||||
_components[i]->setCostume(this);
|
||||
_components[i]->init();
|
||||
_components[i]->setFade(1.f);
|
||||
}
|
||||
}
|
||||
|
||||
Costume::~Costume() {
|
||||
if (_chores) {
|
||||
stopChores();
|
||||
@ -1116,6 +1181,46 @@ Costume::Component *Costume::loadComponent (tag32 tag, Costume::Component *paren
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Costume::Component *Costume::loadComponentEMI(const char *name, int parentID) {
|
||||
// some have an exclimation mark, this could mean something.
|
||||
assert(name[0] == '!');
|
||||
++name;
|
||||
|
||||
char type[5];
|
||||
memcpy(type, name, 4);
|
||||
type[4] = 0;
|
||||
|
||||
name += 4;
|
||||
|
||||
if (strcmp(type, "mesh") == 0)
|
||||
return new MainModelComponent(0, parentID, name, 0, 0);
|
||||
/*if (FROM_BE_32(tag) == MKTAG('M','M','D','L'))
|
||||
return new MainModelComponent(parent, parentID, name, prevComponent, tag);
|
||||
else if (FROM_BE_32(tag) == MKTAG('M','O','D','L'))
|
||||
return new ModelComponent(parent, parentID, name, prevComponent, tag);
|
||||
else if (FROM_BE_32(tag) == MKTAG('C','M','A','P'))
|
||||
return new ColormapComponent(parent, parentID, name, tag);
|
||||
else if (FROM_BE_32(tag) == MKTAG('K','E','Y','F'))
|
||||
return new KeyframeComponent(parent, parentID, name, tag);
|
||||
else if (FROM_BE_32(tag) == MKTAG('M','E','S','H'))
|
||||
return new MeshComponent(parent, parentID, name, tag);
|
||||
else if (FROM_BE_32(tag) == MKTAG('L','U','A','V'))
|
||||
return new LuaVarComponent(parent, parentID, name, tag);
|
||||
else if (FROM_BE_32(tag) == MKTAG('I','M','L','S'))
|
||||
return new SoundComponent(parent, parentID, name, tag);
|
||||
else if (FROM_BE_32(tag) == MKTAG('B','K','N','D'))
|
||||
return new BitmapComponent(parent, parentID, name, tag);
|
||||
else if (FROM_BE_32(tag) == MKTAG('M','A','T',' '))
|
||||
return new MaterialComponent(parent, parentID, name, tag);
|
||||
else if (FROM_BE_32(tag) == MKTAG('S','P','R','T'))
|
||||
return NULL;// new SpriteComponent(parent, parentID, name);
|
||||
|
||||
char t[4];
|
||||
memcpy(t, &tag, sizeof(tag32));
|
||||
warning("loadComponent: Unknown tag '%c%c%c%c', name '%s'", t[0], t[1], t[2], t[3], name);*/
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Model::HierNode *Costume::getModelNodes() {
|
||||
for (int i = 0; i < _numComponents; i++) {
|
||||
if (!_components[i])
|
||||
@ -1147,6 +1252,7 @@ void Costume::playChore(const char *name) {
|
||||
warning("Costume::playChore: Could not find chore: %s", name);
|
||||
return;
|
||||
}
|
||||
|
||||
void Costume::playChore(int num) {
|
||||
if (num < 0 || num >= _numChores) {
|
||||
if (gDebugLevel == DEBUG_CHORES || gDebugLevel == DEBUG_WARN || gDebugLevel == DEBUG_ALL)
|
||||
|
@ -26,6 +26,8 @@
|
||||
#ifndef GRIM_COSTUME_H
|
||||
#define GRIM_COSTUME_H
|
||||
|
||||
#include "common/memstream.h"
|
||||
|
||||
#include "engines/grim/model.h"
|
||||
#include "engines/grim/object.h"
|
||||
#include "engines/grim/colormap.h"
|
||||
@ -41,7 +43,8 @@ public:
|
||||
Costume(const char *filename, const char *data, int len, Costume *prevCost);
|
||||
Costume() : Object() { _chores = 0; }
|
||||
|
||||
void load(const char *filename, const char *data, int len, Costume *prevCost);
|
||||
void loadGRIM(TextSplitter &ts, Costume *prevCost);
|
||||
void loadEMI(Common::MemoryReadStream &ms, Costume *prevCost);
|
||||
|
||||
virtual ~Costume();
|
||||
|
||||
@ -113,7 +116,7 @@ public:
|
||||
|
||||
private:
|
||||
Component *loadComponent(tag32 tag, Component *parent, int parentID, const char *name, Component *prevComponent);
|
||||
|
||||
Component *loadComponentEMI(const char *name, int parentID);
|
||||
|
||||
Common::String _fname;
|
||||
Costume *_prevCostume;
|
||||
|
@ -40,7 +40,10 @@ Model::Model(const char *filename, const char *data, int len, CMap *cmap) :
|
||||
_fname = filename;
|
||||
_headNode = NULL;
|
||||
|
||||
if (len >= 4 && READ_BE_UINT32(data) == MKTAG('L','D','O','M'))
|
||||
if (g_grim->getGameType() == GType_MONKEY4) {
|
||||
Common::MemoryReadStream ms((const byte *)data, len);
|
||||
loadEMI(ms);
|
||||
} else if (len >= 4 && READ_BE_UINT32(data) == MKTAG('L','D','O','M'))
|
||||
loadBinary(data, cmap);
|
||||
else {
|
||||
TextSplitter ts(data, len);
|
||||
@ -62,6 +65,30 @@ void Model::reload(CMap *cmap) {
|
||||
delete[] materials;
|
||||
}
|
||||
|
||||
void Model::loadEMI(Common::MemoryReadStream &ms) {
|
||||
char name[64];
|
||||
|
||||
int nameLength = ms.readUint32LE();
|
||||
assert(nameLength < 64);
|
||||
|
||||
ms.read(name, nameLength);
|
||||
|
||||
_numMaterials = ms.readUint32LE();
|
||||
_materials = new MaterialPtr[_numMaterials];
|
||||
_materialNames = new char[_numMaterials][32];
|
||||
for (int i = 0; i < _numMaterials; i++) {
|
||||
nameLength = ms.readUint32LE();
|
||||
assert(nameLength < 32);
|
||||
|
||||
ms.read(_materialNames[i], nameLength);
|
||||
_materials[i] = g_resourceloader->getMaterial(_materialNames[i], 0);
|
||||
ms.seek(4, SEEK_CUR);
|
||||
}
|
||||
|
||||
ms.seek(4, SEEK_CUR);
|
||||
|
||||
|
||||
}
|
||||
void Model::loadBinary(const char *&data, CMap *cmap) {
|
||||
_numMaterials = READ_LE_UINT32(data + 4);
|
||||
data += 8;
|
||||
|
@ -26,6 +26,8 @@
|
||||
#ifndef GRIM_MODEL_H
|
||||
#define GRIM_MODEL_H
|
||||
|
||||
#include "common/memstream.h"
|
||||
|
||||
#include "engines/grim/resource.h"
|
||||
#include "engines/grim/object.h"
|
||||
#include "graphics/matrix4.h"
|
||||
@ -40,6 +42,7 @@ public:
|
||||
Model(const char *filename, const char *data, int len, CMap *cmap);
|
||||
void loadBinary(const char *&data, CMap *cmap);
|
||||
void loadText(TextSplitter *ts, CMap *cmap);
|
||||
void loadEMI(Common::MemoryReadStream &ms);
|
||||
void reload(CMap *cmap);
|
||||
void draw() const;
|
||||
|
||||
|
@ -245,9 +245,30 @@ CMap *ResourceLoader::loadColormap(const char *filename) {
|
||||
return result;
|
||||
}
|
||||
|
||||
Costume *ResourceLoader::loadCostume(const char *filename, Costume *prevCost) {
|
||||
Common::String fname = filename;
|
||||
static Common::String fixFilename(const char *filename) {
|
||||
Common::String fname;
|
||||
if (g_grim->getGameType() == GType_MONKEY4) {
|
||||
char str[128];
|
||||
int len = strlen(filename);
|
||||
for (int i = 0; i < len; i++) {
|
||||
str[i] = filename[i];
|
||||
// Fix paths
|
||||
if (str[i] == '\\')
|
||||
str[i] = '/';
|
||||
}
|
||||
// Append b to end of filename for EMI
|
||||
str[len] = 'b';
|
||||
str[len + 1] = '\0';
|
||||
fname = str;
|
||||
} else {
|
||||
fname = filename;
|
||||
}
|
||||
fname.toLowercase();
|
||||
return fname;
|
||||
}
|
||||
|
||||
Costume *ResourceLoader::loadCostume(const char *filename, Costume *prevCost) {
|
||||
Common::String fname = fixFilename(filename);
|
||||
Block *b = getFileFromCache(fname.c_str());
|
||||
if (!b) {
|
||||
b = getFileBlock(fname.c_str());
|
||||
@ -337,8 +358,7 @@ Material *ResourceLoader::loadMaterial(const char *filename, CMap *c) {
|
||||
}
|
||||
|
||||
Model *ResourceLoader::loadModel(const char *filename, CMap *c) {
|
||||
Common::String fname = filename;
|
||||
fname.toLowercase();
|
||||
Common::String fname = fixFilename(filename);
|
||||
Block *b = getFileFromCache(fname.c_str());
|
||||
if (!b) {
|
||||
b = getFileBlock(fname.c_str());
|
||||
|
Loading…
Reference in New Issue
Block a user