mirror of
https://github.com/AquariaOSE/Aquaria.git
synced 2025-07-04 15:04:36 +00:00
Merge branch 'experimental' of file:///Users/User/code/coding/Aquaria_fg_clean into HEAD
This commit is contained in:
commit
e8fe18c2b4
47 changed files with 961 additions and 473 deletions
|
@ -120,6 +120,12 @@ const float NOTE_ACCEPT_ANGLE_OFFSET = 15;
|
||||||
const int COLLIDE_RADIUS_NORMAL = 10;
|
const int COLLIDE_RADIUS_NORMAL = 10;
|
||||||
const int COLLIDE_RADIUS_FISH = 8;
|
const int COLLIDE_RADIUS_FISH = 8;
|
||||||
|
|
||||||
|
const int COLLIDE_RANGE_NORMAL = 2;
|
||||||
|
const int COLLIDE_RANGE_FISH = 1;
|
||||||
|
|
||||||
|
const float COLLIDE_MOD_NORMAL = 1.0f;
|
||||||
|
const float COLLIDE_MOD_FISH = 0.1f;
|
||||||
|
|
||||||
const int requiredDualFormCharge = 3;
|
const int requiredDualFormCharge = 3;
|
||||||
|
|
||||||
bool usingDigital = false;
|
bool usingDigital = false;
|
||||||
|
@ -744,7 +750,7 @@ void Avatar::toggleMovement(bool on)
|
||||||
|
|
||||||
bool Avatar::isLockable()
|
bool Avatar::isLockable()
|
||||||
{
|
{
|
||||||
return (bursting || !_isUnderWater) && (boneLockDelay == 0) && (dsq->continuity.form != FORM_FISH);
|
return (bursting || !_isUnderWater) && (boneLockDelay == 0) && canLockToWall();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Avatar::isSinging()
|
bool Avatar::isSinging()
|
||||||
|
@ -752,11 +758,6 @@ bool Avatar::isSinging()
|
||||||
return singing;
|
return singing;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Avatar::shift()
|
|
||||||
{
|
|
||||||
dsq->continuity.shiftWorlds();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Avatar::applyWorldEffects(WorldType type)
|
void Avatar::applyWorldEffects(WorldType type)
|
||||||
{
|
{
|
||||||
static bool oldfh=false;
|
static bool oldfh=false;
|
||||||
|
@ -1595,6 +1596,8 @@ void Avatar::changeForm(FormType form, bool effects, bool onInit, FormType lastF
|
||||||
//rotationOffset.interpolateTo(Vector(0,0,0), 0.5);
|
//rotationOffset.interpolateTo(Vector(0,0,0), 0.5);
|
||||||
|
|
||||||
collideRadius = COLLIDE_RADIUS_NORMAL;
|
collideRadius = COLLIDE_RADIUS_NORMAL;
|
||||||
|
setCanLockToWall(true);
|
||||||
|
setCollisionAvoidanceData(COLLIDE_RANGE_NORMAL, COLLIDE_MOD_NORMAL);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case FORM_SUN:
|
case FORM_SUN:
|
||||||
|
@ -1606,9 +1609,13 @@ void Avatar::changeForm(FormType form, bool effects, bool onInit, FormType lastF
|
||||||
position = bodyPosition;
|
position = bodyPosition;
|
||||||
dsq->continuity.warpLiToAvatar();
|
dsq->continuity.warpLiToAvatar();
|
||||||
spiritBeaconEmitter.start();
|
spiritBeaconEmitter.start();
|
||||||
|
setCanActivateStuff(true);
|
||||||
|
setCanLockToWall(true);
|
||||||
|
setCanBurst(true);
|
||||||
|
setDamageTarget(DT_WALLHURT, true);
|
||||||
break;
|
break;
|
||||||
case FORM_BEAST:
|
case FORM_BEAST:
|
||||||
//dsq->game->sceneColor3.interpolateTo(Vector(1, 1, 1), 0.5);
|
setCanSwimAgainstCurrents(false);
|
||||||
break;
|
break;
|
||||||
case FORM_DUAL:
|
case FORM_DUAL:
|
||||||
if (dsq->continuity.hasLi())
|
if (dsq->continuity.hasLi())
|
||||||
|
@ -1618,6 +1625,9 @@ void Avatar::changeForm(FormType form, bool effects, bool onInit, FormType lastF
|
||||||
dsq->game->li->setState(STATE_IDLE);
|
dsq->game->li->setState(STATE_IDLE);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case FORM_NATURE:
|
||||||
|
setDamageTarget(DT_WALLHURT, true);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
if (leftHandEmitter && rightHandEmitter)
|
if (leftHandEmitter && rightHandEmitter)
|
||||||
{
|
{
|
||||||
|
@ -1727,6 +1737,8 @@ void Avatar::changeForm(FormType form, bool effects, bool onInit, FormType lastF
|
||||||
//refreshModel("NaijaFish", "");
|
//refreshModel("NaijaFish", "");
|
||||||
|
|
||||||
collideRadius = COLLIDE_RADIUS_FISH;
|
collideRadius = COLLIDE_RADIUS_FISH;
|
||||||
|
setCanLockToWall(false);
|
||||||
|
setCollisionAvoidanceData(COLLIDE_RANGE_FISH, COLLIDE_MOD_FISH);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case FORM_SUN:
|
case FORM_SUN:
|
||||||
|
@ -1758,42 +1770,13 @@ void Avatar::changeForm(FormType form, bool effects, bool onInit, FormType lastF
|
||||||
hair->setTexture("Naija/Cape-NatureForm");
|
hair->setTexture("Naija/Cape-NatureForm");
|
||||||
hair->alphaMod = 1.0;
|
hair->alphaMod = 1.0;
|
||||||
}
|
}
|
||||||
/*
|
setDamageTarget(DT_WALLHURT, false);
|
||||||
skeletalSprite.loadSkin("ChildTeira");
|
|
||||||
refreshModel();
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
if (dsq->game->sceneNatureForm == "forest")
|
|
||||||
{
|
|
||||||
debugLog("Forest Form");
|
|
||||||
dsq->continuity.form = FORM_NATURE_FOREST;
|
|
||||||
}
|
|
||||||
else if (dsq->game->sceneNatureForm == "sun")
|
|
||||||
{
|
|
||||||
dsq->continuity.form = FORM_NATURE_SUN;
|
|
||||||
debugLog("Sun Form");
|
|
||||||
}
|
|
||||||
else if (dsq->game->sceneNatureForm == "fire")
|
|
||||||
{
|
|
||||||
dsq->continuity.form = FORM_NATURE_FIRE;
|
|
||||||
debugLog("Fire Form");
|
|
||||||
}
|
|
||||||
else if (dsq->game->sceneNatureForm == "dark")
|
|
||||||
{
|
|
||||||
dsq->continuity.form = FORM_NATURE_DARK;
|
|
||||||
debugLog("Dark Form");
|
|
||||||
}
|
|
||||||
else if (dsq->game->sceneNatureForm == "rock" || dsq->game->sceneNatureForm.empty())
|
|
||||||
{
|
|
||||||
dsq->continuity.form = FORM_NATURE_ROCK;
|
|
||||||
debugLog("Rock Form");
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case FORM_BEAST:
|
case FORM_BEAST:
|
||||||
{
|
{
|
||||||
refreshModel("Naija", "BeastForm");
|
refreshModel("Naija", "BeastForm");
|
||||||
|
setCanSwimAgainstCurrents(true);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case FORM_SPIRIT:
|
case FORM_SPIRIT:
|
||||||
|
@ -1801,6 +1784,10 @@ void Avatar::changeForm(FormType form, bool effects, bool onInit, FormType lastF
|
||||||
bodyOffset = offset;
|
bodyOffset = offset;
|
||||||
fallOffWall();
|
fallOffWall();
|
||||||
dsq->continuity.shiftWorlds();
|
dsq->continuity.shiftWorlds();
|
||||||
|
setCanActivateStuff(false);
|
||||||
|
setCanLockToWall(false);
|
||||||
|
setCanBurst(false);
|
||||||
|
setDamageTarget(DT_WALLHURT, false);
|
||||||
|
|
||||||
if (onInit)
|
if (onInit)
|
||||||
{
|
{
|
||||||
|
@ -3495,8 +3482,8 @@ void Avatar::lockToWallCommon()
|
||||||
void Avatar::lockToWall()
|
void Avatar::lockToWall()
|
||||||
{
|
{
|
||||||
if (riding) return;
|
if (riding) return;
|
||||||
if (inCurrent && dsq->continuity.form != FORM_BEAST) return;
|
if (inCurrent && !canSwimAgainstCurrents()) return;
|
||||||
if (dsq->continuity.form == FORM_FISH || dsq->continuity.form == FORM_SPIRIT) return;
|
if (!canLockToWall()) return;
|
||||||
if (state.lockedToWall) return;
|
if (state.lockedToWall) return;
|
||||||
if (vel.x == 0 && vel.y == 0) return;
|
if (vel.x == 0 && vel.y == 0) return;
|
||||||
if (dsq->game->isPaused()) return;
|
if (dsq->game->isPaused()) return;
|
||||||
|
@ -3594,7 +3581,7 @@ void Avatar::lockToWall()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dsq->game->getGrid(t)==OT_HURT && dsq->continuity.form != FORM_NATURE)
|
if (dsq->game->getGrid(t)==OT_HURT && isDamageTarget(DT_WALLHURT))
|
||||||
{
|
{
|
||||||
good = false;
|
good = false;
|
||||||
}
|
}
|
||||||
|
@ -4128,6 +4115,18 @@ Avatar::Avatar() : Entity(), ActionMapper()
|
||||||
collideRadius = COLLIDE_RADIUS_FISH;
|
collideRadius = COLLIDE_RADIUS_FISH;
|
||||||
else
|
else
|
||||||
collideRadius = COLLIDE_RADIUS_NORMAL;
|
collideRadius = COLLIDE_RADIUS_NORMAL;
|
||||||
|
|
||||||
|
// defaults for normal form
|
||||||
|
_canActivateStuff = true;
|
||||||
|
_canBurst = true;
|
||||||
|
_canLockToWall = true;
|
||||||
|
_canSwimAgainstCurrents = false;
|
||||||
|
_canCollideWithShots = true;
|
||||||
|
|
||||||
|
_collisionAvoidMod = COLLIDE_MOD_NORMAL;
|
||||||
|
_collisionAvoidRange = COLLIDE_RANGE_NORMAL;
|
||||||
|
|
||||||
|
_seeMapMode = SEE_MAP_DEFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Avatar::revert()
|
void Avatar::revert()
|
||||||
|
@ -4324,7 +4323,7 @@ void Avatar::startBurstCommon()
|
||||||
|
|
||||||
void Avatar::startBurst()
|
void Avatar::startBurst()
|
||||||
{
|
{
|
||||||
if (!riding && dsq->continuity.form != FORM_SPIRIT && (joystickMove || getVectorToCursor().getSquaredLength2D() > sqr(BURST_DISTANCE))
|
if (!riding && canBurst() && (joystickMove || getVectorToCursor().getSquaredLength2D() > sqr(BURST_DISTANCE))
|
||||||
&& getState() != STATE_PUSH && (!skeletalSprite.getCurrentAnimation() || (skeletalSprite.getCurrentAnimation()->name != "spin"))
|
&& getState() != STATE_PUSH && (!skeletalSprite.getCurrentAnimation() || (skeletalSprite.getCurrentAnimation()->name != "spin"))
|
||||||
&& _isUnderWater && !isActing(ACTION_ROLL))
|
&& _isUnderWater && !isActing(ACTION_ROLL))
|
||||||
{
|
{
|
||||||
|
@ -4686,6 +4685,35 @@ void Avatar::action(int id, int state)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Avatar::doBindSong()
|
||||||
|
{
|
||||||
|
if (pullTarget)
|
||||||
|
{
|
||||||
|
pullTarget->stopPull();
|
||||||
|
pullTarget = 0;
|
||||||
|
core->sound->playSfx("Denied");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dsq->game->bindIngredients();
|
||||||
|
setNearestPullTarget();
|
||||||
|
if (!pullTarget)
|
||||||
|
{
|
||||||
|
core->sound->playSfx("Denied");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
core->sound->playSfx("Bind");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Avatar::doShieldSong()
|
||||||
|
{
|
||||||
|
core->sound->playSfx("Shield-On");
|
||||||
|
activateAura(AURA_SHIELD);
|
||||||
|
}
|
||||||
|
|
||||||
void Avatar::render()
|
void Avatar::render()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -4858,10 +4886,6 @@ void Avatar::clampVelocity()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (!inCurrent || (inCurrent && withCurrent))
|
if (!inCurrent || (inCurrent && withCurrent))
|
||||||
{
|
{
|
||||||
if (dsq->continuity.form == FORM_FISH)
|
if (dsq->continuity.form == FORM_FISH)
|
||||||
|
@ -5246,7 +5270,7 @@ void Avatar::updateWallJump(float dt)
|
||||||
|
|
||||||
void Avatar::updateRoll(float dt)
|
void Avatar::updateRoll(float dt)
|
||||||
{
|
{
|
||||||
if (!inputEnabled || dsq->continuity.getWorldType() == WT_SPIRIT)
|
if (!inputEnabled || dsq->game->isWorldPaused())
|
||||||
{
|
{
|
||||||
if (rolling)
|
if (rolling)
|
||||||
stopRoll();
|
stopRoll();
|
||||||
|
@ -5385,7 +5409,18 @@ void Avatar::setWasUnderWater()
|
||||||
|
|
||||||
bool Avatar::canActivateStuff()
|
bool Avatar::canActivateStuff()
|
||||||
{
|
{
|
||||||
return dsq->continuity.form != FORM_SPIRIT;
|
return _canActivateStuff;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Avatar::setCanActivateStuff(bool on)
|
||||||
|
{
|
||||||
|
_canActivateStuff = on;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Avatar::setCollisionAvoidanceData(int range, float mod)
|
||||||
|
{
|
||||||
|
_collisionAvoidRange = range;
|
||||||
|
_collisionAvoidMod = mod;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Avatar::canQuickSong()
|
bool Avatar::canQuickSong()
|
||||||
|
@ -6176,7 +6211,7 @@ void Avatar::onUpdate(float dt)
|
||||||
|
|
||||||
//if (core->getNestedMains() == 1)
|
//if (core->getNestedMains() == 1)
|
||||||
{
|
{
|
||||||
if (getState() != STATE_TRANSFORM && dsq->continuity.getWorldType() == WT_NORMAL)
|
if (getState() != STATE_TRANSFORM && !dsq->game->isWorldPaused())
|
||||||
{
|
{
|
||||||
formAbilityUpdate(dt);
|
formAbilityUpdate(dt);
|
||||||
}
|
}
|
||||||
|
@ -6410,7 +6445,7 @@ void Avatar::onUpdate(float dt)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!state.lockedToWall && _isUnderWater && dsq->continuity.getWorldType() == WT_NORMAL && canMove)
|
if (!state.lockedToWall && _isUnderWater && !dsq->game->isWorldPaused() && canMove)
|
||||||
{
|
{
|
||||||
if (bursting)
|
if (bursting)
|
||||||
{
|
{
|
||||||
|
@ -7054,13 +7089,9 @@ void Avatar::onUpdate(float dt)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!state.lockedToWall && !bursting && _isUnderWater && swimming && !isFollowingPath())
|
if (!state.lockedToWall && !bursting && _isUnderWater && swimming && !isFollowingPath() && _collisionAvoidRange > 0)
|
||||||
{
|
{
|
||||||
//debugLog("collision avoidance");
|
doCollisionAvoidance(dt, _collisionAvoidRange, _collisionAvoidMod, 0, 800, OT_HURT);
|
||||||
if (dsq->continuity.form == FORM_FISH)
|
|
||||||
doCollisionAvoidance(dt, 1, 0.1, 0, 800, OT_HURT);
|
|
||||||
else
|
|
||||||
doCollisionAvoidance(dt, 2, 1.0, 0, 800, OT_HURT);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!game->isShuttingDownGameState())
|
if (!game->isShuttingDownGameState())
|
||||||
|
@ -7118,7 +7149,6 @@ void Avatar::onUpdate(float dt)
|
||||||
else
|
else
|
||||||
omov -= mov;
|
omov -= mov;
|
||||||
|
|
||||||
lastLastPosition = position;
|
|
||||||
lastPosition = position;
|
lastPosition = position;
|
||||||
Vector newPosition = position + mov;
|
Vector newPosition = position + mov;
|
||||||
//Vector testPosition = position + (vel *dt)*2;
|
//Vector testPosition = position + (vel *dt)*2;
|
||||||
|
@ -7127,11 +7157,11 @@ void Avatar::onUpdate(float dt)
|
||||||
if (dsq->game->collideCircleWithGrid(position, collideRadius))
|
if (dsq->game->collideCircleWithGrid(position, collideRadius))
|
||||||
{
|
{
|
||||||
if (dsq->game->lastCollideTileType == OT_HURT
|
if (dsq->game->lastCollideTileType == OT_HURT
|
||||||
&& dsq->continuity.getWorldType() != WT_SPIRIT
|
&& isDamageTarget(DT_WALLHURT))
|
||||||
&& dsq->continuity.form != FORM_NATURE)
|
|
||||||
{
|
{
|
||||||
DamageData d;
|
DamageData d;
|
||||||
d.damage = 1;
|
d.damage = 1;
|
||||||
|
d.damageType = DT_WALLHURT;
|
||||||
damage(d);
|
damage(d);
|
||||||
vel2 = Vector(0,0,0);
|
vel2 = Vector(0,0,0);
|
||||||
//doCollisionAvoidance(1, 3, 1);
|
//doCollisionAvoidance(1, 3, 1);
|
||||||
|
@ -7294,7 +7324,8 @@ void Avatar::onUpdate(float dt)
|
||||||
rightHandEmitter->position = boneRightHand->getWorldCollidePosition(Vector(0,16));
|
rightHandEmitter->position = boneRightHand->getWorldCollidePosition(Vector(0,16));
|
||||||
}
|
}
|
||||||
|
|
||||||
dsq->game->handleShotCollisions(this, (activeAura == AURA_SHIELD));
|
if(canCollideWithShots())
|
||||||
|
dsq->game->handleShotCollisions(this, (activeAura == AURA_SHIELD));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -7314,7 +7345,7 @@ void Avatar::checkNearWall()
|
||||||
{
|
{
|
||||||
t.x = oT.x + v.x*i;
|
t.x = oT.x + v.x*i;
|
||||||
t.y = oT.y + v.y*i;
|
t.y = oT.y + v.y*i;
|
||||||
if (dsq->game->isObstructed(t) && dsq->game->getGrid(t) != OT_HURT)
|
if (dsq->game->isObstructed(t, ~OT_HURT))
|
||||||
{
|
{
|
||||||
obs = true;
|
obs = true;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -66,6 +66,13 @@ enum AvatarAnimLayers
|
||||||
ANIMLAYER_MAX
|
ANIMLAYER_MAX
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum SeeMapMode
|
||||||
|
{
|
||||||
|
SEE_MAP_NEVER = 0,
|
||||||
|
SEE_MAP_DEFAULT = 1,
|
||||||
|
SEE_MAP_ALWAYS = 2,
|
||||||
|
};
|
||||||
|
|
||||||
class SongIconParticle : public Quad
|
class SongIconParticle : public Quad
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -160,7 +167,6 @@ public:
|
||||||
Entity *entityToActivate;
|
Entity *entityToActivate;
|
||||||
Path *pathToActivate;
|
Path *pathToActivate;
|
||||||
|
|
||||||
void shift();
|
|
||||||
void applyWorldEffects(WorldType type);
|
void applyWorldEffects(WorldType type);
|
||||||
|
|
||||||
void toggleMovement(bool on);
|
void toggleMovement(bool on);
|
||||||
|
@ -284,6 +290,7 @@ public:
|
||||||
void endOfGameState();
|
void endOfGameState();
|
||||||
bool canQuickSong();
|
bool canQuickSong();
|
||||||
bool canActivateStuff();
|
bool canActivateStuff();
|
||||||
|
void setCanActivateStuff(bool on);
|
||||||
bool hasThingToActivate();
|
bool hasThingToActivate();
|
||||||
|
|
||||||
float biteTimer;
|
float biteTimer;
|
||||||
|
@ -317,6 +324,25 @@ public:
|
||||||
bool canSetBoneLock();
|
bool canSetBoneLock();
|
||||||
|
|
||||||
void revert();
|
void revert();
|
||||||
|
void doBindSong();
|
||||||
|
void doShieldSong();
|
||||||
|
|
||||||
|
bool canBurst() const { return _canBurst; }
|
||||||
|
void setCanBurst(bool b) { _canBurst = b; }
|
||||||
|
|
||||||
|
bool canLockToWall() const { return _canLockToWall; }
|
||||||
|
void setCanLockToWall(bool b) { _canLockToWall = b; }
|
||||||
|
|
||||||
|
bool canSwimAgainstCurrents() const { return _canSwimAgainstCurrents; }
|
||||||
|
void setCanSwimAgainstCurrents(bool b) { _canSwimAgainstCurrents = b; }
|
||||||
|
|
||||||
|
bool canCollideWithShots() const { return _canCollideWithShots; }
|
||||||
|
void setCollideWithShots(bool b) { _canCollideWithShots = b; }
|
||||||
|
|
||||||
|
void setCollisionAvoidanceData(int range, float mod);
|
||||||
|
|
||||||
|
void setSeeMapMode(SeeMapMode mode) { _seeMapMode = mode; }
|
||||||
|
SeeMapMode getSeeMapMode() const { return _seeMapMode; }
|
||||||
|
|
||||||
int leaches;
|
int leaches;
|
||||||
|
|
||||||
|
@ -450,7 +476,15 @@ protected:
|
||||||
void lockToWall();
|
void lockToWall();
|
||||||
void doShock(const std::string &shotName);
|
void doShock(const std::string &shotName);
|
||||||
|
|
||||||
Vector lastLastPosition;
|
bool _canActivateStuff;
|
||||||
|
bool _canBurst;
|
||||||
|
bool _canLockToWall;
|
||||||
|
bool _canSwimAgainstCurrents;
|
||||||
|
bool _canCollideWithShots;
|
||||||
|
SeeMapMode _seeMapMode;
|
||||||
|
|
||||||
|
int _collisionAvoidRange;
|
||||||
|
float _collisionAvoidMod;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -142,7 +142,7 @@ void Beam::render()
|
||||||
void Beam::onRender()
|
void Beam::onRender()
|
||||||
{
|
{
|
||||||
#ifdef BBGE_BUILD_OPENGL
|
#ifdef BBGE_BUILD_OPENGL
|
||||||
glDisable(GL_CULL_FACE);
|
//glDisable(GL_CULL_FACE);
|
||||||
Vector diff = endPos - position;
|
Vector diff = endPos - position;
|
||||||
Vector side = diff;
|
Vector side = diff;
|
||||||
//side.normalize2D();
|
//side.normalize2D();
|
||||||
|
|
|
@ -1347,16 +1347,6 @@ Song *Continuity::getSongByIndex(int idx)
|
||||||
return &songBank[idx];
|
return &songBank[idx];
|
||||||
}
|
}
|
||||||
|
|
||||||
int Continuity::getSongBankSize()
|
|
||||||
{
|
|
||||||
int c = 0;
|
|
||||||
for (SongMap::iterator i = songBank.begin(); i != songBank.end(); i++)
|
|
||||||
{
|
|
||||||
c++;
|
|
||||||
}
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Continuity::castSong(int num)
|
void Continuity::castSong(int num)
|
||||||
{
|
{
|
||||||
if (!dsq->continuity.hasSong((SongType)num)) return;
|
if (!dsq->continuity.hasSong((SongType)num)) return;
|
||||||
|
@ -1409,32 +1399,10 @@ void Continuity::castSong(int num)
|
||||||
switch((SongType)num)
|
switch((SongType)num)
|
||||||
{
|
{
|
||||||
case SONG_SHIELDAURA:
|
case SONG_SHIELDAURA:
|
||||||
core->sound->playSfx("Shield-On");
|
dsq->game->avatar->doShieldSong();
|
||||||
dsq->game->avatar->activateAura(AURA_SHIELD);
|
|
||||||
break;
|
break;
|
||||||
case SONG_BIND:
|
case SONG_BIND:
|
||||||
//debugLog("sang pull");
|
dsq->game->avatar->doBindSong();
|
||||||
if (dsq->game->avatar->pullTarget)
|
|
||||||
{
|
|
||||||
dsq->game->avatar->pullTarget->stopPull();
|
|
||||||
dsq->game->avatar->pullTarget = 0;
|
|
||||||
core->sound->playSfx("Denied");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
dsq->game->bindIngredients();
|
|
||||||
dsq->game->avatar->setNearestPullTarget();
|
|
||||||
if (!dsq->game->avatar->pullTarget)
|
|
||||||
{
|
|
||||||
core->sound->playSfx("Denied");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
core->sound->playSfx("Bind");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//dsq->game->avatar->openPullTargetInterface();
|
|
||||||
//pickingPullTarget = true;
|
|
||||||
break;
|
break;
|
||||||
case SONG_ENERGYFORM:
|
case SONG_ENERGYFORM:
|
||||||
dsq->game->avatar->changeForm(FORM_ENERGY);
|
dsq->game->avatar->changeForm(FORM_ENERGY);
|
||||||
|
@ -1948,9 +1916,15 @@ void Continuity::shiftWorlds()
|
||||||
{
|
{
|
||||||
WorldType lastWorld = worldType;
|
WorldType lastWorld = worldType;
|
||||||
if (worldType == WT_NORMAL)
|
if (worldType == WT_NORMAL)
|
||||||
|
{
|
||||||
worldType = WT_SPIRIT;
|
worldType = WT_SPIRIT;
|
||||||
|
dsq->game->setWorldPaused(true);
|
||||||
|
}
|
||||||
else if (worldType == WT_SPIRIT)
|
else if (worldType == WT_SPIRIT)
|
||||||
|
{
|
||||||
worldType = WT_NORMAL;
|
worldType = WT_NORMAL;
|
||||||
|
dsq->game->setWorldPaused(false);
|
||||||
|
}
|
||||||
FOR_ENTITIES(i)
|
FOR_ENTITIES(i)
|
||||||
{
|
{
|
||||||
Entity *e = *i;
|
Entity *e = *i;
|
||||||
|
|
|
@ -62,7 +62,7 @@ void CurrentRender::onRender()
|
||||||
{
|
{
|
||||||
#ifdef BBGE_BUILD_OPENGL
|
#ifdef BBGE_BUILD_OPENGL
|
||||||
// note: Leave cull_face disabled!?
|
// note: Leave cull_face disabled!?
|
||||||
glDisable(GL_CULL_FACE);
|
//glDisable(GL_CULL_FACE);
|
||||||
//int qs = 0;
|
//int qs = 0;
|
||||||
for (Path *p = dsq->game->getFirstPathOfType(PATH_CURRENT); p; p = p->nextOfType)
|
for (Path *p = dsq->game->getFirstPathOfType(PATH_CURRENT); p; p = p->nextOfType)
|
||||||
{
|
{
|
||||||
|
@ -308,7 +308,7 @@ void CurrentRender::onRender()
|
||||||
//glEnd();
|
//glEnd();
|
||||||
|
|
||||||
}
|
}
|
||||||
glEnable(GL_CULL_FACE);
|
//glEnable(GL_CULL_FACE);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
std::ostringstream os;
|
std::ostringstream os;
|
||||||
|
|
|
@ -1532,10 +1532,10 @@ This build is not yet final, and as such there are a couple things lacking. They
|
||||||
renderObjectLayerOrder[LR_ENTITIES_MINUS3] = -1;
|
renderObjectLayerOrder[LR_ENTITIES_MINUS3] = -1;
|
||||||
renderObjectLayerOrder[LR_ENTITIES_MINUS2] = -1;
|
renderObjectLayerOrder[LR_ENTITIES_MINUS2] = -1;
|
||||||
|
|
||||||
if (!Entity::blurShader.isLoaded())
|
/*if (!Entity::blurShader.isLoaded())
|
||||||
{
|
{
|
||||||
//Entity::blurShader.load("data/shaders/stan.vert", "data/shaders/hoblur.frag");
|
//Entity::blurShader.load("data/shaders/stan.vert", "data/shaders/hoblur.frag");
|
||||||
}
|
}*/
|
||||||
|
|
||||||
setMousePosition(core->center);
|
setMousePosition(core->center);
|
||||||
|
|
||||||
|
@ -4564,6 +4564,10 @@ void DSQ::onUpdate(float dt)
|
||||||
os << " headRot: " << b->rotation.z;
|
os << " headRot: " << b->rotation.z;
|
||||||
os << std::endl;
|
os << std::endl;
|
||||||
os << "fh: " << dsq->game->avatar->isfh() << " fv: " << dsq->game->avatar->isfv() << std::endl;
|
os << "fh: " << dsq->game->avatar->isfh() << " fv: " << dsq->game->avatar->isfv() << std::endl;
|
||||||
|
os << "canActivate: " << dsq->game->avatar->canActivateStuff();
|
||||||
|
os << " canBurst: " << dsq->game->avatar->canBurst();
|
||||||
|
os << " canLTW: " << dsq->game->avatar->canLockToWall();
|
||||||
|
os << " canSAC: " << dsq->game->avatar->canSwimAgainstCurrents() << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
// DO NOT CALL AVATAR-> beyond this point
|
// DO NOT CALL AVATAR-> beyond this point
|
||||||
|
@ -4576,6 +4580,7 @@ void DSQ::onUpdate(float dt)
|
||||||
os << "altState: " << core->getKeyState(KEY_LALT) << " | " << core->getKeyState(KEY_RALT) << std::endl;
|
os << "altState: " << core->getKeyState(KEY_LALT) << " | " << core->getKeyState(KEY_RALT) << std::endl;
|
||||||
os << "PMFree: " << particleManager->getFree() << " Active: " << particleManager->getNumActive() << std::endl;
|
os << "PMFree: " << particleManager->getFree() << " Active: " << particleManager->getNumActive() << std::endl;
|
||||||
os << "cameraPos: (" << dsq->cameraPos.x << ", " << dsq->cameraPos.y << ")" << std::endl;
|
os << "cameraPos: (" << dsq->cameraPos.x << ", " << dsq->cameraPos.y << ")" << std::endl;
|
||||||
|
os << "worldType: " << continuity.getWorldType() << " worldPaused: " << game->isWorldPaused() << std::endl;
|
||||||
os << "voiceTime: " << dsq->sound->getVoiceTime() << " bNat: " << dsq->game->bNatural;
|
os << "voiceTime: " << dsq->sound->getVoiceTime() << " bNat: " << dsq->game->bNatural;
|
||||||
int ca, ma;
|
int ca, ma;
|
||||||
dsq->sound->getStats(&ca, &ma);
|
dsq->sound->getStats(&ca, &ma);
|
||||||
|
@ -4590,7 +4595,7 @@ void DSQ::onUpdate(float dt)
|
||||||
if (isDeveloperKeys() && fpsText && cmDebug && cmDebug->alpha == 1)
|
if (isDeveloperKeys() && fpsText && cmDebug && cmDebug->alpha == 1)
|
||||||
{
|
{
|
||||||
std::ostringstream os;
|
std::ostringstream os;
|
||||||
os << "FPS: " << core->fps << " | ROC: " << core->renderObjectCount;
|
os << "FPS: " << core->fps << " | ROC: " << core->renderObjectCount << " | RC: " << Core::dbg_numRenderCalls;
|
||||||
os << " | p: " << core->processedRenderObjectCount << " | t: " << core->totalRenderObjectCount;
|
os << " | p: " << core->processedRenderObjectCount << " | t: " << core->totalRenderObjectCount;
|
||||||
os << " | s: " << dsq->continuity.seconds;
|
os << " | s: " << dsq->continuity.seconds;
|
||||||
os << " | evQ: " << core->eventQueue.getSize();
|
os << " | evQ: " << core->eventQueue.getSize();
|
||||||
|
|
|
@ -996,7 +996,6 @@ public:
|
||||||
FormUpgrades formUpgrades;
|
FormUpgrades formUpgrades;
|
||||||
|
|
||||||
void loadSongBank();
|
void loadSongBank();
|
||||||
int getSongBankSize();
|
|
||||||
void loadIntoSongBank(const std::string &file);
|
void loadIntoSongBank(const std::string &file);
|
||||||
int checkSong(const Song &song);
|
int checkSong(const Song &song);
|
||||||
int checkSongAssisted(const Song &song);
|
int checkSongAssisted(const Song &song);
|
||||||
|
|
|
@ -27,7 +27,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
#include "ScriptedEntity.h"
|
#include "ScriptedEntity.h"
|
||||||
#include "Shot.h"
|
#include "Shot.h"
|
||||||
|
|
||||||
Shader Entity::blurShader;
|
//Shader Entity::blurShader;
|
||||||
|
|
||||||
void Entity::stopPull()
|
void Entity::stopPull()
|
||||||
{
|
{
|
||||||
|
@ -1080,7 +1080,7 @@ void Entity::onFHScale()
|
||||||
copySkel.alpha.interpolateTo(0, 0.5);
|
copySkel.alpha.interpolateTo(0, 0.5);
|
||||||
*/
|
*/
|
||||||
//skeletalSprite.alpha.interpolateTo(1,sct);
|
//skeletalSprite.alpha.interpolateTo(1,sct);
|
||||||
blurShaderAnim.interpolateTo(Vector(blurMin,0,0), sct);
|
//blurShaderAnim.interpolateTo(Vector(blurMin,0,0), sct);
|
||||||
fhScale = 0;
|
fhScale = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1105,8 +1105,8 @@ void Entity::onFH()
|
||||||
|
|
||||||
flipScale.interpolateTo(Vector(0.6, 1), sct);
|
flipScale.interpolateTo(Vector(0.6, 1), sct);
|
||||||
|
|
||||||
blurShaderAnim = Vector(blurMin);
|
//blurShaderAnim = Vector(blurMin);
|
||||||
blurShaderAnim.interpolateTo(Vector(blurMax,0,0), sct/2);
|
//blurShaderAnim.interpolateTo(Vector(blurMax,0,0), sct/2);
|
||||||
|
|
||||||
fhScale = 1;
|
fhScale = 1;
|
||||||
}
|
}
|
||||||
|
@ -1142,9 +1142,9 @@ void Entity::update(float dt)
|
||||||
if (doUpdate && !dsq->game->isPaused())
|
if (doUpdate && !dsq->game->isPaused())
|
||||||
{
|
{
|
||||||
|
|
||||||
if (getEntityType() == ET_ENEMY || getEntityType() == ET_NEUTRAL || getEntityType() == ET_PET)
|
if (!(getEntityType() == ET_AVATAR || getEntityType() == ET_INGREDIENT))
|
||||||
{
|
{
|
||||||
if (spiritFreeze && dsq->continuity.getWorldType() == WT_SPIRIT)
|
if (spiritFreeze && dsq->game->isWorldPaused())
|
||||||
{
|
{
|
||||||
// possible bug here because of return
|
// possible bug here because of return
|
||||||
return;
|
return;
|
||||||
|
@ -1382,7 +1382,7 @@ bool Entity::updateCurrents(float dt)
|
||||||
// why?
|
// why?
|
||||||
{
|
{
|
||||||
//Path *p = dsq->game->getNearestPath(position, PATH_CURRENT);
|
//Path *p = dsq->game->getNearestPath(position, PATH_CURRENT);
|
||||||
if (dsq->continuity.getWorldType() != WT_SPIRIT)
|
if (!dsq->game->isWorldPaused())
|
||||||
{
|
{
|
||||||
for (Path *p = dsq->game->getFirstPathOfType(PATH_CURRENT); p; p = p->nextOfType)
|
for (Path *p = dsq->game->getFirstPathOfType(PATH_CURRENT); p; p = p->nextOfType)
|
||||||
{
|
{
|
||||||
|
@ -1419,7 +1419,7 @@ bool Entity::updateCurrents(float dt)
|
||||||
float useLen = len;
|
float useLen = len;
|
||||||
if (useLen < 500)
|
if (useLen < 500)
|
||||||
useLen = 500;
|
useLen = 500;
|
||||||
if (!(this->getEntityType() == ET_AVATAR && dsq->continuity.form == FORM_BEAST && dsq->game->avatar->bursting))
|
if (!(this->getEntityType() == ET_AVATAR && dsq->game->avatar->canSwimAgainstCurrents() && dsq->game->avatar->bursting))
|
||||||
{
|
{
|
||||||
doCollisionAvoidance(1, 4, 1, &vel2, useLen);
|
doCollisionAvoidance(1, 4, 1, &vel2, useLen);
|
||||||
}
|
}
|
||||||
|
@ -1439,7 +1439,7 @@ bool Entity::updateCurrents(float dt)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (this->getEntityType() == ET_AVATAR && dsq->continuity.form == FORM_BEAST)
|
if (this->getEntityType() == ET_AVATAR && dsq->game->avatar->canSwimAgainstCurrents())
|
||||||
{
|
{
|
||||||
int cap = 100;
|
int cap = 100;
|
||||||
if (!vel.isZero())
|
if (!vel.isZero())
|
||||||
|
@ -1681,7 +1681,7 @@ void Entity::onUpdate(float dt)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
blurShaderAnim.update(dt);
|
//blurShaderAnim.update(dt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -2832,23 +2832,18 @@ void Entity::render()
|
||||||
|
|
||||||
// HACK: need to multiply base + etc
|
// HACK: need to multiply base + etc
|
||||||
skeletalSprite.setColorMult(this->color, this->alpha.x);
|
skeletalSprite.setColorMult(this->color, this->alpha.x);
|
||||||
bool set=false;
|
/*bool set=false;
|
||||||
if (beautyFlip && blurShader.isLoaded() && flipScale.isInterpolating() && dsq->user.video.blur)
|
if (beautyFlip && blurShader.isLoaded() && flipScale.isInterpolating() && dsq->user.video.blur)
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
std::ostringstream os;
|
|
||||||
os << "blurShaderAnim: " << blurShaderAnim.x;
|
|
||||||
debugLog(os.str());
|
|
||||||
*/
|
|
||||||
//swizzle
|
//swizzle
|
||||||
blurShader.setValue(color.x, color.y, color.z, blurShaderAnim.x);
|
blurShader.setValue(color.x, color.y, color.z, blurShaderAnim.x);
|
||||||
blurShader.bind();
|
blurShader.bind();
|
||||||
set = true;
|
set = true;
|
||||||
}
|
}*/
|
||||||
Quad::render();
|
Quad::render();
|
||||||
//if (beautyFlip && blurShader.isLoaded() && flipScale.isInterpolating())
|
//if (beautyFlip && blurShader.isLoaded() && flipScale.isInterpolating())
|
||||||
if (set)
|
//if (set)
|
||||||
blurShader.unbind();
|
// blurShader.unbind();
|
||||||
renderBorder = false;
|
renderBorder = false;
|
||||||
skeletalSprite.clearColorMult();
|
skeletalSprite.clearColorMult();
|
||||||
color = bcolor;
|
color = bcolor;
|
||||||
|
@ -3133,3 +3128,14 @@ void Entity::exertHairForce(const Vector &force, float dt)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Entity::isEntityInside()
|
||||||
|
{
|
||||||
|
FOR_ENTITIES(i)
|
||||||
|
{
|
||||||
|
Entity *e = *i;
|
||||||
|
if (e && e->life == 1 && e != this && e->ridingOnEntity != this && isCoordinateInside(e->position))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
|
@ -123,6 +123,7 @@ enum DamageType
|
||||||
DT_CRUSH = 1032,
|
DT_CRUSH = 1032,
|
||||||
DT_SPIKES = 1033,
|
DT_SPIKES = 1033,
|
||||||
DT_STEAM = 1034,
|
DT_STEAM = 1034,
|
||||||
|
DT_WALLHURT = 1035,
|
||||||
DT_REALMAX
|
DT_REALMAX
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -436,6 +437,7 @@ public:
|
||||||
void setDieTimer(float v) { dieTimer = v; }
|
void setDieTimer(float v) { dieTimer = v; }
|
||||||
float getHealthPerc();
|
float getHealthPerc();
|
||||||
void setDeathScene(bool v);
|
void setDeathScene(bool v);
|
||||||
|
bool isDeathScene() const { return deathScene; }
|
||||||
void generateCollisionMask(int ovrCollideRadius=0);
|
void generateCollisionMask(int ovrCollideRadius=0);
|
||||||
DamageData lastDamage;
|
DamageData lastDamage;
|
||||||
bool checkSplash(const Vector &override=Vector(0,0,0));
|
bool checkSplash(const Vector &override=Vector(0,0,0));
|
||||||
|
@ -450,7 +452,7 @@ public:
|
||||||
//bool registerEntityDied;
|
//bool registerEntityDied;
|
||||||
bool clampToSurface(int tcheck=0, Vector usePos=Vector(0,0), TileVector hitTile=TileVector(0,0));
|
bool clampToSurface(int tcheck=0, Vector usePos=Vector(0,0), TileVector hitTile=TileVector(0,0));
|
||||||
bool checkSurface(int tcheck, int state, float statet);
|
bool checkSurface(int tcheck, int state, float statet);
|
||||||
static Shader blurShader;
|
//static Shader blurShader;
|
||||||
std::string naijaReaction;
|
std::string naijaReaction;
|
||||||
Vector lookAtPoint;
|
Vector lookAtPoint;
|
||||||
Vector getLookAtPoint();
|
Vector getLookAtPoint();
|
||||||
|
@ -488,6 +490,8 @@ public:
|
||||||
void setHairHeadPosition(const Vector &pos);
|
void setHairHeadPosition(const Vector &pos);
|
||||||
void exertHairForce(const Vector &force, float dt);
|
void exertHairForce(const Vector &force, float dt);
|
||||||
|
|
||||||
|
bool isEntityInside();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool calledEntityDied;
|
bool calledEntityDied;
|
||||||
Path *waterBubble;
|
Path *waterBubble;
|
||||||
|
@ -514,7 +518,7 @@ protected:
|
||||||
int lance;
|
int lance;
|
||||||
Bone *lanceBone;
|
Bone *lanceBone;
|
||||||
void updateLance(float dt);
|
void updateLance(float dt);
|
||||||
InterpolatedVector blurShaderAnim;
|
//InterpolatedVector blurShaderAnim;
|
||||||
|
|
||||||
|
|
||||||
int fhScale, fvScale;
|
int fhScale, fvScale;
|
||||||
|
|
|
@ -1233,6 +1233,8 @@ Game::Game() : StateObject()
|
||||||
|
|
||||||
loadEntityTypeList();
|
loadEntityTypeList();
|
||||||
|
|
||||||
|
lastCollideMaskIndex = -1;
|
||||||
|
worldPaused = false;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5717,7 +5719,7 @@ void Game::updateParticlePause()
|
||||||
{
|
{
|
||||||
core->particlesPaused = 2;
|
core->particlesPaused = 2;
|
||||||
}
|
}
|
||||||
else if (dsq->continuity.getWorldType() == WT_SPIRIT)
|
else if (this->isWorldPaused())
|
||||||
{
|
{
|
||||||
core->particlesPaused = 1;
|
core->particlesPaused = 1;
|
||||||
}
|
}
|
||||||
|
@ -8356,7 +8358,7 @@ void Game::registerSporeDrop(const Vector &pos, int t)
|
||||||
|
|
||||||
bool Game::isEntityCollideWithShot(Entity *e, Shot *shot)
|
bool Game::isEntityCollideWithShot(Entity *e, Shot *shot)
|
||||||
{
|
{
|
||||||
if (!shot->isHitEnts())
|
if (!shot->isHitEnts() || shot->firer == e)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -8367,24 +8369,17 @@ bool Game::isEntityCollideWithShot(Entity *e, Shot *shot)
|
||||||
}
|
}
|
||||||
if (e->getEntityType() == ET_ENEMY)
|
if (e->getEntityType() == ET_ENEMY)
|
||||||
{
|
{
|
||||||
if (shot->firer != e)
|
if (shot->getDamageType() == DT_AVATAR_BITE)
|
||||||
{
|
{
|
||||||
if (shot->getDamageType() == DT_AVATAR_BITE)
|
Avatar::BittenEntities::iterator i;
|
||||||
|
for (i = avatar->bittenEntities.begin(); i != avatar->bittenEntities.end(); i++)
|
||||||
{
|
{
|
||||||
Avatar::BittenEntities::iterator i;
|
if (e == (*i))
|
||||||
for (i = avatar->bittenEntities.begin(); i != avatar->bittenEntities.end(); i++)
|
|
||||||
{
|
{
|
||||||
if (e == (*i))
|
return false;
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
}
|
return true;
|
||||||
else
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (e->getEntityType() == ET_AVATAR)
|
else if (e->getEntityType() == ET_AVATAR)
|
||||||
|
@ -9977,7 +9972,7 @@ void Game::update(float dt)
|
||||||
|
|
||||||
if (avatar)
|
if (avatar)
|
||||||
{
|
{
|
||||||
tintColor.update(dt);
|
/*tintColor.update(dt);
|
||||||
if (core->afterEffectManager)
|
if (core->afterEffectManager)
|
||||||
{
|
{
|
||||||
if (tintColor.isInterpolating())
|
if (tintColor.isInterpolating())
|
||||||
|
@ -9986,7 +9981,7 @@ void Game::update(float dt)
|
||||||
core->afterEffectManager->setActiveShader(AS_NONE);
|
core->afterEffectManager->setActiveShader(AS_NONE);
|
||||||
|
|
||||||
core->afterEffectManager->glowShader.setValue(tintColor.x, tintColor.y, tintColor.z, 1);
|
core->afterEffectManager->glowShader.setValue(tintColor.x, tintColor.y, tintColor.z, 1);
|
||||||
}
|
}*/
|
||||||
|
|
||||||
if (avatar->isRolling())
|
if (avatar->isRolling())
|
||||||
particleManager->addInfluence(ParticleInfluence(avatar->position, 300, 800, true));
|
particleManager->addInfluence(ParticleInfluence(avatar->position, 300, 800, true));
|
||||||
|
|
|
@ -892,7 +892,8 @@ public:
|
||||||
std::string getNoteName(int n, const std::string &pre="");
|
std::string getNoteName(int n, const std::string &pre="");
|
||||||
|
|
||||||
void selectEntityFromGroups();
|
void selectEntityFromGroups();
|
||||||
InterpolatedVector cameraInterp, tintColor;
|
InterpolatedVector cameraInterp;
|
||||||
|
//InterpolatedVector tintColor;
|
||||||
float getWaterLevel();
|
float getWaterLevel();
|
||||||
void setMusicToPlay(const std::string &musicToPlay);
|
void setMusicToPlay(const std::string &musicToPlay);
|
||||||
Vector lastCollidePosition;
|
Vector lastCollidePosition;
|
||||||
|
@ -1001,6 +1002,9 @@ public:
|
||||||
void toggleHelpScreen(bool on, const std::string &label="");
|
void toggleHelpScreen(bool on, const std::string &label="");
|
||||||
void onToggleHelpScreen();
|
void onToggleHelpScreen();
|
||||||
|
|
||||||
|
void setWorldPaused(bool b) { worldPaused = b; }
|
||||||
|
bool isWorldPaused() const { return worldPaused; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
void onHelpUp();
|
void onHelpUp();
|
||||||
|
@ -1158,6 +1162,7 @@ protected:
|
||||||
std::vector<AquariaMenuItem*> menu;
|
std::vector<AquariaMenuItem*> menu;
|
||||||
Quad *menuBg, *menuBg2;
|
Quad *menuBg, *menuBg2;
|
||||||
bool paused;
|
bool paused;
|
||||||
|
bool worldPaused;
|
||||||
|
|
||||||
Vector getClosestPointOnTriangle(Vector a, Vector b, Vector c, Vector p);
|
Vector getClosestPointOnTriangle(Vector a, Vector b, Vector c, Vector p);
|
||||||
Vector getClosestPointOnLine(Vector a, Vector b, Vector p);
|
Vector getClosestPointOnLine(Vector a, Vector b, Vector p);
|
||||||
|
|
|
@ -130,7 +130,7 @@ HairNode *Hair::getHairNode(int idx)
|
||||||
void Hair::onRender()
|
void Hair::onRender()
|
||||||
{
|
{
|
||||||
#ifdef BBGE_BUILD_OPENGL
|
#ifdef BBGE_BUILD_OPENGL
|
||||||
glDisable(GL_CULL_FACE);
|
//glDisable(GL_CULL_FACE);
|
||||||
|
|
||||||
glBegin(GL_QUAD_STRIP);
|
glBegin(GL_QUAD_STRIP);
|
||||||
float texBits = 1.0f / (hairNodes.size()-1);
|
float texBits = 1.0f / (hairNodes.size()-1);
|
||||||
|
@ -192,7 +192,7 @@ void Hair::onRender()
|
||||||
}
|
}
|
||||||
|
|
||||||
*/
|
*/
|
||||||
glEnable(GL_CULL_FACE);
|
//glEnable(GL_CULL_FACE);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -109,7 +109,7 @@ void Ingredient::eat(Entity *e)
|
||||||
void Ingredient::onUpdate(float dt)
|
void Ingredient::onUpdate(float dt)
|
||||||
{
|
{
|
||||||
if (dsq->game->isPaused()) return;
|
if (dsq->game->isPaused()) return;
|
||||||
if (dsq->continuity.getWorldType() == WT_SPIRIT) return;
|
if (dsq->game->isWorldPaused()) return;
|
||||||
|
|
||||||
Vector lastPosition = position;
|
Vector lastPosition = position;
|
||||||
Entity::onUpdate(dt);
|
Entity::onUpdate(dt);
|
||||||
|
|
|
@ -258,11 +258,18 @@ void MiniMapRender::onUpdate(float dt)
|
||||||
|
|
||||||
if (dsq->darkLayer.isUsed() && dsq->game->avatar)
|
if (dsq->darkLayer.isUsed() && dsq->game->avatar)
|
||||||
{
|
{
|
||||||
if (dsq->continuity.form != FORM_SUN && dsq->game->avatar->isInDarkness())
|
const SeeMapMode mapmode = dsq->game->avatar->getSeeMapMode();
|
||||||
|
|
||||||
|
if(mapmode == SEE_MAP_ALWAYS)
|
||||||
|
radarHide = false;
|
||||||
|
else if(mapmode == SEE_MAP_NEVER)
|
||||||
|
radarHide = true;
|
||||||
|
else if (dsq->continuity.form != FORM_SUN && dsq->game->avatar->isInDarkness())
|
||||||
{
|
{
|
||||||
radarHide = true;
|
radarHide = true;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
if(!radarHide)
|
||||||
{
|
{
|
||||||
for (Path *p = dsq->game->getFirstPathOfType(PATH_RADARHIDE); p; p = p->nextOfType)
|
for (Path *p = dsq->game->getFirstPathOfType(PATH_RADARHIDE); p; p = p->nextOfType)
|
||||||
{
|
{
|
||||||
|
@ -273,6 +280,7 @@ void MiniMapRender::onUpdate(float dt)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
float t = dt*2;
|
float t = dt*2;
|
||||||
if (radarHide)
|
if (radarHide)
|
||||||
{
|
{
|
||||||
|
|
|
@ -284,6 +284,7 @@ void Mod::stop()
|
||||||
debugMenu = false;
|
debugMenu = false;
|
||||||
shuttingDown = false;
|
shuttingDown = false;
|
||||||
dsq->scriptInterface.reset();
|
dsq->scriptInterface.reset();
|
||||||
|
dsq->game->setWorldPaused(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mod::update(float dt)
|
void Mod::update(float dt)
|
||||||
|
|
|
@ -53,12 +53,7 @@ Path::Path()
|
||||||
spawnEnemyNumber = 0;
|
spawnEnemyNumber = 0;
|
||||||
spawnEnemyDistance = 0;
|
spawnEnemyDistance = 0;
|
||||||
warpType = 0;
|
warpType = 0;
|
||||||
/*
|
spiritFreeze = true;
|
||||||
rect.x1 = -10;
|
|
||||||
rect.x2 = 20;
|
|
||||||
rect.y1 = -256;
|
|
||||||
rect.y2 = 256;
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Path::clampPosition(Vector *pos, int radius)
|
void Path::clampPosition(Vector *pos, int radius)
|
||||||
|
@ -484,7 +479,7 @@ void Path::init()
|
||||||
|
|
||||||
void Path::update(float dt)
|
void Path::update(float dt)
|
||||||
{
|
{
|
||||||
if (!dsq->game->isPaused() && dsq->continuity.getWorldType() == WT_NORMAL)
|
if (!dsq->game->isPaused() && !(spiritFreeze && dsq->game->isWorldPaused()))
|
||||||
{
|
{
|
||||||
if (addEmitter && emitter)
|
if (addEmitter && emitter)
|
||||||
{
|
{
|
||||||
|
@ -523,7 +518,7 @@ void Path::update(float dt)
|
||||||
{
|
{
|
||||||
spawnedEntity = 0;
|
spawnedEntity = 0;
|
||||||
}
|
}
|
||||||
if (pathType == PATH_CURRENT && dsq->continuity.getWorldType() == WT_NORMAL)
|
if (pathType == PATH_CURRENT && !dsq->game->isWorldPaused())
|
||||||
{
|
{
|
||||||
animOffset -= currentMod*(dt/830);
|
animOffset -= currentMod*(dt/830);
|
||||||
/*
|
/*
|
||||||
|
@ -559,7 +554,7 @@ void Path::update(float dt)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pathType == PATH_STEAM && dsq->continuity.getWorldType() == WT_NORMAL && effectOn)
|
if (pathType == PATH_STEAM && !dsq->game->isWorldPaused() && effectOn)
|
||||||
{
|
{
|
||||||
animOffset -= 1000*0.00002f;
|
animOffset -= 1000*0.00002f;
|
||||||
|
|
||||||
|
|
|
@ -143,6 +143,7 @@ public:
|
||||||
std::string gem;
|
std::string gem;
|
||||||
|
|
||||||
bool effectOn;
|
bool effectOn;
|
||||||
|
bool spiritFreeze;
|
||||||
|
|
||||||
PathShape pathShape;
|
PathShape pathShape;
|
||||||
|
|
||||||
|
|
|
@ -361,7 +361,7 @@ static void scriptError(lua_State *L, const std::string& msg)
|
||||||
// - The C++ standard allows offsetof() only on POD-types. Oh well, it probably works anyways.
|
// - The C++ standard allows offsetof() only on POD-types. Oh well, it probably works anyways.
|
||||||
// If it does not compile for some reason, comment it out, hope for the best, and go ahead.
|
// If it does not compile for some reason, comment it out, hope for the best, and go ahead.
|
||||||
#if !(defined(__GNUC__) && __GNUC__ <= 2)
|
#if !(defined(__GNUC__) && __GNUC__ <= 2)
|
||||||
void compile_time_assertions()
|
static void compile_time_assertions()
|
||||||
{
|
{
|
||||||
#define oo(cls) offsetof(cls, _objtype)
|
#define oo(cls) offsetof(cls, _objtype)
|
||||||
compile_assert(oo(Path) == oo(RenderObject));
|
compile_assert(oo(Path) == oo(RenderObject));
|
||||||
|
@ -377,6 +377,8 @@ void compile_time_assertions()
|
||||||
compile_assert(oo(Path) == oo(Quad));
|
compile_assert(oo(Path) == oo(Quad));
|
||||||
compile_assert(oo(Path) == oo(Avatar));
|
compile_assert(oo(Path) == oo(Avatar));
|
||||||
compile_assert(oo(Path) == oo(BaseText));
|
compile_assert(oo(Path) == oo(BaseText));
|
||||||
|
compile_assert(oo(Path) == oo(PauseQuad));
|
||||||
|
compile_assert(oo(Path) == oo(Shader));
|
||||||
#undef oo
|
#undef oo
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -457,6 +459,12 @@ std::string getString(lua_State *L, int slot = 1)
|
||||||
return sr;
|
return sr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
const char *getCString(lua_State *L, int slot = 1)
|
||||||
|
{
|
||||||
|
return lua_isstring(L, slot) ? lua_tostring(L, slot) : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static inline
|
static inline
|
||||||
Shot *getShot(lua_State *L, int slot = 1)
|
Shot *getShot(lua_State *L, int slot = 1)
|
||||||
{
|
{
|
||||||
|
@ -578,6 +586,16 @@ BaseText *getText(lua_State *L, int slot = 1)
|
||||||
return q;
|
return q;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
Shader *getShader(lua_State *L, int slot = 1)
|
||||||
|
{
|
||||||
|
Shader *q = (Shader*)lua_touserdata(L, slot);
|
||||||
|
ENSURE_TYPE(q, SCO_SHADER);
|
||||||
|
if (!q)
|
||||||
|
scriptDebug(L, "Invalid Shader");
|
||||||
|
return q;
|
||||||
|
}
|
||||||
|
|
||||||
static SkeletalSprite *getSkeletalSprite(Entity *e)
|
static SkeletalSprite *getSkeletalSprite(Entity *e)
|
||||||
{
|
{
|
||||||
return e ? &e->skeletalSprite : NULL;
|
return e ? &e->skeletalSprite : NULL;
|
||||||
|
@ -1579,6 +1597,7 @@ luaFunc(quad_setSegs)
|
||||||
RO_FUNC(getter, prefix, disableMotionBlur ) \
|
RO_FUNC(getter, prefix, disableMotionBlur ) \
|
||||||
RO_FUNC(getter, prefix, collideCircleVsLine) \
|
RO_FUNC(getter, prefix, collideCircleVsLine) \
|
||||||
RO_FUNC(getter, prefix, collideCircleVsLineAngle) \
|
RO_FUNC(getter, prefix, collideCircleVsLineAngle) \
|
||||||
|
RO_FUNC(getter, prefix, getVectorToObj ) \
|
||||||
MK_ALIAS(prefix, fh, flipHorizontal ) \
|
MK_ALIAS(prefix, fh, flipHorizontal ) \
|
||||||
MK_ALIAS(prefix, fv, flipVertical )
|
MK_ALIAS(prefix, fv, flipVertical )
|
||||||
|
|
||||||
|
@ -2112,18 +2131,22 @@ luaFunc(entity_setRidingData)
|
||||||
luaFunc(entity_setBoneLock)
|
luaFunc(entity_setBoneLock)
|
||||||
{
|
{
|
||||||
Entity *e = entity(L);
|
Entity *e = entity(L);
|
||||||
Entity *e2 = entity(L, 2);
|
|
||||||
Bone *b = 0;
|
|
||||||
if (lua_isuserdata(L, 3))
|
|
||||||
b = bone(L, 3);
|
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
if (e)
|
if (e)
|
||||||
{
|
{
|
||||||
BoneLock bl;
|
BoneLock bl;
|
||||||
bl.entity = e2;
|
if (lua_isuserdata(L, 2))
|
||||||
bl.bone = b;
|
{
|
||||||
bl.on = true;
|
Entity *e2 = entity(L, 2);
|
||||||
bl.collisionMaskIndex = dsq->game->lastCollideMaskIndex;
|
Bone *b = 0;
|
||||||
|
if (lua_isuserdata(L, 3))
|
||||||
|
b = bone(L, 3);
|
||||||
|
|
||||||
|
bl.entity = e2;
|
||||||
|
bl.bone = b;
|
||||||
|
bl.on = true;
|
||||||
|
bl.collisionMaskIndex = dsq->game->lastCollideMaskIndex;
|
||||||
|
}
|
||||||
ret = e->setBoneLock(bl);
|
ret = e->setBoneLock(bl);
|
||||||
}
|
}
|
||||||
luaReturnBool(ret);
|
luaReturnBool(ret);
|
||||||
|
@ -2347,6 +2370,25 @@ luaFunc(getWorldType)
|
||||||
luaReturnNum((int)dsq->continuity.getWorldType());
|
luaReturnNum((int)dsq->continuity.getWorldType());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
luaFunc(setWorldType)
|
||||||
|
{
|
||||||
|
WorldType wt = (WorldType)lua_tointeger(L, 1);
|
||||||
|
bool trans = getBool(L, 2);
|
||||||
|
dsq->continuity.applyWorldEffects(wt, trans, 1); // last arg is not used
|
||||||
|
luaReturnNil();
|
||||||
|
}
|
||||||
|
|
||||||
|
luaFunc(isWorldPaused)
|
||||||
|
{
|
||||||
|
luaReturnBool(dsq->game->isWorldPaused());
|
||||||
|
}
|
||||||
|
|
||||||
|
luaFunc(setWorldPaused)
|
||||||
|
{
|
||||||
|
dsq->game->setWorldPaused(getBool(L, 1));
|
||||||
|
luaReturnNil();
|
||||||
|
}
|
||||||
|
|
||||||
luaFunc(getNearestNodeByType)
|
luaFunc(getNearestNodeByType)
|
||||||
{
|
{
|
||||||
int x = lua_tonumber(L, 1);
|
int x = lua_tonumber(L, 1);
|
||||||
|
@ -2542,6 +2584,14 @@ luaFunc(entity_setSpiritFreeze)
|
||||||
luaReturnNil();
|
luaReturnNil();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
luaFunc(node_setSpiritFreeze)
|
||||||
|
{
|
||||||
|
Path *e = path(L);
|
||||||
|
if (e)
|
||||||
|
e->spiritFreeze = getBool(L,2);
|
||||||
|
luaReturnNil();
|
||||||
|
}
|
||||||
|
|
||||||
luaFunc(entity_setFillGrid)
|
luaFunc(entity_setFillGrid)
|
||||||
{
|
{
|
||||||
Entity *e = entity(L);
|
Entity *e = entity(L);
|
||||||
|
@ -2553,6 +2603,12 @@ luaFunc(entity_setFillGrid)
|
||||||
luaReturnNil();
|
luaReturnNil();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
luaFunc(entity_isFillGrid)
|
||||||
|
{
|
||||||
|
Entity *e = entity(L);
|
||||||
|
luaReturnBool(e ? e->fillGridFromQuad : false);
|
||||||
|
}
|
||||||
|
|
||||||
luaFunc(entity_getAimVector)
|
luaFunc(entity_getAimVector)
|
||||||
{
|
{
|
||||||
Entity *e = entity(L);
|
Entity *e = entity(L);
|
||||||
|
@ -2679,6 +2735,69 @@ luaFunc(avatar_setCanDie)
|
||||||
luaReturnNil();
|
luaReturnNil();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// not naming this avatar_* because it rather belongs into the UI category...
|
||||||
|
luaFunc(setCanActivate)
|
||||||
|
{
|
||||||
|
dsq->game->avatar->setCanActivateStuff(getBool(L, 1));
|
||||||
|
luaReturnNil();
|
||||||
|
}
|
||||||
|
|
||||||
|
luaFunc(setSeeMapMode)
|
||||||
|
{
|
||||||
|
dsq->game->avatar->setSeeMapMode((SeeMapMode)lua_tointeger(L, 1));
|
||||||
|
luaReturnNil();
|
||||||
|
}
|
||||||
|
|
||||||
|
luaFunc(avatar_setCanBurst)
|
||||||
|
{
|
||||||
|
dsq->game->avatar->setCanBurst(getBool(L, 1));
|
||||||
|
luaReturnNil();
|
||||||
|
}
|
||||||
|
|
||||||
|
luaFunc(avatar_canBurst)
|
||||||
|
{
|
||||||
|
luaReturnBool(dsq->game->avatar->canBurst());
|
||||||
|
}
|
||||||
|
|
||||||
|
luaFunc(avatar_setCanLockToWall)
|
||||||
|
{
|
||||||
|
dsq->game->avatar->setCanBurst(getBool(L, 1));
|
||||||
|
luaReturnNil();
|
||||||
|
}
|
||||||
|
|
||||||
|
luaFunc(avatar_canLockToWall)
|
||||||
|
{
|
||||||
|
luaReturnBool(dsq->game->avatar->canBurst());
|
||||||
|
}
|
||||||
|
|
||||||
|
luaFunc(avatar_setCanSwimAgainstCurrents)
|
||||||
|
{
|
||||||
|
dsq->game->avatar->setCanSwimAgainstCurrents(getBool(L, 1));
|
||||||
|
luaReturnNil();
|
||||||
|
}
|
||||||
|
|
||||||
|
luaFunc(avatar_canSwimAgainstCurrents)
|
||||||
|
{
|
||||||
|
luaReturnBool(dsq->game->avatar->canSwimAgainstCurrents());
|
||||||
|
}
|
||||||
|
|
||||||
|
luaFunc(avatar_setCanCollideWithShots)
|
||||||
|
{
|
||||||
|
dsq->game->avatar->setCollideWithShots(getBool(L, 1));
|
||||||
|
luaReturnNil();
|
||||||
|
}
|
||||||
|
|
||||||
|
luaFunc(avatar_canCollideWithShots)
|
||||||
|
{
|
||||||
|
luaReturnBool(dsq->game->avatar->canCollideWithShots());
|
||||||
|
}
|
||||||
|
|
||||||
|
luaFunc(avatar_setCollisionAvoidanceData)
|
||||||
|
{
|
||||||
|
dsq->game->avatar->setCollisionAvoidanceData(lua_tointeger(L, 1), lua_tonumber(L, 2));
|
||||||
|
luaReturnNil();
|
||||||
|
}
|
||||||
|
|
||||||
luaFunc(avatar_toggleCape)
|
luaFunc(avatar_toggleCape)
|
||||||
{
|
{
|
||||||
dsq->game->avatar->toggleCape(getBool(L,1));
|
dsq->game->avatar->toggleCape(getBool(L,1));
|
||||||
|
@ -2693,6 +2812,11 @@ luaFunc(avatar_setBlockSinging)
|
||||||
luaReturnNil();
|
luaReturnNil();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
luaFunc(avatar_isBlockSinging)
|
||||||
|
{
|
||||||
|
luaReturnBool(dsq->game->avatar->isBlockSinging());
|
||||||
|
}
|
||||||
|
|
||||||
luaFunc(avatar_fallOffWall)
|
luaFunc(avatar_fallOffWall)
|
||||||
{
|
{
|
||||||
dsq->game->avatar->fallOffWall();
|
dsq->game->avatar->fallOffWall();
|
||||||
|
@ -2726,6 +2850,16 @@ luaFunc(avatar_isShieldActive)
|
||||||
luaReturnBool(v);
|
luaReturnBool(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
luaFunc(avatar_setShieldActive)
|
||||||
|
{
|
||||||
|
bool on = getBool(L, 1);
|
||||||
|
if (on)
|
||||||
|
dsq->game->avatar->activateAura(AURA_SHIELD);
|
||||||
|
else
|
||||||
|
dsq->game->avatar->stopAura();
|
||||||
|
luaReturnNil();
|
||||||
|
}
|
||||||
|
|
||||||
luaFunc(avatar_getStillTimer)
|
luaFunc(avatar_getStillTimer)
|
||||||
{
|
{
|
||||||
luaReturnNum(dsq->game->avatar->stillTimer.getValue());
|
luaReturnNum(dsq->game->avatar->stillTimer.getValue());
|
||||||
|
@ -3741,6 +3875,12 @@ luaFunc(setSceneColor)
|
||||||
luaReturnNil();
|
luaReturnNil();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
luaFunc(getSceneColor)
|
||||||
|
{
|
||||||
|
const Vector& c = dsq->game->sceneColor3;
|
||||||
|
luaReturnVec3(c.x, c.y, c.z);
|
||||||
|
}
|
||||||
|
|
||||||
luaFunc(setCameraLerpDelay)
|
luaFunc(setCameraLerpDelay)
|
||||||
{
|
{
|
||||||
dsq->game->cameraLerpDelay = lua_tonumber(L, 1);
|
dsq->game->cameraLerpDelay = lua_tonumber(L, 1);
|
||||||
|
@ -4577,6 +4717,18 @@ luaFunc(entity_getDistanceToTarget)
|
||||||
luaReturnNum(dist);
|
luaReturnNum(dist);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
luaFunc(entity_getDistanceToPoint)
|
||||||
|
{
|
||||||
|
Entity *e = entity(L);
|
||||||
|
float dist = 0;
|
||||||
|
if (e)
|
||||||
|
{
|
||||||
|
Vector p(lua_tonumber(L, 2), lua_tonumber(L, 3));
|
||||||
|
dist = (p - e->position).getLength2D();
|
||||||
|
}
|
||||||
|
luaReturnNum(dist);
|
||||||
|
}
|
||||||
|
|
||||||
luaFunc(entity_watchEntity)
|
luaFunc(entity_watchEntity)
|
||||||
{
|
{
|
||||||
Entity *e = entity(L);
|
Entity *e = entity(L);
|
||||||
|
@ -4731,6 +4883,15 @@ luaFunc(createQuad)
|
||||||
luaReturnPtr(q);
|
luaReturnPtr(q);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
luaFunc(quad_setPauseLevel)
|
||||||
|
{
|
||||||
|
Quad *q = getQuad(L);
|
||||||
|
ENSURE_TYPE(q, SCO_PAUSEQUAD);
|
||||||
|
if (q)
|
||||||
|
((PauseQuad*)q)->pauseLevel = lua_tointeger(L, 2);
|
||||||
|
luaReturnNil();
|
||||||
|
}
|
||||||
|
|
||||||
luaFunc(setupEntity)
|
luaFunc(setupEntity)
|
||||||
{
|
{
|
||||||
ScriptedEntity *se = scriptedEntity(L);
|
ScriptedEntity *se = scriptedEntity(L);
|
||||||
|
@ -5045,6 +5206,12 @@ luaFunc(entity_setMaxSpeedLerp)
|
||||||
luaReturnNil();
|
luaReturnNil();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
luaFunc(entity_getMaxSpeedLerp)
|
||||||
|
{
|
||||||
|
Entity *e = entity(L);
|
||||||
|
luaReturnNum(e ? e->maxSpeedLerp.x : 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
// note: this is a weaker setState than perform
|
// note: this is a weaker setState than perform
|
||||||
// this is so that things can override it
|
// this is so that things can override it
|
||||||
// for example getting PUSH-ed (Force) or FROZEN (bubbled)
|
// for example getting PUSH-ed (Force) or FROZEN (bubbled)
|
||||||
|
@ -5217,6 +5384,12 @@ luaFunc(entity_setDeathScene)
|
||||||
luaReturnNil();
|
luaReturnNil();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
luaFunc(entity_isDeathScene)
|
||||||
|
{
|
||||||
|
Entity *e = entity(L);
|
||||||
|
luaReturnBool(e ? e->isDeathScene() : false);
|
||||||
|
}
|
||||||
|
|
||||||
luaFunc(entity_setCurrentTarget)
|
luaFunc(entity_setCurrentTarget)
|
||||||
{
|
{
|
||||||
Entity *e = entity(L);
|
Entity *e = entity(L);
|
||||||
|
@ -6155,6 +6328,12 @@ luaFunc(entity_getDistanceToEntity)
|
||||||
luaReturnNum(d);
|
luaReturnNum(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
luaFunc(entity_isEntityInside)
|
||||||
|
{
|
||||||
|
Entity *e = entity(L);
|
||||||
|
luaReturnBool(e ? e->isEntityInside() : false);
|
||||||
|
}
|
||||||
|
|
||||||
// entity_istargetInRange
|
// entity_istargetInRange
|
||||||
luaFunc(entity_isTargetInRange)
|
luaFunc(entity_isTargetInRange)
|
||||||
{
|
{
|
||||||
|
@ -6559,6 +6738,20 @@ luaFunc(entity_getNearestEntity)
|
||||||
luaReturnPtr(closest);
|
luaReturnPtr(closest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
luaFunc(getNearestEntity)
|
||||||
|
{
|
||||||
|
Vector p(lua_tonumber(L, 1), lua_tonumber(L, 2));
|
||||||
|
int radius = lua_tointeger(L, 3);
|
||||||
|
Entity *ignore = lua_isuserdata(L, 4) ? entity(L, 4) : NULL;
|
||||||
|
EntityType et = lua_isnumber(L, 5) ? (EntityType)lua_tointeger(L, 5) : ET_NOTYPE;
|
||||||
|
DamageType dt = lua_isnumber(L, 6) ? (DamageType)lua_tointeger(L, 6) : DT_NONE;
|
||||||
|
int lrStart = lua_isnumber(L, 7) ? lua_tointeger(L, 7) : -1;
|
||||||
|
int lrEnd = lua_isnumber(L, 8) ? lua_tointeger(L, 8) : -1;
|
||||||
|
|
||||||
|
Entity *target = dsq->game->getNearestEntity(p, radius, ignore, ET_ENEMY, dt, lrStart, lrEnd);
|
||||||
|
luaReturnPtr(target);
|
||||||
|
}
|
||||||
|
|
||||||
luaFunc(findWall)
|
luaFunc(findWall)
|
||||||
{
|
{
|
||||||
int x = lua_tonumber(L, 1);
|
int x = lua_tonumber(L, 1);
|
||||||
|
@ -7062,21 +7255,21 @@ luaFunc(getMouseWorldPos)
|
||||||
|
|
||||||
luaFunc(fade)
|
luaFunc(fade)
|
||||||
{
|
{
|
||||||
dsq->overlay->color = Vector(lua_tonumber(L, 3), lua_tonumber(L, 4), lua_tonumber(L, 5));
|
dsq->overlay->color.interpolateTo(Vector(lua_tonumber(L, 3), lua_tonumber(L, 4), lua_tonumber(L, 5)), lua_tonumber(L, 6));
|
||||||
dsq->overlay->alpha.interpolateTo(lua_tonumber(L, 1), lua_tonumber(L, 2));
|
dsq->overlay->alpha.interpolateTo(lua_tonumber(L, 1), lua_tonumber(L, 2));
|
||||||
luaReturnNil();
|
luaReturnNil();
|
||||||
}
|
}
|
||||||
|
|
||||||
luaFunc(fade2)
|
luaFunc(fade2)
|
||||||
{
|
{
|
||||||
dsq->overlay2->color = Vector(lua_tonumber(L, 3), lua_tonumber(L, 4), lua_tonumber(L, 5));
|
dsq->overlay2->color.interpolateTo(Vector(lua_tonumber(L, 3), lua_tonumber(L, 4), lua_tonumber(L, 5)), lua_tonumber(L, 6));
|
||||||
dsq->overlay2->alpha.interpolateTo(lua_tonumber(L, 1), lua_tonumber(L, 2));
|
dsq->overlay2->alpha.interpolateTo(lua_tonumber(L, 1), lua_tonumber(L, 2));
|
||||||
luaReturnNil();
|
luaReturnNil();
|
||||||
}
|
}
|
||||||
|
|
||||||
luaFunc(fade3)
|
luaFunc(fade3)
|
||||||
{
|
{
|
||||||
dsq->overlay3->color = Vector(lua_tonumber(L, 3), lua_tonumber(L, 4), lua_tonumber(L, 5));
|
dsq->overlay3->color.interpolateTo(Vector(lua_tonumber(L, 3), lua_tonumber(L, 4), lua_tonumber(L, 5)), lua_tonumber(L, 6));
|
||||||
dsq->overlay3->alpha.interpolateTo(lua_tonumber(L, 1), lua_tonumber(L, 2));
|
dsq->overlay3->alpha.interpolateTo(lua_tonumber(L, 1), lua_tonumber(L, 2));
|
||||||
luaReturnNil();
|
luaReturnNil();
|
||||||
}
|
}
|
||||||
|
@ -7504,6 +7697,70 @@ luaFunc(text_setWidth)
|
||||||
luaReturnNil();
|
luaReturnNil();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
luaFunc(loadShader)
|
||||||
|
{
|
||||||
|
const char *vertRaw = getCString(L, 1);
|
||||||
|
const char *fragRaw = getCString(L, 2);
|
||||||
|
std::string vert, frag;
|
||||||
|
if(vertRaw)
|
||||||
|
findFile_helper(vertRaw, vert);
|
||||||
|
if(fragRaw)
|
||||||
|
findFile_helper(fragRaw, frag);
|
||||||
|
Shader *sh = new Shader();
|
||||||
|
sh->load(vert, frag);
|
||||||
|
if(!sh->isLoaded())
|
||||||
|
{
|
||||||
|
delete sh;
|
||||||
|
sh = NULL;
|
||||||
|
}
|
||||||
|
luaReturnPtr(sh);
|
||||||
|
}
|
||||||
|
|
||||||
|
luaFunc(createShader)
|
||||||
|
{
|
||||||
|
Shader *sh = new Shader();
|
||||||
|
sh->loadSrc(getCString(L, 1), getCString(L, 2));
|
||||||
|
if(!sh->isLoaded())
|
||||||
|
{
|
||||||
|
delete sh;
|
||||||
|
sh = NULL;
|
||||||
|
}
|
||||||
|
luaReturnPtr(sh);
|
||||||
|
}
|
||||||
|
|
||||||
|
luaFunc(shader_setAsAfterEffect)
|
||||||
|
{
|
||||||
|
core->afterEffectManager->scriptShader = lua_isuserdata(L, 1) ? getShader(L, 1) : NULL;
|
||||||
|
luaReturnNil();
|
||||||
|
}
|
||||||
|
|
||||||
|
luaFunc(shader_setInt)
|
||||||
|
{
|
||||||
|
Shader *sh = getShader(L, 1);
|
||||||
|
const char *name = getCString(L, 2);
|
||||||
|
if(sh && name)
|
||||||
|
sh->setInt(name, lua_tointeger(L, 3), lua_tointeger(L, 4), lua_tointeger(L, 5), lua_tointeger(L, 6));
|
||||||
|
luaReturnNil();
|
||||||
|
}
|
||||||
|
|
||||||
|
luaFunc(shader_setFloat)
|
||||||
|
{
|
||||||
|
Shader *sh = getShader(L, 1);
|
||||||
|
const char *name = getCString(L, 2);
|
||||||
|
if(sh && name)
|
||||||
|
sh->setFloat(name, lua_tonumber(L, 3), lua_tonumber(L, 4), lua_tonumber(L, 5), lua_tonumber(L, 6));
|
||||||
|
luaReturnNil();
|
||||||
|
}
|
||||||
|
|
||||||
|
luaFunc(shader_delete)
|
||||||
|
{
|
||||||
|
Shader *sh = getShader(L);
|
||||||
|
delete sh;
|
||||||
|
if(core->afterEffectManager->scriptShader == sh)
|
||||||
|
core->afterEffectManager->scriptShader = NULL;
|
||||||
|
luaReturnNil();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -7541,11 +7798,15 @@ static const struct {
|
||||||
luaRegister(getNoteName),
|
luaRegister(getNoteName),
|
||||||
|
|
||||||
luaRegister(getWorldType),
|
luaRegister(getWorldType),
|
||||||
|
luaRegister(setWorldType),
|
||||||
|
luaRegister(setWorldPaused),
|
||||||
|
luaRegister(isWorldPaused),
|
||||||
|
|
||||||
luaRegister(getWaterLevel),
|
luaRegister(getWaterLevel),
|
||||||
luaRegister(setWaterLevel),
|
luaRegister(setWaterLevel),
|
||||||
|
|
||||||
luaRegister(createQuad),
|
luaRegister(createQuad),
|
||||||
|
luaRegister(quad_setPauseLevel),
|
||||||
|
|
||||||
luaRegister(setupEntity),
|
luaRegister(setupEntity),
|
||||||
luaRegister(setActivePet),
|
luaRegister(setActivePet),
|
||||||
|
@ -7570,6 +7831,7 @@ static const struct {
|
||||||
luaRegister(entity_setBoneLock),
|
luaRegister(entity_setBoneLock),
|
||||||
luaRegister(entity_setIngredient),
|
luaRegister(entity_setIngredient),
|
||||||
luaRegister(entity_setDeathScene),
|
luaRegister(entity_setDeathScene),
|
||||||
|
luaRegister(entity_isDeathScene),
|
||||||
|
|
||||||
luaRegister(entity_setBeautyFlip),
|
luaRegister(entity_setBeautyFlip),
|
||||||
luaRegister(entity_setInvincible),
|
luaRegister(entity_setInvincible),
|
||||||
|
@ -7594,6 +7856,7 @@ static const struct {
|
||||||
luaRegister(entity_setEatType),
|
luaRegister(entity_setEatType),
|
||||||
|
|
||||||
luaRegister(entity_setSpiritFreeze),
|
luaRegister(entity_setSpiritFreeze),
|
||||||
|
luaRegister(node_setSpiritFreeze),
|
||||||
|
|
||||||
luaRegister(entity_setCanLeaveWater),
|
luaRegister(entity_setCanLeaveWater),
|
||||||
|
|
||||||
|
@ -7614,9 +7877,20 @@ static const struct {
|
||||||
|
|
||||||
|
|
||||||
luaRegister(avatar_setCanDie),
|
luaRegister(avatar_setCanDie),
|
||||||
|
luaRegister(setCanActivate),
|
||||||
|
luaRegister(setSeeMapMode),
|
||||||
luaRegister(avatar_toggleCape),
|
luaRegister(avatar_toggleCape),
|
||||||
luaRegister(avatar_setPullTarget),
|
luaRegister(avatar_setPullTarget),
|
||||||
|
|
||||||
|
luaRegister(avatar_setCanLockToWall),
|
||||||
|
luaRegister(avatar_canLockToWall),
|
||||||
|
luaRegister(avatar_setCanBurst),
|
||||||
|
luaRegister(avatar_canBurst),
|
||||||
|
luaRegister(avatar_setCanSwimAgainstCurrents),
|
||||||
|
luaRegister(avatar_canSwimAgainstCurrents),
|
||||||
|
luaRegister(avatar_setCanCollideWithShots),
|
||||||
|
luaRegister(avatar_canCollideWithShots),
|
||||||
|
luaRegister(avatar_setCollisionAvoidanceData),
|
||||||
|
|
||||||
luaRegister(avatar_clampPosition),
|
luaRegister(avatar_clampPosition),
|
||||||
luaRegister(avatar_updatePosition),
|
luaRegister(avatar_updatePosition),
|
||||||
|
@ -7721,6 +7995,7 @@ static const struct {
|
||||||
luaRegister(entity_getVectorToEntity),
|
luaRegister(entity_getVectorToEntity),
|
||||||
|
|
||||||
luaRegister(entity_getDistanceToTarget),
|
luaRegister(entity_getDistanceToTarget),
|
||||||
|
luaRegister(entity_getDistanceToPoint),
|
||||||
luaRegister(entity_move),
|
luaRegister(entity_move),
|
||||||
|
|
||||||
luaRegister(entity_getID),
|
luaRegister(entity_getID),
|
||||||
|
@ -7818,6 +8093,7 @@ static const struct {
|
||||||
|
|
||||||
luaRegister(entity_isTargetInRange),
|
luaRegister(entity_isTargetInRange),
|
||||||
luaRegister(entity_getDistanceToEntity),
|
luaRegister(entity_getDistanceToEntity),
|
||||||
|
luaRegister(entity_isEntityInside),
|
||||||
|
|
||||||
luaRegister(entity_isInvincible),
|
luaRegister(entity_isInvincible),
|
||||||
|
|
||||||
|
@ -7834,6 +8110,7 @@ static const struct {
|
||||||
luaRegister(entity_setMaxSpeed),
|
luaRegister(entity_setMaxSpeed),
|
||||||
luaRegister(entity_getMaxSpeed),
|
luaRegister(entity_getMaxSpeed),
|
||||||
luaRegister(entity_setMaxSpeedLerp),
|
luaRegister(entity_setMaxSpeedLerp),
|
||||||
|
luaRegister(entity_getMaxSpeedLerp),
|
||||||
luaRegister(entity_setState),
|
luaRegister(entity_setState),
|
||||||
luaRegister(entity_getState),
|
luaRegister(entity_getState),
|
||||||
luaRegister(entity_getEnqueuedState),
|
luaRegister(entity_getEnqueuedState),
|
||||||
|
@ -8024,10 +8301,12 @@ static const struct {
|
||||||
luaRegister(avatar_isRolling),
|
luaRegister(avatar_isRolling),
|
||||||
luaRegister(avatar_isOnWall),
|
luaRegister(avatar_isOnWall),
|
||||||
luaRegister(avatar_isShieldActive),
|
luaRegister(avatar_isShieldActive),
|
||||||
|
luaRegister(avatar_setShieldActive),
|
||||||
luaRegister(avatar_getRollDirection),
|
luaRegister(avatar_getRollDirection),
|
||||||
|
|
||||||
luaRegister(avatar_fallOffWall),
|
luaRegister(avatar_fallOffWall),
|
||||||
luaRegister(avatar_setBlockSinging),
|
luaRegister(avatar_setBlockSinging),
|
||||||
|
luaRegister(avatar_isBlockSinging),
|
||||||
|
|
||||||
|
|
||||||
luaRegister(avatar_toggleMovement),
|
luaRegister(avatar_toggleMovement),
|
||||||
|
@ -8223,7 +8502,7 @@ static const struct {
|
||||||
|
|
||||||
|
|
||||||
luaRegister(setSceneColor),
|
luaRegister(setSceneColor),
|
||||||
|
luaRegister(getSceneColor),
|
||||||
|
|
||||||
luaRegister(entity_watchEntity),
|
luaRegister(entity_watchEntity),
|
||||||
|
|
||||||
|
@ -8251,6 +8530,7 @@ static const struct {
|
||||||
|
|
||||||
luaRegister(entity_setTexture),
|
luaRegister(entity_setTexture),
|
||||||
luaRegister(entity_setFillGrid),
|
luaRegister(entity_setFillGrid),
|
||||||
|
luaRegister(entity_isFillGrid),
|
||||||
|
|
||||||
luaRegister(entity_push),
|
luaRegister(entity_push),
|
||||||
|
|
||||||
|
@ -8315,6 +8595,7 @@ static const struct {
|
||||||
|
|
||||||
luaRegister(entity_getNearestEntity),
|
luaRegister(entity_getNearestEntity),
|
||||||
luaRegister(entity_getNearestBoneToPosition),
|
luaRegister(entity_getNearestBoneToPosition),
|
||||||
|
luaRegister(getNearestEntity),
|
||||||
|
|
||||||
luaRegister(entity_getNearestNode),
|
luaRegister(entity_getNearestNode),
|
||||||
luaRegister(entity_setPoison),
|
luaRegister(entity_setPoison),
|
||||||
|
@ -8350,6 +8631,13 @@ static const struct {
|
||||||
luaRegister(text_setFontSize),
|
luaRegister(text_setFontSize),
|
||||||
luaRegister(text_setWidth),
|
luaRegister(text_setWidth),
|
||||||
|
|
||||||
|
luaRegister(loadShader),
|
||||||
|
luaRegister(createShader),
|
||||||
|
luaRegister(shader_setAsAfterEffect),
|
||||||
|
luaRegister(shader_setFloat),
|
||||||
|
luaRegister(shader_setInt),
|
||||||
|
luaRegister(shader_delete),
|
||||||
|
|
||||||
luaRegister(isQuad),
|
luaRegister(isQuad),
|
||||||
luaRegister(isNode),
|
luaRegister(isNode),
|
||||||
luaRegister(isObject),
|
luaRegister(isObject),
|
||||||
|
@ -9033,6 +9321,7 @@ static const struct {
|
||||||
luaConstant(DT_CRUSH),
|
luaConstant(DT_CRUSH),
|
||||||
luaConstant(DT_SPIKES),
|
luaConstant(DT_SPIKES),
|
||||||
luaConstant(DT_STEAM),
|
luaConstant(DT_STEAM),
|
||||||
|
luaConstant(DT_WALLHURT),
|
||||||
|
|
||||||
|
|
||||||
luaConstant(FRAME_TIME),
|
luaConstant(FRAME_TIME),
|
||||||
|
@ -9060,6 +9349,10 @@ static const struct {
|
||||||
luaConstant(OT_INVISIBLEIN),
|
luaConstant(OT_INVISIBLEIN),
|
||||||
luaConstant(OT_HURT),
|
luaConstant(OT_HURT),
|
||||||
luaConstant(OT_INVISIBLEENT),
|
luaConstant(OT_INVISIBLEENT),
|
||||||
|
|
||||||
|
luaConstant(SEE_MAP_NEVER),
|
||||||
|
luaConstant(SEE_MAP_DEFAULT),
|
||||||
|
luaConstant(SEE_MAP_ALWAYS),
|
||||||
};
|
};
|
||||||
|
|
||||||
//============================================================================================
|
//============================================================================================
|
||||||
|
|
|
@ -759,32 +759,6 @@ void ScriptedEntity::songNoteDone(int note, float len)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ScriptedEntity::isEntityInside()
|
|
||||||
{
|
|
||||||
bool v = false;
|
|
||||||
int avatars = 0;
|
|
||||||
FOR_ENTITIES(i)
|
|
||||||
{
|
|
||||||
Entity *e = *i;
|
|
||||||
if (e->getEntityType() == ET_AVATAR)
|
|
||||||
avatars ++;
|
|
||||||
if (e && e->life == 1 && e != this && e->ridingOnEntity != this)
|
|
||||||
{
|
|
||||||
if (isCoordinateInside(e->position))
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
Vector diff = (e->position - position);
|
|
||||||
diff.setLength2D(100);
|
|
||||||
e->vel += diff;
|
|
||||||
*/
|
|
||||||
v = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ScriptedEntity::becomeSolid()
|
void ScriptedEntity::becomeSolid()
|
||||||
{
|
{
|
||||||
//vel = 0;
|
//vel = 0;
|
||||||
|
|
|
@ -68,7 +68,6 @@ public:
|
||||||
typedef std::vector<Strand*> Strands;
|
typedef std::vector<Strand*> Strands;
|
||||||
Strands strands;
|
Strands strands;
|
||||||
int strandSpacing;
|
int strandSpacing;
|
||||||
bool isEntityInside();
|
|
||||||
void becomeSolid();
|
void becomeSolid();
|
||||||
|
|
||||||
std::string deathParticleEffect;
|
std::string deathParticleEffect;
|
||||||
|
|
|
@ -342,6 +342,7 @@ Shot::Shot() : Quad(), Segmented(0,0)
|
||||||
fired = false;
|
fired = false;
|
||||||
target = 0;
|
target = 0;
|
||||||
dead = false;
|
dead = false;
|
||||||
|
enqueuedForDelete = false;
|
||||||
shotIdx = shots.size();
|
shotIdx = shots.size();
|
||||||
shots.push_back(this);
|
shots.push_back(this);
|
||||||
}
|
}
|
||||||
|
@ -487,7 +488,6 @@ void Shot::setLifeTime(float l)
|
||||||
void Shot::onEndOfLife()
|
void Shot::onEndOfLife()
|
||||||
{
|
{
|
||||||
destroySegments(0.2);
|
destroySegments(0.2);
|
||||||
deleteShots.push_back(this);
|
|
||||||
dead = true;
|
dead = true;
|
||||||
|
|
||||||
if (emitter)
|
if (emitter)
|
||||||
|
@ -495,6 +495,12 @@ void Shot::onEndOfLife()
|
||||||
emitter->killParticleEffect();
|
emitter->killParticleEffect();
|
||||||
emitter = 0;
|
emitter = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!enqueuedForDelete)
|
||||||
|
{
|
||||||
|
enqueuedForDelete = true;
|
||||||
|
deleteShots.push_back(this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Shot::doHitEffects()
|
void Shot::doHitEffects()
|
||||||
|
@ -778,7 +784,7 @@ bool Shot::isObstructed(float dt) const
|
||||||
void Shot::onUpdate(float dt)
|
void Shot::onUpdate(float dt)
|
||||||
{
|
{
|
||||||
if (dsq->game->isPaused()) return;
|
if (dsq->game->isPaused()) return;
|
||||||
if (dsq->continuity.getWorldType() != WT_NORMAL) return;
|
if (dsq->game->isWorldPaused()) return;
|
||||||
if (!shotData) return;
|
if (!shotData) return;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -128,7 +128,6 @@ public:
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
float waveTimer;
|
float waveTimer;
|
||||||
bool fired;
|
|
||||||
|
|
||||||
void suicide();
|
void suicide();
|
||||||
|
|
||||||
|
@ -141,6 +140,8 @@ protected:
|
||||||
void onEndOfLife();
|
void onEndOfLife();
|
||||||
|
|
||||||
bool dead;
|
bool dead;
|
||||||
|
bool fired;
|
||||||
|
bool enqueuedForDelete;
|
||||||
void onUpdate(float dt);
|
void onUpdate(float dt);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -41,7 +41,7 @@ void SteamRender::onUpdate(float dt)
|
||||||
void SteamRender::onRender()
|
void SteamRender::onRender()
|
||||||
{
|
{
|
||||||
#ifdef BBGE_BUILD_OPENGL
|
#ifdef BBGE_BUILD_OPENGL
|
||||||
glDisable(GL_CULL_FACE);
|
//glDisable(GL_CULL_FACE);
|
||||||
//int qs = 0;
|
//int qs = 0;
|
||||||
|
|
||||||
for (Path *p = dsq->game->getFirstPathOfType(PATH_STEAM); p; p = p->nextOfType)
|
for (Path *p = dsq->game->getFirstPathOfType(PATH_STEAM); p; p = p->nextOfType)
|
||||||
|
@ -121,7 +121,7 @@ void SteamRender::onRender()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
glEnable(GL_CULL_FACE);
|
//glEnable(GL_CULL_FACE);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -150,7 +150,7 @@ void Web::onRender()
|
||||||
//glDisable(GL_BLEND);
|
//glDisable(GL_BLEND);
|
||||||
|
|
||||||
glLineWidth(4);
|
glLineWidth(4);
|
||||||
glDisable(GL_CULL_FACE);
|
//glDisable(GL_CULL_FACE);
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
|
||||||
glBegin(GL_LINES);
|
glBegin(GL_LINES);
|
||||||
|
|
|
@ -266,9 +266,9 @@ protected:
|
||||||
q->setBlendType(BLEND_ADD);
|
q->setBlendType(BLEND_ADD);
|
||||||
addChild(q, PM_POINTER);
|
addChild(q, PM_POINTER);
|
||||||
|
|
||||||
std::ostringstream os;
|
//std::ostringstream os;
|
||||||
os << "children: " << children.size();
|
//os << "children: " << children.size();
|
||||||
debugLog(os.str());
|
//debugLog(os.str());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -35,6 +35,7 @@ AfterEffectManager::AfterEffectManager(int xDivs, int yDivs)
|
||||||
activeShader = AS_NONE;
|
activeShader = AS_NONE;
|
||||||
numEffects = 0;
|
numEffects = 0;
|
||||||
bRenderGridPoints = true;
|
bRenderGridPoints = true;
|
||||||
|
scriptShader = 0;
|
||||||
|
|
||||||
screenWidth = core->getWindowWidth();
|
screenWidth = core->getWindowWidth();
|
||||||
screenHeight = core->getWindowHeight();
|
screenHeight = core->getWindowHeight();
|
||||||
|
@ -245,6 +246,7 @@ void AfterEffectManager::setActiveShader(ActiveShader as)
|
||||||
activeShader = as;
|
activeShader = as;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void AfterEffectManager::renderGrid()
|
void AfterEffectManager::renderGrid()
|
||||||
{
|
{
|
||||||
#ifdef BBGE_BUILD_OPENGL
|
#ifdef BBGE_BUILD_OPENGL
|
||||||
|
@ -278,11 +280,21 @@ void AfterEffectManager::renderGrid()
|
||||||
activeShader = &glowShader;
|
activeShader = &glowShader;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(scriptShader)
|
||||||
|
activeShader = scriptShader;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (activeShader)
|
if (activeShader)
|
||||||
|
{
|
||||||
|
//while(glGetError() != GL_NO_ERROR) {}
|
||||||
|
|
||||||
activeShader->bind();
|
activeShader->bind();
|
||||||
|
|
||||||
|
activeShader->setInt("tex", 0);
|
||||||
|
}
|
||||||
|
|
||||||
screenWidth = core->getWindowWidth();
|
screenWidth = core->getWindowWidth();
|
||||||
screenHeight = core->getWindowHeight();
|
screenHeight = core->getWindowHeight();
|
||||||
|
|
||||||
|
|
|
@ -125,6 +125,7 @@ public:
|
||||||
int textureWidth, textureHeight;
|
int textureWidth, textureHeight;
|
||||||
|
|
||||||
Shader blurShader, bwShader, washoutShader, motionBlurShader, glowShader;
|
Shader blurShader, bwShader, washoutShader, motionBlurShader, glowShader;
|
||||||
|
Shader *scriptShader;
|
||||||
|
|
||||||
Vector ** drawGrid;
|
Vector ** drawGrid;
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
#define BBGE_BUILD_SDL 1
|
#define BBGE_BUILD_SDL 1
|
||||||
#define BBGE_BUILD_FRAMEBUFFER 1
|
#define BBGE_BUILD_FRAMEBUFFER 1
|
||||||
//#define BBGE_BUILD_SHADERS 1
|
#define BBGE_BUILD_SHADERS 1
|
||||||
#define BBGE_BUILD_OPENGL 1
|
#define BBGE_BUILD_OPENGL 1
|
||||||
#define BBGE_BUILD_OPENGL_DYNAMIC 1
|
#define BBGE_BUILD_OPENGL_DYNAMIC 1
|
||||||
#define BBGE_BUILD_FMOD_OPENAL_BRIDGE 1
|
#define BBGE_BUILD_FMOD_OPENAL_BRIDGE 1
|
||||||
|
|
|
@ -301,7 +301,7 @@ bool exists(const std::string &f, bool makeFatal, bool skipVFS)
|
||||||
void drawCircle(float radius, int stepSize)
|
void drawCircle(float radius, int stepSize)
|
||||||
{
|
{
|
||||||
#ifdef BBGE_BUILD_OPENGL
|
#ifdef BBGE_BUILD_OPENGL
|
||||||
glDisable(GL_CULL_FACE);
|
//glDisable(GL_CULL_FACE);
|
||||||
|
|
||||||
glBegin(GL_POLYGON);
|
glBegin(GL_POLYGON);
|
||||||
{
|
{
|
||||||
|
@ -312,7 +312,7 @@ void drawCircle(float radius, int stepSize)
|
||||||
}
|
}
|
||||||
glEnd();
|
glEnd();
|
||||||
|
|
||||||
glEnable(GL_CULL_FACE);
|
//glEnable(GL_CULL_FACE);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -317,7 +317,7 @@ void BitmapText::onRender()
|
||||||
glEnable(GL_BLEND);
|
glEnable(GL_BLEND);
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
*/
|
*/
|
||||||
glDisable(GL_CULL_FACE);
|
//glDisable(GL_CULL_FACE);
|
||||||
|
|
||||||
//glScalef(1, -1, 0);
|
//glScalef(1, -1, 0);
|
||||||
|
|
||||||
|
@ -374,7 +374,7 @@ void BitmapText::onRender()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
glEnable(GL_CULL_FACE);
|
//glEnable(GL_CULL_FACE);
|
||||||
glBindTexture(GL_TEXTURE_2D, 0);
|
glBindTexture(GL_TEXTURE_2D, 0);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1840,11 +1840,13 @@ void Core::setSDLGLAttributes()
|
||||||
#define GLAPIENTRY
|
#define GLAPIENTRY
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
unsigned int Core::dbg_numRenderCalls = 0;
|
||||||
|
|
||||||
#ifdef BBGE_BUILD_OPENGL_DYNAMIC
|
#ifdef BBGE_BUILD_OPENGL_DYNAMIC
|
||||||
#define GL_FUNC(ret,fn,params,call,rt) \
|
#define GL_FUNC(ret,fn,params,call,rt) \
|
||||||
extern "C" { \
|
extern "C" { \
|
||||||
static ret (GLAPIENTRY *p##fn) params = NULL; \
|
static ret (GLAPIENTRY *p##fn) params = NULL; \
|
||||||
ret GLAPIENTRY fn params { rt p##fn call; } \
|
ret GLAPIENTRY fn params { ++Core::dbg_numRenderCalls; rt p##fn call; } \
|
||||||
}
|
}
|
||||||
#include "OpenGLStubs.h"
|
#include "OpenGLStubs.h"
|
||||||
#undef GL_FUNC
|
#undef GL_FUNC
|
||||||
|
@ -3006,6 +3008,8 @@ void Core::main(float runTime)
|
||||||
|
|
||||||
updateCullData();
|
updateCullData();
|
||||||
|
|
||||||
|
dbg_numRenderCalls = 0;
|
||||||
|
|
||||||
if (settings.renderOn)
|
if (settings.renderOn)
|
||||||
{
|
{
|
||||||
if (verbose) debugLog("dark layer prerender");
|
if (verbose) debugLog("dark layer prerender");
|
||||||
|
|
|
@ -1310,6 +1310,7 @@ public:
|
||||||
int zgaSave(const char *filename, short int width, short int height, unsigned char pixelDepth, unsigned char *imageData);
|
int zgaSave(const char *filename, short int width, short int height, unsigned char pixelDepth, unsigned char *imageData);
|
||||||
|
|
||||||
volatile int dbg_numThreadDecoders;
|
volatile int dbg_numThreadDecoders;
|
||||||
|
static unsigned int dbg_numRenderCalls;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
|
|
@ -306,7 +306,7 @@ void Emitter::onRender()
|
||||||
|
|
||||||
if (data.flipH || (data.copyParentFlip && (pe->isfh() || (pe->getParent() && pe->getParent()->isfh()))))
|
if (data.flipH || (data.copyParentFlip && (pe->isfh() || (pe->getParent() && pe->getParent()->isfh()))))
|
||||||
{
|
{
|
||||||
glDisable(GL_CULL_FACE);
|
//glDisable(GL_CULL_FACE);
|
||||||
glRotatef(180, 0, 1, 0);
|
glRotatef(180, 0, 1, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -499,7 +499,7 @@ void Quad::onRender()
|
||||||
if (!strip.empty())
|
if (!strip.empty())
|
||||||
{
|
{
|
||||||
//glDisable(GL_BLEND);gggg
|
//glDisable(GL_BLEND);gggg
|
||||||
glDisable(GL_CULL_FACE);
|
//glDisable(GL_CULL_FACE);
|
||||||
|
|
||||||
const float texBits = 1.0f / (strip.size()-1);
|
const float texBits = 1.0f / (strip.size()-1);
|
||||||
|
|
||||||
|
@ -517,7 +517,7 @@ void Quad::onRender()
|
||||||
}
|
}
|
||||||
glEnd();
|
glEnd();
|
||||||
|
|
||||||
glEnable(GL_CULL_FACE);
|
//glEnable(GL_CULL_FACE);
|
||||||
glBindTexture( GL_TEXTURE_2D, 0 );
|
glBindTexture( GL_TEXTURE_2D, 0 );
|
||||||
glColor4f(1,0,0,1);
|
glColor4f(1,0,0,1);
|
||||||
glPointSize(64);
|
glPointSize(64);
|
||||||
|
@ -802,6 +802,7 @@ void Quad::onSetTexture()
|
||||||
|
|
||||||
PauseQuad::PauseQuad() : Quad(), pauseLevel(0)
|
PauseQuad::PauseQuad() : Quad(), pauseLevel(0)
|
||||||
{
|
{
|
||||||
|
addType(SCO_PAUSEQUAD);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PauseQuad::onUpdate(float dt)
|
void PauseQuad::onUpdate(float dt)
|
||||||
|
|
|
@ -59,7 +59,7 @@ void QuadTrail::onRender()
|
||||||
if (numPoints < 2) return;
|
if (numPoints < 2) return;
|
||||||
|
|
||||||
#ifdef BBGE_BUILD_OPENGL
|
#ifdef BBGE_BUILD_OPENGL
|
||||||
glDisable(GL_CULL_FACE);
|
//glDisable(GL_CULL_FACE);
|
||||||
int c = 0;
|
int c = 0;
|
||||||
Vector p, diff, dl, dr;
|
Vector p, diff, dl, dr;
|
||||||
Vector lastPoint;
|
Vector lastPoint;
|
||||||
|
|
|
@ -629,7 +629,7 @@ void RenderObject::renderCall()
|
||||||
glTranslatef(position.x, position.y, position.z);
|
glTranslatef(position.x, position.y, position.z);
|
||||||
if (isfh())
|
if (isfh())
|
||||||
{
|
{
|
||||||
glDisable(GL_CULL_FACE);
|
//glDisable(GL_CULL_FACE);
|
||||||
glRotatef(180, 0, 1, 0);
|
glRotatef(180, 0, 1, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -655,7 +655,7 @@ void RenderObject::renderCall()
|
||||||
glTranslatef(pos.x, pos.y, pos.z);
|
glTranslatef(pos.x, pos.y, pos.z);
|
||||||
if (isfh())
|
if (isfh())
|
||||||
{
|
{
|
||||||
glDisable(GL_CULL_FACE);
|
//glDisable(GL_CULL_FACE);
|
||||||
glRotatef(180, 0, 1, 0);
|
glRotatef(180, 0, 1, 0);
|
||||||
}
|
}
|
||||||
glRotatef(rotation.z+rotationOffset.z, 0, 0, 1);
|
glRotatef(rotation.z+rotationOffset.z, 0, 0, 1);
|
||||||
|
@ -714,7 +714,7 @@ void RenderObject::renderCall()
|
||||||
glRotatef(rotation.z+rotationOffset.z, 0, 0, 1);
|
glRotatef(rotation.z+rotationOffset.z, 0, 0, 1);
|
||||||
if (isfh())
|
if (isfh())
|
||||||
{
|
{
|
||||||
glDisable(GL_CULL_FACE);
|
//glDisable(GL_CULL_FACE);
|
||||||
glRotatef(180, 0, 1, 0);
|
glRotatef(180, 0, 1, 0);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -105,7 +105,7 @@ void RoundedRect::onRender()
|
||||||
//glBindTexture(GL_TEXTURE_2D, 0);
|
//glBindTexture(GL_TEXTURE_2D, 0);
|
||||||
int w2 = width/2;
|
int w2 = width/2;
|
||||||
int h2 = height/2;
|
int h2 = height/2;
|
||||||
glDisable(GL_CULL_FACE);
|
//glDisable(GL_CULL_FACE);
|
||||||
float iter = 0.1f;
|
float iter = 0.1f;
|
||||||
|
|
||||||
glBegin(GL_QUADS);
|
glBegin(GL_QUADS);
|
||||||
|
@ -167,7 +167,7 @@ void RoundedRect::onRender()
|
||||||
|
|
||||||
glEnd();
|
glEnd();
|
||||||
|
|
||||||
glEnable(GL_CULL_FACE);
|
//glEnable(GL_CULL_FACE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RoundedRect::show()
|
void RoundedRect::show()
|
||||||
|
|
|
@ -37,6 +37,8 @@ static const char *scriptObjTypeNames[] =
|
||||||
/* (1 << 9) */ "Path/Node",
|
/* (1 << 9) */ "Path/Node",
|
||||||
/* (1 <<10) */ "Quad",
|
/* (1 <<10) */ "Quad",
|
||||||
/* (1 <<11) */ "Text",
|
/* (1 <<11) */ "Text",
|
||||||
|
/* (1 <<12) */ "PauseQuad",
|
||||||
|
/* (1 <<13) */ "Shader",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -39,6 +39,8 @@ enum ScriptObjectType
|
||||||
SCO_PATH = 0x0200,
|
SCO_PATH = 0x0200,
|
||||||
SCO_QUAD = 0x0400,
|
SCO_QUAD = 0x0400,
|
||||||
SCO_TEXT = 0x0800,
|
SCO_TEXT = 0x0800,
|
||||||
|
SCO_PAUSEQUAD = 0x1000,
|
||||||
|
SCO_SHADER = 0x2000,
|
||||||
|
|
||||||
SCO_FORCE_32BIT = 0xFFFFFFFF
|
SCO_FORCE_32BIT = 0xFFFFFFFF
|
||||||
};
|
};
|
||||||
|
|
516
BBGE/Shader.cpp
516
BBGE/Shader.cpp
|
@ -18,10 +18,9 @@ You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
||||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "Shader.h"
|
#include "Shader.h"
|
||||||
#ifdef BBGE_BUILD_WINDOWS
|
#include "algorithmx.h"
|
||||||
#include <sys/stat.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef BBGE_BUILD_SHADERS
|
#ifdef BBGE_BUILD_SHADERS
|
||||||
// GL_ARB_shader_objects
|
// GL_ARB_shader_objects
|
||||||
|
@ -36,8 +35,16 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
PFNGLGETINFOLOGARBPROC glGetInfoLogARB = NULL;
|
PFNGLGETINFOLOGARBPROC glGetInfoLogARB = NULL;
|
||||||
PFNGLLINKPROGRAMARBPROC glLinkProgramARB = NULL;
|
PFNGLLINKPROGRAMARBPROC glLinkProgramARB = NULL;
|
||||||
PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB = NULL;
|
PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB = NULL;
|
||||||
PFNGLUNIFORM4FARBPROC glUniform4fARB = NULL;
|
PFNGLGETACTIVEUNIFORMARBPROC glGetActiveUniformARB = NULL;
|
||||||
PFNGLUNIFORM1IARBPROC glUniform1iARB = NULL;
|
PFNGLUNIFORM1FVARBPROC glUniform1fvARB = NULL;
|
||||||
|
PFNGLUNIFORM2FVARBPROC glUniform2fvARB = NULL;
|
||||||
|
PFNGLUNIFORM3FVARBPROC glUniform3fvARB = NULL;
|
||||||
|
PFNGLUNIFORM4FVARBPROC glUniform4fvARB = NULL;
|
||||||
|
PFNGLUNIFORM1IVARBPROC glUniform1ivARB = NULL;
|
||||||
|
PFNGLUNIFORM2IVARBPROC glUniform2ivARB = NULL;
|
||||||
|
PFNGLUNIFORM3IVARBPROC glUniform3ivARB = NULL;
|
||||||
|
PFNGLUNIFORM4IVARBPROC glUniform4ivARB = NULL;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool Shader::_wasInited = false;
|
bool Shader::_wasInited = false;
|
||||||
|
@ -73,22 +80,6 @@ void Shader::staticInit()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
#ifdef BBGE_BUILD_GLFW
|
|
||||||
glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)glfwGetProcAddress("glCreateProgramObjectARB");
|
|
||||||
glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC)glfwGetProcAddress("glDeleteObjectARB");
|
|
||||||
glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)glfwGetProcAddress("glUseProgramObjectARB");
|
|
||||||
glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)glfwGetProcAddress("glCreateShaderObjectARB");
|
|
||||||
glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)glfwGetProcAddress("glShaderSourceARB");
|
|
||||||
glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)glfwGetProcAddress("glCompileShaderARB");
|
|
||||||
glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)glfwGetProcAddress("glGetObjectParameterivARB");
|
|
||||||
glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)glfwGetProcAddress("glAttachObjectARB");
|
|
||||||
glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC)glfwGetProcAddress("glGetInfoLogARB");
|
|
||||||
glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)glfwGetProcAddress("glLinkProgramARB");
|
|
||||||
glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)glfwGetProcAddress("glGetUniformLocationARB");
|
|
||||||
glUniform4fARB = (PFNGLUNIFORM4FARBPROC)glfwGetProcAddress("glUniform4fARB");
|
|
||||||
glUniform1iARB = (PFNGLUNIFORM1IARBPROC)glfwGetProcAddress("glUniform1iARB");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef BBGE_BUILD_SDL
|
#ifdef BBGE_BUILD_SDL
|
||||||
glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)SDL_GL_GetProcAddress("glCreateProgramObjectARB");
|
glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)SDL_GL_GetProcAddress("glCreateProgramObjectARB");
|
||||||
glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC)SDL_GL_GetProcAddress("glDeleteObjectARB");
|
glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC)SDL_GL_GetProcAddress("glDeleteObjectARB");
|
||||||
|
@ -101,15 +92,23 @@ void Shader::staticInit()
|
||||||
glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC)SDL_GL_GetProcAddress("glGetInfoLogARB");
|
glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC)SDL_GL_GetProcAddress("glGetInfoLogARB");
|
||||||
glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)SDL_GL_GetProcAddress("glLinkProgramARB");
|
glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)SDL_GL_GetProcAddress("glLinkProgramARB");
|
||||||
glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)SDL_GL_GetProcAddress("glGetUniformLocationARB");
|
glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)SDL_GL_GetProcAddress("glGetUniformLocationARB");
|
||||||
glUniform4fARB = (PFNGLUNIFORM4FARBPROC)SDL_GL_GetProcAddress("glUniform4fARB");
|
glGetActiveUniformARB = (PFNGLGETACTIVEUNIFORMARBPROC)SDL_GL_GetProcAddress("glGetActiveUniformARB");
|
||||||
glUniform1iARB = (PFNGLUNIFORM1IARBPROC)SDL_GL_GetProcAddress("glUniform1iARB");
|
glUniform1fvARB = (PFNGLUNIFORM1FVARBPROC)SDL_GL_GetProcAddress("glUniform1fvARB");
|
||||||
|
glUniform2fvARB = (PFNGLUNIFORM2FVARBPROC)SDL_GL_GetProcAddress("glUniform2fvARB");
|
||||||
|
glUniform3fvARB = (PFNGLUNIFORM3FVARBPROC)SDL_GL_GetProcAddress("glUniform3fvARB");
|
||||||
|
glUniform4fvARB = (PFNGLUNIFORM4FVARBPROC)SDL_GL_GetProcAddress("glUniform4fvARB");
|
||||||
|
glUniform1ivARB = (PFNGLUNIFORM1IVARBPROC)SDL_GL_GetProcAddress("glUniform1ivARB");
|
||||||
|
glUniform2ivARB = (PFNGLUNIFORM2IVARBPROC)SDL_GL_GetProcAddress("glUniform2ivARB");
|
||||||
|
glUniform3ivARB = (PFNGLUNIFORM3IVARBPROC)SDL_GL_GetProcAddress("glUniform3ivARB");
|
||||||
|
glUniform4ivARB = (PFNGLUNIFORM4IVARBPROC)SDL_GL_GetProcAddress("glUniform4ivARB");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if( !glCreateProgramObjectARB || !glDeleteObjectARB || !glUseProgramObjectARB ||
|
if( !glCreateProgramObjectARB || !glDeleteObjectARB || !glUseProgramObjectARB ||
|
||||||
!glCreateShaderObjectARB || !glCreateShaderObjectARB || !glCompileShaderARB ||
|
!glCreateShaderObjectARB || !glCreateShaderObjectARB || !glCompileShaderARB ||
|
||||||
!glGetObjectParameterivARB || !glAttachObjectARB || !glGetInfoLogARB ||
|
!glGetObjectParameterivARB || !glAttachObjectARB || !glGetInfoLogARB ||
|
||||||
!glLinkProgramARB || !glGetUniformLocationARB || !glUniform4fARB ||
|
!glLinkProgramARB || !glGetUniformLocationARB || !glGetActiveUniformARB ||
|
||||||
!glUniform1iARB )
|
!glUniform1fvARB || !glUniform2fvARB || !glUniform3fvARB || !glUniform4fvARB ||
|
||||||
|
!glUniform1ivARB || !glUniform2ivARB || !glUniform3ivARB || !glUniform4ivARB)
|
||||||
{
|
{
|
||||||
glCreateProgramObjectARB = 0;
|
glCreateProgramObjectARB = 0;
|
||||||
debugLog("One or more GL_ARB_shader_objects functions were not found");
|
debugLog("One or more GL_ARB_shader_objects functions were not found");
|
||||||
|
@ -132,88 +131,36 @@ end:
|
||||||
|
|
||||||
Shader::Shader()
|
Shader::Shader()
|
||||||
{
|
{
|
||||||
loaded = false;
|
addType(SCO_SHADER);
|
||||||
mode = 0;
|
numUniforms = -1;
|
||||||
|
uniformsDirty = false;
|
||||||
|
|
||||||
#ifdef BBGE_BUILD_OPENGL
|
#ifdef BBGE_BUILD_OPENGL
|
||||||
g_vertexShader = 0;
|
|
||||||
g_fragmentShader = 0;
|
|
||||||
g_programObj = 0;
|
g_programObj = 0;
|
||||||
vx = vy = vz = vw = 0;
|
|
||||||
g_location_texture = 0;
|
|
||||||
g_location_mode = 0;
|
|
||||||
g_location_value = 0;
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
Shader::~Shader()
|
Shader::~Shader()
|
||||||
|
{
|
||||||
|
unload();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Shader::unload()
|
||||||
{
|
{
|
||||||
#ifdef BBGE_BUILD_SHADERS
|
#ifdef BBGE_BUILD_SHADERS
|
||||||
if (!_useShaders)
|
if (!_useShaders)
|
||||||
return;
|
return;
|
||||||
if (g_vertexShader)
|
|
||||||
glDeleteObjectARB( g_vertexShader );
|
|
||||||
if (g_fragmentShader)
|
|
||||||
glDeleteObjectARB( g_fragmentShader );
|
|
||||||
if (g_programObj)
|
if (g_programObj)
|
||||||
|
{
|
||||||
glDeleteObjectARB( g_programObj );
|
glDeleteObjectARB( g_programObj );
|
||||||
|
g_programObj = 0;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Shader::isLoaded()
|
bool Shader::isLoaded() const
|
||||||
{
|
{
|
||||||
return loaded;
|
return g_programObj != 0;
|
||||||
}
|
|
||||||
|
|
||||||
void Shader::setMode(int mode)
|
|
||||||
{
|
|
||||||
this->mode = mode;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Shader::setValue(float x, float y, float z, float w)
|
|
||||||
{
|
|
||||||
vx = x;
|
|
||||||
vy = y;
|
|
||||||
vz = z;
|
|
||||||
vw = w;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char *readShaderFile( const char *fileName )
|
|
||||||
{
|
|
||||||
debugLog("readShaderFile()");
|
|
||||||
#ifdef BBGE_BUILD_WINDOWS
|
|
||||||
FILE *file = fopen( fileName, "r" ); // FIXME: should this code ever be re-activated, adjust to VFS! -- fg
|
|
||||||
|
|
||||||
if( file == NULL )
|
|
||||||
{
|
|
||||||
errorLog("Cannot open shader file!");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct _stat fileStats;
|
|
||||||
|
|
||||||
if( _stat( fileName, &fileStats ) != 0 )
|
|
||||||
{
|
|
||||||
errorLog("Cannot get file stats for shader file!");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
unsigned char *buffer = new unsigned char[fileStats.st_size];
|
|
||||||
|
|
||||||
int bytes = fread( buffer, 1, fileStats.st_size, file );
|
|
||||||
|
|
||||||
buffer[bytes] = 0;
|
|
||||||
|
|
||||||
fclose( file );
|
|
||||||
|
|
||||||
debugLog("End readShaderFile()");
|
|
||||||
|
|
||||||
return buffer;
|
|
||||||
|
|
||||||
#else
|
|
||||||
debugLog("End readShaderFile()");
|
|
||||||
return 0;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Shader::reload()
|
void Shader::reload()
|
||||||
|
@ -226,13 +173,8 @@ void Shader::bind()
|
||||||
#ifdef BBGE_BUILD_SHADERS
|
#ifdef BBGE_BUILD_SHADERS
|
||||||
if (!_useShaders)
|
if (!_useShaders)
|
||||||
return;
|
return;
|
||||||
glUseProgramObjectARB( g_programObj );
|
glUseProgramObjectARB(g_programObj);
|
||||||
if( g_location_texture != -1 )
|
_flushUniforms();
|
||||||
glUniform1iARB( g_location_texture, 0 );
|
|
||||||
if ( g_location_mode )
|
|
||||||
glUniform1iARB( g_location_mode, mode);
|
|
||||||
if ( g_location_value )
|
|
||||||
glUniform4fARB( g_location_value, vx, vy, vz, vw);
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -241,150 +183,266 @@ void Shader::unbind()
|
||||||
#ifdef BBGE_BUILD_SHADERS
|
#ifdef BBGE_BUILD_SHADERS
|
||||||
if (!_useShaders)
|
if (!_useShaders)
|
||||||
return;
|
return;
|
||||||
glUseProgramObjectARB( NULL );
|
glUseProgramObjectARB(0);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned int Shader::_compileShader(int type, const char *src, char *errbuf, size_t errbufsize)
|
||||||
|
{
|
||||||
|
#ifdef BBGE_BUILD_SHADERS
|
||||||
|
GLint compiled = 0;
|
||||||
|
GLhandleARB handle = glCreateShaderObjectARB(type);
|
||||||
|
|
||||||
|
glShaderSourceARB( handle, 1, &src, NULL );
|
||||||
|
glCompileShaderARB( handle);
|
||||||
|
|
||||||
|
glGetObjectParameterivARB(handle, GL_OBJECT_COMPILE_STATUS_ARB, &compiled);
|
||||||
|
glGetInfoLogARB(handle, errbufsize, NULL, errbuf);
|
||||||
|
if(!compiled)
|
||||||
|
{
|
||||||
|
glDeleteObjectARB(handle);
|
||||||
|
handle = 0;
|
||||||
|
}
|
||||||
|
GLint err = glGetError();
|
||||||
|
if(err != GL_NO_ERROR)
|
||||||
|
{
|
||||||
|
std::ostringstream os;
|
||||||
|
os << "Shader::_compileShader: Unexpected error " << err;
|
||||||
|
errorLog(os.str());
|
||||||
|
}
|
||||||
|
return handle;
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void Shader::load(const std::string &file, const std::string &fragFile)
|
void Shader::load(const std::string &file, const std::string &fragFile)
|
||||||
{
|
{
|
||||||
staticInit();
|
staticInit();
|
||||||
loaded = false;
|
|
||||||
|
|
||||||
#ifdef BBGE_BUILD_SHADERS
|
|
||||||
if(!_useShaders)
|
if(!_useShaders)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
debugLog("Shader::load("+file+", "+fragFile+")");
|
debugLog("Shader::load("+file+", "+fragFile+")");
|
||||||
|
|
||||||
g_location_texture = 0;
|
this->vertFile = file;
|
||||||
g_location_mode = 0;
|
this->fragFile = fragFile;
|
||||||
g_location_value = 0;
|
|
||||||
|
|
||||||
try
|
char *vertCode = file.length() ? readFile(file) : NULL;
|
||||||
{
|
char *fragCode = fragFile.length() ? readFile(fragFile) : NULL;
|
||||||
|
|
||||||
debugLog("Shader::load 1");
|
loadSrc(vertCode, fragCode);
|
||||||
this->vertFile = file;
|
|
||||||
this->fragFile = fragFile;
|
|
||||||
//
|
|
||||||
// If the required extension is present, get the addresses of its
|
|
||||||
// functions that we wish to use...
|
|
||||||
//
|
|
||||||
|
|
||||||
const char *vertexShaderStrings[1];
|
delete [] vertCode;
|
||||||
const char *fragmentShaderStrings[1];
|
delete [] fragCode;
|
||||||
GLint bVertCompiled;
|
|
||||||
GLint bFragCompiled;
|
|
||||||
GLint bLinked;
|
|
||||||
char str[4096];
|
|
||||||
|
|
||||||
//
|
|
||||||
// Create the vertex shader...
|
|
||||||
//
|
|
||||||
|
|
||||||
debugLog("Shader::load 2");
|
|
||||||
|
|
||||||
g_vertexShader = glCreateShaderObjectARB( GL_VERTEX_SHADER_ARB );
|
|
||||||
|
|
||||||
unsigned char *vertexShaderAssembly = readShaderFile( file.c_str() );
|
|
||||||
vertexShaderStrings[0] = (char*)vertexShaderAssembly;
|
|
||||||
glShaderSourceARB( g_vertexShader, 1, vertexShaderStrings, NULL );
|
|
||||||
glCompileShaderARB( g_vertexShader);
|
|
||||||
delete[] vertexShaderAssembly;
|
|
||||||
|
|
||||||
glGetObjectParameterivARB( g_vertexShader, GL_OBJECT_COMPILE_STATUS_ARB,
|
|
||||||
&bVertCompiled );
|
|
||||||
if( bVertCompiled == false )
|
|
||||||
//if (true)
|
|
||||||
{
|
|
||||||
glGetInfoLogARB(g_vertexShader, sizeof(str), NULL, str);
|
|
||||||
std::ostringstream os;
|
|
||||||
os << "Vertex Shader Compile Error: " << str;
|
|
||||||
debugLog(os.str());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Create the fragment shader...
|
|
||||||
//
|
|
||||||
|
|
||||||
debugLog("Shader::load 3");
|
|
||||||
|
|
||||||
g_fragmentShader = glCreateShaderObjectARB( GL_FRAGMENT_SHADER_ARB );
|
|
||||||
|
|
||||||
unsigned char *fragmentShaderAssembly = readShaderFile( fragFile.c_str() );
|
|
||||||
fragmentShaderStrings[0] = (char*)fragmentShaderAssembly;
|
|
||||||
glShaderSourceARB( g_fragmentShader, 1, fragmentShaderStrings, NULL );
|
|
||||||
glCompileShaderARB( g_fragmentShader );
|
|
||||||
delete[] fragmentShaderAssembly;
|
|
||||||
|
|
||||||
glGetObjectParameterivARB( g_fragmentShader, GL_OBJECT_COMPILE_STATUS_ARB,
|
|
||||||
&bFragCompiled );
|
|
||||||
if( bFragCompiled == false )
|
|
||||||
{
|
|
||||||
glGetInfoLogARB( g_fragmentShader, sizeof(str), NULL, str );
|
|
||||||
std::ostringstream os;
|
|
||||||
os << "Fragment Shader Compile Error: " << str;
|
|
||||||
debugLog(os.str());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
debugLog("Shader::load 4");
|
|
||||||
|
|
||||||
//
|
|
||||||
// Create a program object and attach the two compiled shaders...
|
|
||||||
//
|
|
||||||
|
|
||||||
|
|
||||||
g_programObj = glCreateProgramObjectARB();
|
|
||||||
|
|
||||||
if (!g_programObj || !g_vertexShader || !g_fragmentShader)
|
|
||||||
{
|
|
||||||
debugLog("programObj / vertexShader / fragmentShader problem");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
glAttachObjectARB( g_programObj, g_vertexShader );
|
|
||||||
glAttachObjectARB( g_programObj, g_fragmentShader );
|
|
||||||
|
|
||||||
//
|
|
||||||
// Link the program object and print out the info log...
|
|
||||||
//
|
|
||||||
|
|
||||||
glLinkProgramARB( g_programObj );
|
|
||||||
glGetObjectParameterivARB( g_programObj, GL_OBJECT_LINK_STATUS_ARB, &bLinked );
|
|
||||||
|
|
||||||
debugLog("Shader::load 5");
|
|
||||||
|
|
||||||
if( bLinked == false )
|
|
||||||
{
|
|
||||||
glGetInfoLogARB( g_programObj, sizeof(str), NULL, str );
|
|
||||||
std::ostringstream os;
|
|
||||||
os << "Shader Linking Error: " << str;
|
|
||||||
debugLog(os.str());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Locate some parameters by name so we can set them later...
|
|
||||||
//
|
|
||||||
|
|
||||||
debugLog("Shader::load 6");
|
|
||||||
|
|
||||||
g_location_texture = glGetUniformLocationARB( g_programObj, "tex" );
|
|
||||||
g_location_mode = glGetUniformLocationARB( g_programObj, "mode" );
|
|
||||||
g_location_value = glGetUniformLocationARB( g_programObj, "value" );
|
|
||||||
|
|
||||||
debugLog("Shader::load 7");
|
|
||||||
|
|
||||||
loaded = true;
|
|
||||||
}
|
|
||||||
catch(...)
|
|
||||||
{
|
|
||||||
debugLog("caught exception in shader::load");
|
|
||||||
loaded = false;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
debugLog("End Shader::load()");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Shader::loadSrc(const char *vertCode, const char *fragCode)
|
||||||
|
{
|
||||||
|
staticInit();
|
||||||
|
unload();
|
||||||
|
|
||||||
|
if(!_useShaders)
|
||||||
|
return;
|
||||||
|
|
||||||
|
#ifdef BBGE_BUILD_SHADERS
|
||||||
|
|
||||||
|
char str[4096];
|
||||||
|
|
||||||
|
GLhandleARB vertexShader = 0;
|
||||||
|
GLhandleARB fragmentShader = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Create the vertex shader...
|
||||||
|
//
|
||||||
|
if(vertCode && *vertCode && !(vertexShader = _compileShader(GL_VERTEX_SHADER_ARB, vertCode, str, sizeof(str))))
|
||||||
|
{
|
||||||
|
std::ostringstream os;
|
||||||
|
os << "Vertex Shader Compile Error [" << vertFile << "]:\n" << str;
|
||||||
|
errorLog(os.str());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Create the fragment shader...
|
||||||
|
//
|
||||||
|
if(fragCode && *fragCode && !(fragmentShader = _compileShader(GL_FRAGMENT_SHADER_ARB, fragCode, str, sizeof(str))))
|
||||||
|
{
|
||||||
|
std::ostringstream os;
|
||||||
|
os << "Fragment Shader Compile Error [" << fragFile << "]:\n" << str;
|
||||||
|
errorLog(os.str());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Create a program object and attach the two compiled shaders...
|
||||||
|
//
|
||||||
|
|
||||||
|
g_programObj = glCreateProgramObjectARB();
|
||||||
|
|
||||||
|
if (!(g_programObj && (vertexShader || fragmentShader)))
|
||||||
|
{
|
||||||
|
errorLog("programObj / vertexShader / fragmentShader problem");
|
||||||
|
unload();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Link the program object and print out the info log...
|
||||||
|
//
|
||||||
|
if(vertexShader)
|
||||||
|
glAttachObjectARB( g_programObj, vertexShader );
|
||||||
|
if(fragmentShader)
|
||||||
|
glAttachObjectARB( g_programObj, fragmentShader );
|
||||||
|
|
||||||
|
glLinkProgramARB( g_programObj );
|
||||||
|
|
||||||
|
// Shader objects will be deleted as soon as the program object is deleted
|
||||||
|
if(vertexShader)
|
||||||
|
glDeleteObjectARB(vertexShader);
|
||||||
|
if(fragmentShader)
|
||||||
|
glDeleteObjectARB(fragmentShader);
|
||||||
|
|
||||||
|
GLint bLinked;
|
||||||
|
glGetObjectParameterivARB( g_programObj, GL_OBJECT_LINK_STATUS_ARB, &bLinked );
|
||||||
|
|
||||||
|
|
||||||
|
if(!bLinked)
|
||||||
|
{
|
||||||
|
glGetInfoLogARB( g_programObj, sizeof(str), NULL, str );
|
||||||
|
std::ostringstream os;
|
||||||
|
os << "Shader Linking Error: " << str;
|
||||||
|
errorLog(os.str());
|
||||||
|
unload();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_queryUniforms();
|
||||||
|
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void Shader::_setUniform(Uniform *u)
|
||||||
|
{
|
||||||
|
/*if(u->location == -1)
|
||||||
|
{
|
||||||
|
u->location = glGetUniformLocationARB(g_programObj, u->name);
|
||||||
|
if(u->location == -1)
|
||||||
|
{
|
||||||
|
u->dirty = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
switch(u->type)
|
||||||
|
{
|
||||||
|
case GL_FLOAT: glUniform1fvARB(u->location, 1, u->data.f); break;
|
||||||
|
case GL_FLOAT_VEC2_ARB: glUniform2fvARB(u->location, 1, u->data.f); break;
|
||||||
|
case GL_FLOAT_VEC3_ARB: glUniform3fvARB(u->location, 1, u->data.f); break;
|
||||||
|
case GL_FLOAT_VEC4_ARB: glUniform4fvARB(u->location, 1, u->data.f); break;
|
||||||
|
case GL_INT: glUniform1ivARB(u->location, 1, u->data.i); break;
|
||||||
|
case GL_INT_VEC2_ARB: glUniform2ivARB(u->location, 1, u->data.i); break;
|
||||||
|
case GL_INT_VEC3_ARB: glUniform3ivARB(u->location, 1, u->data.i); break;
|
||||||
|
case GL_INT_VEC4_ARB: glUniform4ivARB(u->location, 1, u->data.i); break;
|
||||||
|
}
|
||||||
|
u->dirty = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Shader::_flushUniforms()
|
||||||
|
{
|
||||||
|
if(!uniformsDirty)
|
||||||
|
return;
|
||||||
|
uniformsDirty = false;
|
||||||
|
|
||||||
|
for(size_t i = 0; i < uniforms.size(); ++i)
|
||||||
|
{
|
||||||
|
Uniform &u = uniforms[i];
|
||||||
|
if(u.dirty)
|
||||||
|
_setUniform(&u);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// for sorting
|
||||||
|
bool Shader::_sortUniform(const Uniform& a, const char *bname)
|
||||||
|
{
|
||||||
|
return strcmp(a.name, bname) < 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Shader::Uniform::operator< (const Uniform& b) const
|
||||||
|
{
|
||||||
|
return Shader::_sortUniform(*this, &b.name[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Shader::_queryUniforms()
|
||||||
|
{
|
||||||
|
glGetObjectParameterivARB(g_programObj, GL_OBJECT_ACTIVE_UNIFORMS_ARB , &numUniforms);
|
||||||
|
|
||||||
|
if (numUniforms <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
uniforms.reserve(numUniforms);
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < numUniforms; ++i)
|
||||||
|
{
|
||||||
|
Uniform u;
|
||||||
|
GLint size = 0;
|
||||||
|
GLenum type = 0;
|
||||||
|
glGetActiveUniformARB(g_programObj, i, sizeof(u.name), NULL, &size, &type, &u.name[0]);
|
||||||
|
if(!type || !size)
|
||||||
|
continue;
|
||||||
|
u.location = glGetUniformLocationARB(g_programObj, u.name);
|
||||||
|
if(u.location == -1)
|
||||||
|
continue;
|
||||||
|
u.dirty = false;
|
||||||
|
u.type = type;
|
||||||
|
memset(&u.data, 0, sizeof(u.data));
|
||||||
|
|
||||||
|
uniforms.push_back(u);
|
||||||
|
}
|
||||||
|
|
||||||
|
// sort to be able to do binary search later
|
||||||
|
std::sort(uniforms.begin(), uniforms.end());
|
||||||
|
}
|
||||||
|
|
||||||
|
int Shader::_getUniformIndex(const char *name)
|
||||||
|
{
|
||||||
|
// binary search
|
||||||
|
UniformVec::iterator it = stdx_fg::lower_bound(uniforms.begin(), uniforms.end(), name, _sortUniform);
|
||||||
|
// because lower_bound returns the first element that compares less, it might not be the correct one
|
||||||
|
if(it != uniforms.end() && strcmp(it->name, name))
|
||||||
|
return -1;
|
||||||
|
return int(it - uniforms.begin());
|
||||||
|
}
|
||||||
|
|
||||||
|
void Shader::setInt(const char *name, int x, int y /* = 0 */, int z /* = 0 */, int w /* = 0 */)
|
||||||
|
{
|
||||||
|
#if BBGE_BUILD_SHADERS
|
||||||
|
if(!g_programObj || numUniforms <= 0)
|
||||||
|
return;
|
||||||
|
int idx = _getUniformIndex(name);
|
||||||
|
if(unsigned(idx) >= uniforms.size())
|
||||||
|
return;
|
||||||
|
Uniform& u = uniforms[idx];
|
||||||
|
u.data.i[0] = x;
|
||||||
|
u.data.i[1] = y;
|
||||||
|
u.data.i[2] = z;
|
||||||
|
u.data.i[3] = w;
|
||||||
|
u.dirty = true;
|
||||||
|
uniformsDirty = true;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void Shader::setFloat(const char *name, float x, float y /* = 0 */, float z /* = 0 */, float w /* = 0 */)
|
||||||
|
{
|
||||||
|
#if BBGE_BUILD_SHADERS
|
||||||
|
if(!g_programObj || numUniforms <= 0)
|
||||||
|
return;
|
||||||
|
int idx = _getUniformIndex(name);
|
||||||
|
if(unsigned(idx) >= uniforms.size())
|
||||||
|
return;
|
||||||
|
Uniform& u = uniforms[idx];
|
||||||
|
u.data.f[0] = x;
|
||||||
|
u.data.f[1] = y;
|
||||||
|
u.data.f[2] = z;
|
||||||
|
u.data.f[3] = w;
|
||||||
|
u.dirty = true;
|
||||||
|
uniformsDirty = true;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
|
@ -22,36 +22,74 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
#define BBGE_SHADER_H
|
#define BBGE_SHADER_H
|
||||||
|
|
||||||
#include "Base.h"
|
#include "Base.h"
|
||||||
|
#include "ScriptObject.h"
|
||||||
|
|
||||||
class Shader
|
class Shader : public ScriptObject
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Shader();
|
Shader();
|
||||||
~Shader();
|
~Shader();
|
||||||
bool isLoaded();
|
bool isLoaded() const;
|
||||||
void load(const std::string &file, const std::string &fragFile);
|
void load(const std::string &file, const std::string &fragFile);
|
||||||
|
void loadSrc(const char *vertCode, const char *fragCode);
|
||||||
void reload();
|
void reload();
|
||||||
|
void unload();
|
||||||
void bind();
|
void bind();
|
||||||
void unbind();
|
void unbind();
|
||||||
void setMode(int mode);
|
|
||||||
void setValue(float x, float y, float z, float w);
|
void setInt(const char *name, int x, int y = 0, int z = 0, int w = 0);
|
||||||
std::string vertFile, fragFile;
|
void setFloat(const char *name, float x, float y = 0, float z = 0, float w = 0);
|
||||||
|
// TODO: other setters needed?
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
std::string vertFile, fragFile;
|
||||||
#ifdef BBGE_BUILD_OPENGL
|
#ifdef BBGE_BUILD_OPENGL
|
||||||
GLuint g_programObj;
|
GLuint g_programObj;
|
||||||
GLuint g_vertexShader;
|
int numUniforms;
|
||||||
GLuint g_fragmentShader;
|
|
||||||
GLuint g_location_texture;
|
|
||||||
GLuint g_location_mode;
|
|
||||||
GLuint g_location_value;
|
|
||||||
#endif
|
#endif
|
||||||
int mode;
|
|
||||||
float vx, vy, vz, vw;
|
|
||||||
bool loaded;
|
|
||||||
|
|
||||||
|
private:
|
||||||
static void staticInit();
|
static void staticInit();
|
||||||
static bool _wasInited;
|
static bool _wasInited;
|
||||||
static bool _useShaders;
|
static bool _useShaders;
|
||||||
|
|
||||||
|
static unsigned int _compileShader(int type, const char *src, char *errbuf, size_t errbufsize);
|
||||||
|
|
||||||
|
struct Uniform
|
||||||
|
{
|
||||||
|
int location; // GL location variable
|
||||||
|
int type;
|
||||||
|
bool dirty; // need to flush if true
|
||||||
|
union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
int i[4];
|
||||||
|
};
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
float f[4];
|
||||||
|
};
|
||||||
|
} data;
|
||||||
|
char name[32];
|
||||||
|
|
||||||
|
bool operator< (const Uniform&) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
static bool _sortUniform(const Uniform& a, const char *bname);
|
||||||
|
|
||||||
|
void _queryUniforms();
|
||||||
|
void _flushUniforms();
|
||||||
|
void _registerUniform();
|
||||||
|
|
||||||
|
void _setUniform(Uniform *u);
|
||||||
|
int _getUniformIndex(const char *name);
|
||||||
|
|
||||||
|
typedef std::vector<Uniform> UniformVec;
|
||||||
|
UniformVec uniforms;
|
||||||
|
|
||||||
|
bool uniformsDirty;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
34
ExternalLibs/algorithmx.h
Normal file
34
ExternalLibs/algorithmx.h
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
#ifndef STDXfg_ALGORITHMX_H
|
||||||
|
#define STDXfg_ALGORITHMX_H
|
||||||
|
|
||||||
|
// Some std:: namespace enhancements
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
namespace stdx_fg {
|
||||||
|
|
||||||
|
template <class ForwardIterator, class T, class Compare>
|
||||||
|
ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last, const T& val, Compare comp)
|
||||||
|
{
|
||||||
|
ForwardIterator it;
|
||||||
|
typename std::iterator_traits<ForwardIterator>::difference_type count, step;
|
||||||
|
count = std::distance(first,last);
|
||||||
|
while(count > 0)
|
||||||
|
{
|
||||||
|
it = first;
|
||||||
|
step = count/2;
|
||||||
|
std::advance (it,step);
|
||||||
|
if (comp(*it, val))
|
||||||
|
{
|
||||||
|
first= ++it;
|
||||||
|
count -= step+1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
count = step;
|
||||||
|
}
|
||||||
|
return first;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // end namespace stdx_fg
|
||||||
|
|
||||||
|
#endif
|
|
@ -220,7 +220,10 @@ function postInit(me)
|
||||||
updateLocation(me)
|
updateLocation(me)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Both exist. Different spelling. Yay for consistency.
|
||||||
|
-- Keeping them both, should ensure behavior as it used to be, just without warnings. -- FG
|
||||||
v.incutscene = false
|
v.incutscene = false
|
||||||
|
v.inCutScene = false
|
||||||
|
|
||||||
local function cutsceneintro(me, node)
|
local function cutsceneintro(me, node)
|
||||||
v.incutscene = true
|
v.incutscene = true
|
||||||
|
|
|
@ -367,7 +367,7 @@ function update(me, dt)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if entity_isState(me, STATE_MOVING) and entity_x(me) >= node_x(v.maxMove) then
|
if entity_isState(me, STATE_MOVING) and entity_x(me) >= node_x(v.maxMove) then
|
||||||
if entity_isInterpolating() then
|
if entity_isInterpolating(me) then
|
||||||
entity_animate(me, "idle")
|
entity_animate(me, "idle")
|
||||||
end
|
end
|
||||||
entity_stopInterpolating(me)
|
entity_stopInterpolating(me)
|
||||||
|
@ -400,7 +400,7 @@ function enterState(me)
|
||||||
entity_stopInterpolating(me)
|
entity_stopInterpolating(me)
|
||||||
entity_animate(me, "idle", LOOP_INF)
|
entity_animate(me, "idle", LOOP_INF)
|
||||||
elseif entity_isState(me, STATE_ATTACK) then
|
elseif entity_isState(me, STATE_ATTACK) then
|
||||||
playSfx("EnergyBoss-Attack", 900+math.random(200))
|
playSfx("EnergyBoss-Attack", (900+math.random(200)) / 1000)
|
||||||
local x, y = bone_getPosition(v.bone_jaw)
|
local x, y = bone_getPosition(v.bone_jaw)
|
||||||
if entity_isPositionInRange(v.naija, x, y, 600)
|
if entity_isPositionInRange(v.naija, x, y, 600)
|
||||||
and entity_y(v.naija) < y+64
|
and entity_y(v.naija) < y+64
|
||||||
|
@ -441,12 +441,12 @@ function enterState(me)
|
||||||
end
|
end
|
||||||
v.attackDelay = 0
|
v.attackDelay = 0
|
||||||
v.fireDelay = 0
|
v.fireDelay = 0
|
||||||
playSfx("EnergyBoss-Hurt", 900+math.random(200))
|
playSfx("EnergyBoss-Hurt", (900+math.random(200)) / 1000)
|
||||||
entity_animate(me, "hurt")
|
entity_animate(me, "hurt")
|
||||||
entity_setPosition(me, entity_x(me)-500, entity_y(me), 1.6)
|
entity_setPosition(me, entity_x(me)-500, entity_y(me), 1.6)
|
||||||
elseif entity_isState(me, STATE_HITBARRIER) then
|
elseif entity_isState(me, STATE_HITBARRIER) then
|
||||||
entity_stopInterpolating(me)
|
entity_stopInterpolating(me)
|
||||||
playSfx("EnergyBoss-Die", 1100+math.random(200))
|
playSfx("EnergyBoss-Die", (1100+math.random(200)) / 1000)
|
||||||
entity_animate(me, "hitBarrier")
|
entity_animate(me, "hitBarrier")
|
||||||
|
|
||||||
entity_spawnParticlesFromCollisionMask(me, "energyboss-hit", 4)
|
entity_spawnParticlesFromCollisionMask(me, "energyboss-hit", 4)
|
||||||
|
@ -459,7 +459,7 @@ function enterState(me)
|
||||||
entity_setPosition(me, node_x(backNode), entity_y(me), -800)
|
entity_setPosition(me, node_x(backNode), entity_y(me), -800)
|
||||||
elseif entity_isState(me, STATE_COLLAPSE) then
|
elseif entity_isState(me, STATE_COLLAPSE) then
|
||||||
clearShots()
|
clearShots()
|
||||||
playSfx("EnergyBoss-Die", 1000)
|
playSfx("EnergyBoss-Die")
|
||||||
setFlag(FLAG_ENERGYBOSSDEAD, 1)
|
setFlag(FLAG_ENERGYBOSSDEAD, 1)
|
||||||
entity_setDamageTarget(me, DT_AVATAR_ENERGYBLAST, false)
|
entity_setDamageTarget(me, DT_AVATAR_ENERGYBLAST, false)
|
||||||
entity_setDamageTarget(me, DT_AVATAR_SHOCK, false)
|
entity_setDamageTarget(me, DT_AVATAR_SHOCK, false)
|
||||||
|
@ -504,7 +504,7 @@ function enterState(me)
|
||||||
--end
|
--end
|
||||||
elseif entity_isState(me, STATE_INTRO) then
|
elseif entity_isState(me, STATE_INTRO) then
|
||||||
v.awoken = true
|
v.awoken = true
|
||||||
playSfx("EnergyBoss-Die", 800)
|
playSfx("EnergyBoss-Die", 0.8)
|
||||||
shakeCamera(10, 3)
|
shakeCamera(10, 3)
|
||||||
entity_stopInterpolating(me)
|
entity_stopInterpolating(me)
|
||||||
entity_animate(me, "roar")
|
entity_animate(me, "roar")
|
||||||
|
|
|
@ -28,6 +28,7 @@ v.getOutHits = 0
|
||||||
v.hx = 0
|
v.hx = 0
|
||||||
v.hy = 0
|
v.hy = 0
|
||||||
v.hurtTimer = 0
|
v.hurtTimer = 0
|
||||||
|
v.trapDelay = 0
|
||||||
|
|
||||||
local STATE_TRAP = 1001
|
local STATE_TRAP = 1001
|
||||||
local STATE_TRAPPED = 1002
|
local STATE_TRAPPED = 1002
|
||||||
|
|
|
@ -352,10 +352,6 @@
|
||||||
RelativePath="..\..\BBGE\ParticleManager.cpp"
|
RelativePath="..\..\BBGE\ParticleManager.cpp"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath="..\..\BBGE\Particles.cpp"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath="..\..\BBGE\Particles.h"
|
RelativePath="..\..\BBGE\Particles.h"
|
||||||
>
|
>
|
||||||
|
|
|
@ -1219,6 +1219,10 @@
|
||||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
||||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
|
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
|
||||||
>
|
>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\ExternalLibs\algorithmx.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<Filter
|
<Filter
|
||||||
Name="FTGL"
|
Name="FTGL"
|
||||||
>
|
>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue