GRIM: Enhance the way that colors are given to lua.

This commit is contained in:
Joel Teichroeb 2012-01-27 11:47:28 -08:00
parent 1411e185e3
commit aa814e3334
17 changed files with 85 additions and 107 deletions

View File

@ -51,7 +51,7 @@ namespace Grim {
Actor::Actor(const Common::String &actorName) :
PoolObject<Actor, MKTAG('A', 'C', 'T', 'R')>(), _name(actorName), _setName(""),
_talkColor(PoolColor::getPool().getObject(2)), _pos(0, 0, 0),
_talkColor(255, 255, 255), _pos(0, 0, 0),
// Some actors don't set walk and turn rates, so we default the
// _turnRate so Doug at the cat races can turn and we set the
// _walkRate so Glottis at the demon beaver entrance can walk and
@ -121,11 +121,9 @@ void Actor::saveState(SaveGame *savedState) const {
savedState->writeString(_name);
savedState->writeString(_setName);
if (_talkColor) {
savedState->writeLEUint32(_talkColor->getId());
} else {
savedState->writeLEUint32(0);
}
//SAVECHANGE: Remove the next line
savedState->writeByte(0);
savedState->writeColor(_talkColor);
savedState->writeVector3d(_pos);
@ -242,7 +240,9 @@ bool Actor::restoreState(SaveGame *savedState) {
_name = savedState->readString();
_setName = savedState->readString();
_talkColor = PoolColor::getPool().getObject(savedState->readLEUint32());
//SAVECHANGE: Remove the next line
savedState->readByte();
_talkColor = savedState->readColor();
_pos = savedState->readVector3d();
_pitch = savedState->readFloat();

View File

@ -25,6 +25,7 @@
#include "engines/grim/pool.h"
#include "engines/grim/object.h"
#include "engines/grim/color.h"
#include "math/vector3d.h"
#include "math/angle.h"
@ -35,7 +36,6 @@ class Sector;
class Costume;
class LipSync;
class Font;
class PoolColor;
class Set;
struct Plane {
@ -110,13 +110,13 @@ public:
* @param color The color.
* @see getTalkColor
*/
void setTalkColor(PoolColor *color) { _talkColor = color; }
void setTalkColor(const Color &color) { _talkColor = color; }
/**
* Returns the color of the subtitles of the actor.
*
* @see setTalkColor
*/
PoolColor *getTalkColor() const { return _talkColor; }
Color getTalkColor() const { return _talkColor; }
/**
* Sets the position of the actor on the 3D scene.
@ -475,7 +475,7 @@ private:
Common::String _name;
Common::String _setName; // The actual current set
PoolColor *_talkColor;
Color _talkColor;
Math::Vector3d _pos;
Math::Angle _pitch, _yaw, _roll;
float _walkRate, _turnRate;

View File

@ -41,6 +41,18 @@ Color::Color(const Color& c) {
_vals[2] = c._vals[2];
}
Color::Color(uint32 c) {
_vals[0] = (c >> 16) & 0xFF;
_vals[1] = (c >> 8) & 0xFF;
_vals[2] = c & 0xFF;
}
uint32 Color::toEncodedValue() {
return (_vals[0] << 16) |
(_vals[1] << 8 ) |
_vals[2];
}
Color& Color::operator =(const Color &c) {
_vals[0] = c._vals[0];
_vals[1] = c._vals[1];
@ -55,29 +67,5 @@ Color& Color::operator =(Color *c) {
return *this;
}
PoolColor::PoolColor() :
PoolObject<PoolColor, MKTAG('C', 'O', 'L', 'R')>(), Color() {
}
PoolColor::PoolColor(byte r, byte g, byte b) :
PoolObject<PoolColor, MKTAG('C', 'O', 'L', 'R')>(), Color(r, g, b) {
}
void PoolColor::restoreState(SaveGame *state) {
getRed() = state->readByte();
getGreen() = state->readByte();
getBlue() = state->readByte();
}
void PoolColor::saveState(SaveGame *state) const {
state->writeByte(getRed());
state->writeByte(getGreen());
state->writeByte(getBlue());
}
} // end of namespace Grim

View File

@ -34,6 +34,7 @@ public:
Color();
Color(byte r, byte g, byte b);
Color(const Color& c);
Color(uint32 c);
byte &getRed() { return _vals[0]; }
byte getRed() const { return _vals[0]; }
@ -42,18 +43,12 @@ public:
byte &getBlue() { return _vals[2]; }
byte getBlue() const { return _vals[2]; }
uint32 toEncodedValue();
Color& operator =(const Color &c);
Color& operator =(Color *c);
};
class PoolColor : public PoolObject<PoolColor, MKTAG('C', 'O', 'L', 'R')>, public Color {
public:
PoolColor();
PoolColor(byte r, byte g, byte b);
void restoreState(SaveGame *state);
void saveState(SaveGame *state) const;
};
} // end of namespace Grim

View File

@ -929,10 +929,10 @@ void GfxOpenGL::drawTextObject(TextObject *text) {
glEnable(GL_TEXTURE_2D);
glDepthMask(GL_FALSE);
const Color *color = text->getFGColor();
const Color &color = text->getFGColor();
Font *font = text->getFont();
glColor3f(color->getRed() / 255.f, color->getGreen() / 255.f, color->getBlue() / 255.f);
glColor3f(color.getRed() / 255.f, color.getGreen() / 255.f, color.getBlue() / 255.f);
FontUserData *userData = (FontUserData *)font->getUserData();
if (!userData)
error("Could not get font userdata");
@ -1362,7 +1362,7 @@ void GfxOpenGL::drawRectangle(PrimitiveObject *primitive) {
float x2 = (primitive->getP2().x+1) * _scaleW;
float y2 = (primitive->getP2().y+1) * _scaleH;
const Color &color = *primitive->getColor();
const Color color(primitive->getColor());
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
@ -1401,7 +1401,7 @@ void GfxOpenGL::drawLine(PrimitiveObject *primitive) {
float x2 = primitive->getP2().x * _scaleW;
float y2 = primitive->getP2().y * _scaleH;
const Color &color = *primitive->getColor();
const Color &color = primitive->getColor();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
@ -1439,7 +1439,7 @@ void GfxOpenGL::drawPolygon(PrimitiveObject *primitive) {
float x4 = primitive->getP4().x * _scaleW;
float y4 = primitive->getP4().y * _scaleH;
const Color &color = *primitive->getColor();
const Color &color = primitive->getColor();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

View File

@ -834,7 +834,7 @@ void GfxTinyGL::createTextObject(TextObject *text) {
int numLines = text->getNumLines();
const Common::String *lines = text->getLines();
const Font *font = text->getFont();
const Color *fgColor = text->getFGColor();
const Color &fgColor = text->getFGColor();
TextObjectData *userData = new TextObjectData[numLines];
text->setUserData(userData);
for (int j = 0; j < numLines; j++) {
@ -871,9 +871,9 @@ void GfxTinyGL::createTextObject(TextObject *text) {
Graphics::PixelBuffer buf(_pixelFormat, width * height, DisposeAfterUse::NO);
uint8 *bitmapData = _textBitmap;
uint8 r = fgColor->getRed();
uint8 g = fgColor->getGreen();
uint8 b = fgColor->getBlue();
uint8 r = fgColor.getRed();
uint8 g = fgColor.getGreen();
uint8 b = fgColor.getBlue();
uint32 color = _zb->cmode.RGBToColor(r, g, b);
if (color == 0xf81f)
@ -1112,7 +1112,7 @@ void GfxTinyGL::drawRectangle(PrimitiveObject *primitive) {
int x2 = primitive->getP2().x;
int y2 = primitive->getP2().y;
const Color &color = *primitive->getColor();
const Color &color = primitive->getColor();
uint32 c = _pixelFormat.RGBToColor(color.getRed(), color.getGreen(), color.getBlue());
if (primitive->isFilled()) {
@ -1147,7 +1147,7 @@ void GfxTinyGL::drawLine(PrimitiveObject *primitive) {
int x2 = primitive->getP2().x;
int y2 = primitive->getP2().y;
const Color &color = *primitive->getColor();
const Color &color = primitive->getColor();
if (x2 == x1) {
for (int y = y1; y <= y2; y++) {
@ -1177,7 +1177,7 @@ void GfxTinyGL::drawPolygon(PrimitiveObject *primitive) {
float m;
int b;
const Color &color = *primitive->getColor();
const Color &color = primitive->getColor();
uint32 c = _pixelFormat.RGBToColor(color.getRed(), color.getGreen(), color.getBlue());
m = (y2 - y1) / (x2 - x1);

View File

@ -139,8 +139,7 @@ GrimEngine::GrimEngine(OSystem *syst, uint32 gameFlags, GrimGameType gameType, C
_fps[0] = 0;
_iris = new Iris();
PoolColor *c = new PoolColor(0, 0, 0);
new PoolColor(255, 255, 255); // Default color for actors. Id == 2
Color c(0, 0, 0);
_printLineDefaults.setX(0);
_printLineDefaults.setY(100);
@ -208,7 +207,6 @@ void GrimEngine::clearPools() {
Bitmap::getPool().deleteObjects();
Font::getPool().deleteObjects();
ObjectState::getPool().deleteObjects();
PoolColor::getPool().deleteObjects();
_currSet = NULL;
}
@ -764,9 +762,6 @@ void GrimEngine::savegameRestore() {
delete _currSet;
_currSet = NULL;
PoolColor::getPool().restoreObjects(_savedState);
Debug::debug(Debug::Engine, "Colors restored succesfully.");
Bitmap::getPool().restoreObjects(_savedState);
Debug::debug(Debug::Engine, "Bitmaps restored succesfully.");
@ -831,9 +826,11 @@ void GrimEngine::restoreGRIM() {
_talkingActor = Actor::getPool().getObject(_savedState->readLEUint32());
//TextObject stuff
//SAVECHANGE: Remove the next line with the next save version
//SAVECHANGE: Remove the next two lines with the next save version
_savedState->readLESint32();
_sayLineDefaults.setFGColor(PoolColor::getPool().getObject(_savedState->readLEUint32()));
_savedState->readByte();
_sayLineDefaults.setFGColor(_savedState->readColor());
_sayLineDefaults.setFont(Font::getPool().getObject(_savedState->readLEUint32()));
_sayLineDefaults.setHeight(_savedState->readLESint32());
_sayLineDefaults.setJustify(_savedState->readLESint32());
@ -899,9 +896,6 @@ void GrimEngine::savegameSave() {
savegameCallback();
PoolColor::getPool().saveObjects(_savedState);
Debug::debug(Debug::Engine, "Colors saved succesfully.");
Bitmap::getPool().saveObjects(_savedState);
Debug::debug(Debug::Engine, "Bitmaps saved succesfully.");
@ -969,9 +963,11 @@ void GrimEngine::saveGRIM() {
}
//TextObject stuff
//SAVECHANGE: Remove the next line with the next save version
//SAVECHANGE: Remove the next two lines with the next save version
_savedState->writeLESint32(0);
_savedState->writeLEUint32(_sayLineDefaults.getFGColor()->getId());
_savedState->writeByte(0);
_savedState->writeColor(_sayLineDefaults.getFGColor());
_savedState->writeLEUint32(_sayLineDefaults.getFont()->getId());
_savedState->writeLESint32(_sayLineDefaults.getHeight());
_savedState->writeLESint32(_sayLineDefaults.getJustify());

View File

@ -370,8 +370,8 @@ Font *LuaBase::getfont(lua_Object obj) {
return Font::getPool().getObject(lua_getuserdata(obj));
}
PoolColor *LuaBase::getcolor(lua_Object obj) {
return PoolColor::getPool().getObject(lua_getuserdata(obj));
Color LuaBase::getcolor(lua_Object obj) {
return Color(lua_getuserdata(obj));
}
PrimitiveObject *LuaBase::getprimitive(lua_Object obj) {

View File

@ -26,13 +26,14 @@
#include "common/str.h"
#include "common/list.h"
#include "engines/grim/color.h"
namespace Grim {
typedef uint32 lua_Object; // from lua/lua.h
class Actor;
class Bitmap;
class PoolColor;
class Costume;
class Font;
class ObjectState;
@ -145,7 +146,7 @@ protected:
Bitmap *getbitmap(lua_Object obj);
TextObject *gettextobject(lua_Object obj);
Font *getfont(lua_Object obj);
PoolColor *getcolor(lua_Object obj);
Color getcolor(lua_Object obj);
PrimitiveObject *getprimitive(lua_Object obj);
ObjectState *getobjectstate(lua_Object obj);

View File

@ -166,8 +166,8 @@ void callHook(lua_Function func, const char *filename, int32 line) {
Actor *a = Actor::getPool().getObject(lua_getuserdata(lua_getparam(i)));
fprintf(output, "<actor \"%s\">", a->getName().c_str());
} else if (lua_tag(lua_getparam(i)) == MKTAG('C','O','L','R')) {
Color *c = PoolColor::getPool().getObject(lua_getuserdata(lua_getparam(i)));
fprintf(output, "<color #%02x%02x%02x>", c->getRed(), c->getGreen(), c->getBlue());
Color c(lua_getuserdata(lua_getparam(i)));
fprintf(output, "<color #%02x%02x%02x>", c.getRed(), c.getGreen(), c.getBlue());
} else
fprintf(output, "<userdata %d>", lua_getuserdata(lua_getparam(i)));
} else if (lua_isfunction(lua_getparam(i))) {

View File

@ -196,16 +196,16 @@ void Lua_V1::MakeColor() {
else
b = clamp_color((int)lua_getnumber(bObj));
PoolColor *c = new PoolColor (r, g ,b);
lua_pushusertag(c->getId(), MKTAG('C','O','L','R'));
Color c(r, g, b);
lua_pushusertag(c.toEncodedValue(), MKTAG('C','O','L','R'));
}
void Lua_V1::GetColorComponents() {
lua_Object colorObj = lua_getparam(1);
Color *c = getcolor(colorObj);
lua_pushnumber(c->getRed());
lua_pushnumber(c->getGreen());
lua_pushnumber(c->getBlue());
Color c(getcolor(colorObj));
lua_pushnumber(c.getRed());
lua_pushnumber(c.getGreen());
lua_pushnumber(c.getBlue());
}
void Lua_V1::ReadRegistryValue() {

View File

@ -81,8 +81,7 @@ void Lua_V1::SetActorTalkColor() {
if (!lua_isuserdata(colorObj) && lua_tag(colorObj) != MKTAG('C','O','L','R'))
return;
Actor *actor = getactor(actorObj);
PoolColor *color = getcolor(colorObj);
actor->setTalkColor(color);
actor->setTalkColor(getcolor(colorObj));
}
void Lua_V1::GetActorTalkColor() {
@ -92,7 +91,7 @@ void Lua_V1::GetActorTalkColor() {
return;
}
Actor *actor = getactor(actorObj);
lua_pushusertag(actor->getTalkColor()->getId(), MKTAG('C','O','L','R'));
lua_pushusertag(actor->getTalkColor().toEncodedValue(), MKTAG('C','O','L','R'));
}
void Lua_V1::SetActorRestChore() {

View File

@ -163,7 +163,7 @@ void Lua_V1::PurgePrimitiveQueue() {
void Lua_V1::DrawPolygon() {
lua_Object pointObj;
Common::Point p1, p2, p3, p4;
PoolColor *color = NULL;
Color color;
lua_Object tableObj1 = lua_getparam(1);
if (!lua_istable(tableObj1)) {
@ -229,7 +229,7 @@ void Lua_V1::DrawPolygon() {
void Lua_V1::DrawLine() {
Common::Point p1, p2;
PoolColor *color = NULL;;
Color color;
lua_Object x1Obj = lua_getparam(1);
lua_Object y1Obj = lua_getparam(2);
lua_Object x2Obj = lua_getparam(3);
@ -268,7 +268,7 @@ void Lua_V1::DrawLine() {
void Lua_V1::ChangePrimitive() {
PrimitiveObject *psearch, *pmodify = NULL;
PoolColor *color = NULL;
Color color;
lua_Object param1 = lua_getparam(1);
if (!lua_isuserdata(param1) || lua_tag(param1) != MKTAG('P','R','I','M'))
@ -375,7 +375,7 @@ void Lua_V1::ChangePrimitive() {
void Lua_V1::DrawRectangle() {
Common::Point p1, p2;
PoolColor *color = NULL;
Color color;
lua_Object objX1 = lua_getparam(1);
lua_Object objY1 = lua_getparam(2);
lua_Object objX2 = lua_getparam(3);
@ -414,7 +414,7 @@ void Lua_V1::DrawRectangle() {
void Lua_V1::BlastRect() {
Common::Point p1, p2;
PoolColor *color = NULL;
Color color;
lua_Object objX1 = lua_getparam(1);
lua_Object objY1 = lua_getparam(2);
lua_Object objX2 = lua_getparam(3);

View File

@ -35,7 +35,6 @@ PrimitiveObject::PrimitiveObject() :
_filled = false;
_type = 0;
_bitmap = NULL;
_color = NULL;
}
PrimitiveObject::~PrimitiveObject() {
@ -46,7 +45,7 @@ PrimitiveObject::~PrimitiveObject() {
void PrimitiveObject::saveState(SaveGame *savedState) const {
savedState->writeLESint32(_type);
savedState->writeLEUint32(_color->getId());
savedState->writeColor(_color);
savedState->writeLEUint32(_filled);
@ -69,7 +68,7 @@ void PrimitiveObject::saveState(SaveGame *savedState) const {
bool PrimitiveObject::restoreState(SaveGame *savedState) {
_type = savedState->readLESint32();
_color = PoolColor::getPool().getObject(savedState->readLEUint32());
_color = savedState->readLEUint32();
_filled = savedState->readLEUint32();
@ -87,7 +86,7 @@ bool PrimitiveObject::restoreState(SaveGame *savedState) {
return true;
}
void PrimitiveObject::createRectangle(Common::Point p1, Common::Point p2, PoolColor *color, bool filled) {
void PrimitiveObject::createRectangle(Common::Point p1, Common::Point p2, const Color &color, bool filled) {
_type = RECTANGLE;
_p1 = p1;
_p2 = p2;
@ -103,14 +102,14 @@ void PrimitiveObject::createBitmap(Bitmap *bitmap, Common::Point p, bool /*trans
// transparent: what to do ?
}
void PrimitiveObject::createLine(Common::Point p1, Common::Point p2, PoolColor *color) {
void PrimitiveObject::createLine(Common::Point p1, Common::Point p2, const Color &color) {
_type = LINE;
_p1 = p1;
_p2 = p2;
_color = color;
}
void PrimitiveObject::createPolygon(Common::Point p1, Common::Point p2, Common::Point p3, Common::Point p4, PoolColor *color) {
void PrimitiveObject::createPolygon(Common::Point p1, Common::Point p2, Common::Point p3, Common::Point p4, const Color &color) {
_type = POLYGON;
_p1 = p1;
_p2 = p2;

View File

@ -27,11 +27,11 @@
#include "engines/grim/pool.h"
#include "engines/grim/bitmap.h"
#include "engines/grim/color.h"
namespace Grim {
class SaveGame;
class PoolColor;
class PrimitiveObject : public PoolObject<PrimitiveObject, MKTAG('P', 'R', 'I', 'M')> {
public:
@ -45,17 +45,17 @@ public:
POLYGON
} PrimType;
void createRectangle(Common::Point p1, Common::Point p2, PoolColor *color, bool filled);
void createRectangle(Common::Point p1, Common::Point p2, const Color &color, bool filled);
void createBitmap(Bitmap *bitmap, Common::Point p, bool transparent);
void createLine(Common::Point p1, Common::Point p2, PoolColor *color);
void createPolygon(Common::Point p1, Common::Point p2, Common::Point p3, Common::Point p4, PoolColor *color);
void createLine(Common::Point p1, Common::Point p2, const Color &color);
void createPolygon(Common::Point p1, Common::Point p2, Common::Point p3, Common::Point p4, const Color &color);
Common::Point getP1() { return _p1; }
Common::Point getP2() { return _p2; }
Common::Point getP3() { return _p3; }
Common::Point getP4() { return _p4; }
void setPos(int x, int y);
void setColor(PoolColor *color) { _color = color; }
PoolColor *getColor() { return _color; }
void setColor(const Color &color) { _color = color; }
Color getColor() { return _color; }
bool isFilled() { return _filled; }
void draw();
bool isBitmap() { return _type == BITMAP; }
@ -65,7 +65,7 @@ public:
private:
Common::Point _p1, _p2, _p3, _p4;
PoolColor *_color;
Color _color;
bool _filled;
int _type;
Bitmap::Ptr _bitmap;

View File

@ -68,7 +68,7 @@ void TextObject::reset() {
}
void TextObject::saveState(SaveGame *state) const {
state->writeLEUint32(_fgColor->getId());
state->writeColor(_fgColor);
state->writeLESint32(_x);
state->writeLESint32(_y);
@ -90,7 +90,7 @@ void TextObject::saveState(SaveGame *state) const {
}
bool TextObject::restoreState(SaveGame *state) {
_fgColor = PoolColor::getPool().getObject(state->readLEUint32());
_fgColor = state->readLEUint32();
_x = state->readLESint32();
_y = state->readLESint32();

View File

@ -24,12 +24,12 @@
#define GRIM_TEXTOBJECT_H
#include "engines/grim/pool.h"
#include "engines/grim/color.h"
namespace Grim {
class SaveGame;
class Font;
class PoolColor;
class TextObjectCommon {
public:
@ -42,8 +42,8 @@ public:
void setFont(Font *font) { _font = font; }
Font *getFont() { return _font; }
void setFGColor(PoolColor *fgColor) { _fgColor = fgColor; }
PoolColor *getFGColor() { return _fgColor; }
void setFGColor(const Color &fgColor) { _fgColor = fgColor; }
Color getFGColor() { return _fgColor; }
void setJustify(int justify) { _justify = justify; }
int getJustify() { return _justify; }
@ -60,7 +60,7 @@ public:
protected:
TextObjectCommon();
PoolColor *_fgColor;
Color _fgColor;
int _x, _y;
int _width, _height;
int _justify;