void Actor::draw() { for (Common::List<Costume *>::iterator i = _costumeStack.begin(); i != _costumeStack.end(); ++i) { Costume *c = *i; c->setupTextures(); } if (!g_driver->isHardwareAccelerated() && g_grim->getFlagRefreshShadowMask()) { for (int l = 0; l < MAX_SHADOWS; l++) { if (!_shadowArray[l].active) continue; g_driver->setShadow(&_shadowArray[l]); g_driver->drawShadowPlanes(); g_driver->setShadow(NULL); } } // FIXME: if isAttached(), factor in the joint & actor rotation as well. Math::Vector3d absPos = getWorldPos(); if (!_costumeStack.empty()) { g_grim->getCurrSet()->setupLights(absPos); Costume *costume = _costumeStack.back(); for (int l = 0; l < MAX_SHADOWS; l++) { if (!shouldDrawShadow(l)) continue; g_driver->setShadow(&_shadowArray[l]); g_driver->setShadowMode(); if (g_driver->isHardwareAccelerated()) g_driver->drawShadowPlanes(); g_driver->startActorDraw(absPos, _scale, _yaw, _pitch, _roll, _inOverworld, _alphaMode != AlphaOff ? _globalAlpha : 1.f); costume->draw(); g_driver->finishActorDraw(); g_driver->clearShadowMode(); g_driver->setShadow(NULL); } bool isShadowCostume = costume->getFilename().equals("fx/dumbshadow.cos"); if (!isShadowCostume || _shadowActive) { // normal draw actor g_driver->startActorDraw(absPos, _scale, _yaw, _pitch, _roll, _inOverworld, _alphaMode != AlphaOff ? _globalAlpha : 1.f); costume->draw(); g_driver->finishActorDraw(); } } if (_mustPlaceText) { int x1, y1, x2, y2; x1 = y1 = 1000; x2 = y2 = -1000; if (!_costumeStack.empty()) { g_driver->startActorDraw(absPos, _scale, _yaw, _pitch, _roll, _inOverworld, 1.f); _costumeStack.back()->getBoundingBox(&x1, &y1, &x2, &y2); g_driver->finishActorDraw(); } TextObject *textObject = TextObject::getPool().getObject(_sayLineText); if (textObject) { if (x1 == 1000 || x2 == -1000 || y2 == -1000) { textObject->setX(640 / 2); textObject->setY(463); } else { textObject->setX((x1 + x2) / 2); textObject->setY(y1); } textObject->reset(); } _mustPlaceText = false; } }