diff --git a/Aquaria/AnimationEditor.cpp b/Aquaria/AnimationEditor.cpp index af0a35c..904e028 100644 --- a/Aquaria/AnimationEditor.cpp +++ b/Aquaria/AnimationEditor.cpp @@ -1415,6 +1415,7 @@ void AnimationEditor::load() std::string file = dsq->getUserInputString("Enter anim file to load:"); if (file.empty()) return; this->editingFile = file; + SkeletalSprite::clearCache(); loadFile(); } @@ -1426,6 +1427,7 @@ void AnimationEditor::loadSkin() if (file.empty()) return; //this->editingFile = file; //loadFile(); + SkeletalSprite::clearCache(); editSprite->loadSkin(file); } diff --git a/Aquaria/AquariaComboBox.cpp b/Aquaria/AquariaComboBox.cpp index ace3175..84cd7b5 100644 --- a/Aquaria/AquariaComboBox.cpp +++ b/Aquaria/AquariaComboBox.cpp @@ -27,7 +27,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define SCROLL_DELAY 0.1f #define SCROLL_DELAY_FIRST 0.4f -AquariaComboBox::AquariaComboBox() : RenderObject() +AquariaComboBox::AquariaComboBox(Vector textscale) : RenderObject() { //Quad *bar, *window, *scrollBtnUp, *scrollBtnDown, *scrollBar; bar = new Quad("gui/combo-drop", Vector(0,0)); @@ -47,6 +47,7 @@ AquariaComboBox::AquariaComboBox() : RenderObject() selectedItemLabel->setFontSize(8); selectedItemLabel->offset.y = -10; selectedItemLabel->position.x = -50; + selectedItemLabel->scale = textscale; addChild(selectedItemLabel, PM_POINTER); numDrops = 8; @@ -62,6 +63,8 @@ AquariaComboBox::AquariaComboBox() : RenderObject() scrollDelay = 0; firstScroll = 0; + + this->textscale = textscale; } void AquariaComboBox::destroy() @@ -230,7 +233,7 @@ void AquariaComboBox::open(float t) { if (i < items.size()) { - AquariaComboBoxItem *a = new AquariaComboBoxItem(items[i], i, this); + AquariaComboBoxItem *a = new AquariaComboBoxItem(items[i], i, this, textscale); a->alpha = 0; a->alpha.interpolateTo(1, t); a->position.y = (a->getHeight()+2) * ((i-scroll)+1); @@ -335,7 +338,7 @@ int AquariaComboBox::addItem(const std::string &n) Vector unselectedColor(0.7, 0.7, 0.7); Vector selectedColor(1,1,1); -AquariaComboBoxItem::AquariaComboBoxItem(const std::string &str, int idx, AquariaComboBox *combo) : Quad() +AquariaComboBoxItem::AquariaComboBoxItem(const std::string &str, int idx, AquariaComboBox *combo, Vector textscale) : Quad() { this->combo = combo; index = idx; @@ -348,6 +351,7 @@ AquariaComboBoxItem::AquariaComboBoxItem(const std::string &str, int idx, Aquari label->setText(str); label->offset.y = -10; label->position.x = -50; + label->scale = textscale; addChild(label, PM_POINTER); color = unselectedColor; diff --git a/Aquaria/AquariaMenuItem.cpp b/Aquaria/AquariaMenuItem.cpp index c288058..9f1383b 100644 --- a/Aquaria/AquariaMenuItem.cpp +++ b/Aquaria/AquariaMenuItem.cpp @@ -847,16 +847,17 @@ void AquariaMenuItem::useSound(const std::string &tex) useSfx = tex; } -void AquariaMenuItem::useQuad(const std::string &tex) +bool AquariaMenuItem::useQuad(const std::string &tex) { if (quad) { debugLog("trying to call useQuad twice on the same object"); - return; + return true; } quad = new Quad; - quad->setTexture(tex); + bool good = quad->setTexture(tex); addChild(quad, PM_POINTER); + return good; } void AquariaMenuItem::useGlow(const std::string &tex, int w, int h) diff --git a/Aquaria/AquariaMenuItem.h b/Aquaria/AquariaMenuItem.h index 95dc797..ee7a85a 100644 --- a/Aquaria/AquariaMenuItem.h +++ b/Aquaria/AquariaMenuItem.h @@ -81,7 +81,7 @@ public: XMLElement *ability, *xmlItem; int choice; Quad *glow, *quad; - void useQuad(const std::string &tex); + bool useQuad(const std::string &tex); void useGlow(const std::string &tex, int w, int h); void useSound(const std::string &tex); @@ -195,7 +195,7 @@ class AquariaComboBox; class AquariaComboBoxItem : public Quad { public: - AquariaComboBoxItem(const std::string &str, int idx, AquariaComboBox *combo); + AquariaComboBoxItem(const std::string &str, int idx, AquariaComboBox *combo, Vector textscale); protected: void onUpdate(float dt); @@ -210,7 +210,7 @@ protected: class AquariaComboBox : public RenderObject { public: - AquariaComboBox(); + AquariaComboBox(Vector textscale = Vector(1, 1)); void destroy(); @@ -242,6 +242,7 @@ protected: int selectedItem; float scrollDelay; bool firstScroll; + Vector textscale; std::vector shownItems; }; diff --git a/Aquaria/Avatar.cpp b/Aquaria/Avatar.cpp index 43d334c..355f807 100644 --- a/Aquaria/Avatar.cpp +++ b/Aquaria/Avatar.cpp @@ -4110,33 +4110,16 @@ void Avatar::refreshNormalForm() if (c.empty()) c = "Naija"; refreshModel("Naija", c); - if (true) + if(hair) { - if (hair) - hair->alphaMod = 1.0; + hair->alphaMod = 1.0; if (!c.empty() && c!="Naija") { - if (exists(core->getBaseTextureDirectory() + "naija/cape-"+c+".png")) - { - if (hair) - hair->setTexture("naija/cape-"+c); - } - else - { - if (hair) - hair->alphaMod = 0; - } + if(!hair->setTexture("naija/cape-"+c)) + hair->alphaMod = 0; } else - { - if (hair) - hair->setTexture("naija/cape"); - } - } - else - { - if (hair) - hair->alphaMod = 0.0; + hair->setTexture("naija/cape"); } } @@ -7127,7 +7110,7 @@ void Avatar::onUpdate(float dt) if(!core->particlesPaused && elementEffectMult > 0) { - ElementUpdateList& elems = dsq->game->elementUpdateList; + ElementUpdateList& elems = dsq->game->elementInteractionList; for (ElementUpdateList::iterator it = elems.begin(); it != elems.end(); ++it) { (*it)->doInteraction(this, elementEffectMult, 16); diff --git a/Aquaria/Continuity.cpp b/Aquaria/Continuity.cpp index 8f386a9..f94a4f2 100644 --- a/Aquaria/Continuity.cpp +++ b/Aquaria/Continuity.cpp @@ -1368,7 +1368,19 @@ void Continuity::loadEatBank() { eats.clear(); - InStream inf("data/eats.txt"); + std::string file; + bool found = false; + if (dsq->mod.isActive()) + { + file = dsq->mod.getPath() + "eats.txt"; + if(exists(file)) + found = true; + } + + if(!found) + file = "data/eats.txt"; + + InStream inf(file.c_str()); EatData curData; std::string read; @@ -3649,7 +3661,8 @@ void Continuity::reset() speedTypes.clear(); InStream inFile("data/speedtypes.txt"); - int n, spd; + int n; + float spd; while (inFile >> n) { inFile >> spd; @@ -3667,7 +3680,7 @@ void Continuity::reset() core->resetTimer(); } -int Continuity::getSpeedType(int speedType) +float Continuity::getSpeedType(int speedType) { if (speedType >= speedTypes.size() || speedType < 0) { diff --git a/Aquaria/DSQ.cpp b/Aquaria/DSQ.cpp index a331cc6..c89a7b4 100644 --- a/Aquaria/DSQ.cpp +++ b/Aquaria/DSQ.cpp @@ -2222,7 +2222,7 @@ void DSQ::refreshResourcesForPatch(const std::string& name) { for(int i = 0; i < dsq->resources.size(); ++i) { - Resource *r = dsq->resources[i]; + Texture *r = dsq->resources[i]; if(files.find(r->name) != files.end()) r->reload(); } @@ -2313,7 +2313,7 @@ void DSQ::shutdown() SkeletalSprite::clearCache(); - cursor->setTexturePointer(0, RenderObject::NO_ADD_REF); + cursor->setTexturePointer(0); UNREFTEX(texCursor); UNREFTEX(texCursorSwim); @@ -2410,7 +2410,7 @@ void DSQ::setTexturePointers() texCursorSing = core->addTexture("cursor-sing"); if (cursor) - cursor->setTexturePointer(texCursor, RenderObject::NO_ADD_REF); + cursor->setTexturePointer(texCursor); } void DSQ::setCursor(CursorType type) @@ -2418,22 +2418,22 @@ void DSQ::setCursor(CursorType type) switch(type) { case CURSOR_NORMAL: - cursor->setTexturePointer(texCursor, RenderObject::NO_ADD_REF); + cursor->setTexturePointer(texCursor); break; case CURSOR_LOOK: - cursor->setTexturePointer(texCursorLook, RenderObject::NO_ADD_REF); + cursor->setTexturePointer(texCursorLook); break; case CURSOR_BURST: - cursor->setTexturePointer(texCursorBurst, RenderObject::NO_ADD_REF); + cursor->setTexturePointer(texCursorBurst); break; case CURSOR_SWIM: - cursor->setTexturePointer(texCursorSwim, RenderObject::NO_ADD_REF); + cursor->setTexturePointer(texCursorSwim); break; case CURSOR_SING: - cursor->setTexturePointer(texCursorSing, RenderObject::NO_ADD_REF); + cursor->setTexturePointer(texCursorSing); break; default: - cursor->setTexturePointer(texCursor, RenderObject::NO_ADD_REF); + cursor->setTexturePointer(texCursor); break; } } @@ -3869,58 +3869,6 @@ void DSQ::jumpToSection(InStream &inFile, const std::string §ion) debugLog("could not find section [" + section + "]"); } - -void DSQ::runGesture(const std::string &line) -{ - std::istringstream is(line); - std::string target; - is >> target; - debugLog("Gesture: " + line); - if (target == "entity") - { - std::string entName; - is >> entName; - Entity *e = getEntityByName(entName); - if (e) - { - std::string cmd; - is >> cmd; - if (cmd=="anim" || cmd=="animate") - { - std::string anim; - is >> anim; - int loop = 0; - int group = 0; - if (anim == "idle") - { - e->skeletalSprite.stopAllAnimations(); - loop = -1; - } - if (line.find("upperBody")!=std::string::npos) - { - group = 1; - } - if (line.find("loop")!=std::string::npos) - { - loop = -1; - } - if (line.find("stopAll")!=std::string::npos) - { - e->skeletalSprite.stopAllAnimations(); - } - e->skeletalSprite.transitionAnimate(anim, 0.2, loop, group); - } - else if (cmd == "moveToNode") - { - std::string node; - is >> node; - Path *p = dsq->game->getPathByName(node); - e->moveToNode(p, 0); - } - } - } -} - bool DSQ::runScript(const std::string &name, const std::string &function, bool ignoremissing /* = false */) { if (!scriptInterface.runScript(name, function, ignoremissing)) @@ -4550,7 +4498,7 @@ void DSQ::onUpdate(float dt) if (isDeveloperKeys() && fpsText && cmDebug && cmDebug->alpha == 1) { std::ostringstream os; - os << "FPS: " << core->fps << " | ROC: " << core->renderObjectCount << " | RC: " << Core::dbg_numRenderCalls; + os << "FPS: " << core->fps << " | ROC: " << core->renderObjectCount << " | RC: " << Core::dbg_numRenderCalls << " | RES: " << core->resources.size(); os << " | p: " << core->processedRenderObjectCount << " | t: " << core->totalRenderObjectCount; os << " | s: " << dsq->continuity.seconds; os << " | evQ: " << core->eventQueue.getSize(); @@ -4829,7 +4777,12 @@ void DSQ::modifyDt(float &dt) if (isDeveloperKeys()) { if (core->getKeyState(KEY_G)) - dt *= 4; + { + if(core->getShiftState()) + dt *= 10; + else + dt *= 4; + } else if (core->getKeyState(KEY_F)) { if (core->getShiftState()) diff --git a/Aquaria/DSQ.h b/Aquaria/DSQ.h index 773e212..7acb2be 100644 --- a/Aquaria/DSQ.h +++ b/Aquaria/DSQ.h @@ -31,8 +31,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "AquariaMenuItem.h" #include "ScriptInterface.h" -#include "PathFinding.h" - #include "TTFFont.h" #include "tinyxml2.h" @@ -622,12 +620,13 @@ class Path; struct GemData { - GemData() { canMove=false; } + GemData() { canMove=false; blink = false; } std::string name; std::string userString; std::string mapName; - bool canMove; Vector pos; + bool canMove; + bool blink; // not saved }; struct BeaconData @@ -994,7 +993,7 @@ public: float getStory(); void setStory(float v); - int getSpeedType(int speedType); + float getSpeedType(int speedType); void setNaijaModel(std::string model); @@ -1161,7 +1160,7 @@ public: protected: std::vector eats; - std::vector speedTypes; + std::vector speedTypes; float story; WorldType worldType; @@ -1264,7 +1263,7 @@ public: Quad *bar_left, *bar_right, *bar_up, *bar_down; Quad *barFade_left, *barFade_right; - Texture *texCursor, *texCursorSwim, *texCursorBurst, *texCursorSing, *texCursorLook; + CountedPtr texCursor, texCursorSwim, texCursorBurst, texCursorSing, texCursorLook; void setBlackBarsColor(Vector color); @@ -1397,8 +1396,6 @@ public: void jumpToSection(InStream &inFile, const std::string §ion); - PathFinding pathFinding; - void runGesture(const std::string &line); void generateCollisionMask(RenderObject *r); void toggleRenderCollisionShapes(); diff --git a/Aquaria/Element.cpp b/Aquaria/Element.cpp index 9c8cc51..c18bac7 100644 --- a/Aquaria/Element.cpp +++ b/Aquaria/Element.cpp @@ -84,12 +84,8 @@ void Element::doInteraction(Entity *ent, float mult, float touchWidth) eff->hitPerc = hitPerc; eff->touchVel = ent->vel; eff->effectMult = mult; - return; } } - //eff->touchVel = Vector(0, 0); - //eff->hitPerc = 0; - eff->touching = false; } void Element::updateEffects(float dt) @@ -110,6 +106,7 @@ void Element::updateEffects(float dt) if (eff->touching) { + eff->touching = false; float ramp = eff->touchVel.getLength2D()/800.0f; if (ramp < 0) ramp = 0; if (ramp > 1) ramp = 1; diff --git a/Aquaria/Entity.cpp b/Aquaria/Entity.cpp index b34b0af..39e9c55 100644 --- a/Aquaria/Entity.cpp +++ b/Aquaria/Entity.cpp @@ -26,6 +26,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "Avatar.h" #include "ScriptedEntity.h" #include "Shot.h" +#include "PathFinding.h" //Shader Entity::blurShader; @@ -254,7 +255,7 @@ Entity::Entity() //debugLog("dsq->addEntity()"); dsq->addEntity(this); - maxSpeed = oldMaxSpeed = 300; + maxSpeed = 300; entityDead = false; health = maxHealth = 5; invincibleBreak = false; @@ -439,43 +440,45 @@ void Entity::setName(const std::string &name) this->name = name; } -void Entity::followPath(Path *p, int speedType, int dir, bool deleteOnEnd) +float Entity::followPath(Path *p, float speed, int dir, bool deleteOnEnd) { - if (p) - { - deleteOnPathEnd = deleteOnEnd; + if(!speed) + speed = getMaxSpeed(); + deleteOnPathEnd = deleteOnEnd; - position.stopPath(); - position.ensureData(); - position.data->path.clear(); - if (dir) + position.stopPath(); + position.ensureData(); + position.data->path.clear(); + if (dir) + { + for (int i = p->nodes.size()-1; i >=0; i--) { - for (int i = p->nodes.size()-1; i >=0; i--) - { - PathNode pn = p->nodes[i]; - position.data->path.addPathNode(pn.position, 1.0f-(float(i/float(p->nodes.size())))); - } + PathNode pn = p->nodes[i]; + position.data->path.addPathNode(pn.position, 1.0f-(float(i/float(p->nodes.size())))); } - else - { - for (int i = 0; i < p->nodes.size(); i++) - { - PathNode pn = p->nodes[i]; - position.data->path.addPathNode(pn.position, float(i/float(p->nodes.size()))); - } - } - //debugLog("Calculating Time"); - float time = position.data->path.getLength()/(float)dsq->continuity.getSpeedType(speedType); - //debugLog("Starting"); - position.data->path.getPathNode(0)->value = position; - position.startPath(time);//, 1.0f/2.0f); } + else + { + for (int i = 0; i < p->nodes.size(); i++) + { + PathNode pn = p->nodes[i]; + position.data->path.addPathNode(pn.position, float(i/float(p->nodes.size()))); + } + } + //debugLog("Calculating Time"); + float time = position.data->path.getLength()/speed; + //debugLog("Starting"); + position.data->path.getPathNode(0)->value = position; + position.startPath(time);//, 1.0f/2.0f); + return time; } -void Entity::moveToNode(Path *path, int speedType, int dieOnPathEnd, bool swim) +float Entity::moveToPos(Vector dest, float speed, int dieOnPathEnd, bool swim) { + if(!speed) + speed = getMaxSpeed(); + Vector start = position; - Vector dest = path->nodes[0].position; followEntity = 0; //watchingEntity = 0; @@ -485,10 +488,10 @@ void Entity::moveToNode(Path *path, int speedType, int dieOnPathEnd, bool swim) swimPath = swim; //debugLog("Generating path to: " + path->name); - dsq->pathFinding.generatePath(this, TileVector(start), TileVector(dest)); - int sz = position.data->path.getNumPathNodes(); - position.data->path.addPathNode(path->nodes[0].position, 1); - VectorPath old = position.data->path; + PathFinding::generatePath(this, TileVector(start), TileVector(dest)); + //int sz = position.data->path.getNumPathNodes(); + //position.data->path.addPathNode(path->nodes[0].position, 1); + //VectorPath old = position.data->path; /*std::ostringstream os; os << "Path length: " << sz; debugLog(os.str());*/ @@ -509,16 +512,16 @@ void Entity::moveToNode(Path *path, int speedType, int dieOnPathEnd, bool swim) //debugLog("Molesting Path"); - dsq->pathFinding.molestPath(position.data->path); + PathFinding::molestPath(position.data->path); //position.data->path.realPercentageCalc(); //position.data->path.cut(4); //debugLog("forcing path to minimum 2 nodes"); - dsq->pathFinding.forceMinimumPath(position.data->path, start, dest); + PathFinding::forceMinimumPath(position.data->path, start, dest); //debugLog("Done"); //debugLog("Calculating Time"); - float time = position.data->path.getLength()/(float)dsq->continuity.getSpeedType(speedType); + float time = position.data->path.getLength()/speed; //debugLog("Starting"); position.data->path.getPathNode(0)->value = position; position.startPath(time);//, 1.0f/2.0f); @@ -535,6 +538,8 @@ void Entity::moveToNode(Path *path, int speedType, int dieOnPathEnd, bool swim) //position.startSpeedPath(dsq->continuity.getSpeedType(speedType)); //position.startPath(((position.data->path.getNumPathNodes()*TILE_SIZE*4)-2)/dsq->continuity.getSpeedType(speedType)); + + return time; } void Entity::stopFollowingPath() @@ -1009,7 +1014,7 @@ bool Entity::isNearObstruction(int sz, int type, TileVector *hitTile) return v; } -bool Entity::touchAvatarDamage(int radius, float dmg, const Vector &override, int speed, float pushTime, Vector collidePos) +bool Entity::touchAvatarDamage(int radius, float dmg, const Vector &override, float speed, float pushTime, Vector collidePos) { if (isv(EV_BEASTBURST, 1) && isDamageTarget(DT_AVATAR_BITE) && dsq->continuity.form == FORM_BEAST && dsq->game->avatar->bursting) { @@ -1150,7 +1155,7 @@ void Entity::update(float dt) Vector backupPos = position; Vector backupVel = vel; - bool doUpdate = (updateCull == -1 || (position - core->screenCenter).isLength2DIn(updateCull)); + bool doUpdate = (updateCull < 0 || (position - core->screenCenter).isLength2DIn(updateCull)); if (doUpdate && !(pauseFreeze && dsq->game->isPaused())) { @@ -2212,7 +2217,7 @@ bool Entity::isUnderWater(const Vector &override) return false; } -void Entity::push(const Vector &vec, float time, int maxSpeed, float dmg) +void Entity::push(const Vector &vec, float time, float maxSpeed, float dmg) { if (!this->isEntityDead()) { @@ -2233,9 +2238,9 @@ void Entity::push(const Vector &vec, float time, int maxSpeed, float dmg) //vel += pushVec; } -void Entity::setMaxSpeed(int ms) +void Entity::setMaxSpeed(float ms) { - maxSpeed = oldMaxSpeed = ms; + maxSpeed = ms; } int Entity::getMaxSpeed() @@ -2394,11 +2399,6 @@ void Entity::onEnterState(int action) { switch (action) { - case STATE_IDLE: - { - maxSpeed = oldMaxSpeed; - } - break; case STATE_DEAD: { if (!isGoingToBeEaten()) @@ -3019,7 +3019,7 @@ void Entity::shotHitEntity(Entity *hit, Shot *shot, Bone *b) { } -bool Entity::doCollisionAvoidance(float dt, int search, float mod, Vector *vp, int overrideMaxSpeed, int ignoreObs, bool onlyVP) +bool Entity::doCollisionAvoidance(float dt, int search, float mod, Vector *vp, float overrideMaxSpeed, int ignoreObs, bool onlyVP) { Vector accum; int c = 0; diff --git a/Aquaria/Entity.h b/Aquaria/Entity.h index e7d8d97..7532125 100644 --- a/Aquaria/Entity.h +++ b/Aquaria/Entity.h @@ -28,6 +28,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "DSQ.h" #include "Path.h" #include "Hair.h" +#include "TileVector.h" #include "tinyxml2.h" using namespace tinyxml2; @@ -232,7 +233,7 @@ public: void heal(float a, int type=0); - void push(const Vector &vec, float time, int maxSpeed, float dmg); + void push(const Vector &vec, float time, float maxSpeed, float dmg); bool canSetState(int state); @@ -311,9 +312,9 @@ public: }; virtual void onNotify(Entity *notify){} //void followPath(Path *p, int spd, int loop, bool deleteOnEnd = false); - void followPath(Path *p, int speedType, int dir, bool deleteOnEnd = false); + float followPath(Path *p, float speed, int dir, bool deleteOnEnd = false); Entity *attachedTo; - bool touchAvatarDamage(int radius, float dmg, const Vector &override=Vector(-1,-1,-1), int speed=0, float pushTime = 0, Vector collidePos = Vector(0,0,0)); + bool touchAvatarDamage(int radius, float dmg, const Vector &override=Vector(-1,-1,-1), float speed=0, float pushTime = 0, Vector collidePos = Vector(0,0,0)); void moveTowards(Vector p, float dt, int spd); void moveAround(Vector p, float dt, int spd, int d); @@ -326,10 +327,10 @@ public: void moveAroundEntity(float dt, int spd, int d, Entity *e); void moveTowardsGroupCenter(float dt, int spd); void moveTowardsGroupHeading(float dt, int spd); - bool doCollisionAvoidance(float dt, int search, float mod, Vector *v = 0, int overrideMaxSpeed=0, int ignoreObs=0, bool onlyVP=false); + bool doCollisionAvoidance(float dt, int search, float mod, Vector *v = 0, float overrideMaxSpeed=0, int ignoreObs=0, bool onlyVP=false); void doSpellAvoidance(float dt, int range, float mod); void doEntityAvoidance(float dt, int range, float mod, Entity *ignore =0); - void setMaxSpeed(int ms); + void setMaxSpeed(float ms); Entity *findTarget(int dist, int type, int t=0); //bool hasTarget() { return target != 0; } bool hasTarget(int t=0); @@ -352,7 +353,7 @@ public: void overideMaxSpeed(int ms, float time); void disableOverideMaxSpeed(); int currentEntityTarget; - void moveToNode(Path *path, int speedType, int dieOnPathEnd=0, bool swim = false); + float moveToPos(Vector pos, float speed, int dieOnPathEnd=0, bool swim = false); bool isHit(); bool pathBurst(bool wallJump = false); Timer burstTimer; @@ -598,7 +599,7 @@ protected: void updateBoneLock(); - int pushMaxSpeed; + float pushMaxSpeed; std::string currentAnim; @@ -609,8 +610,7 @@ protected: private: - int maxSpeed; - int oldMaxSpeed; + float maxSpeed; bool stopSoundsOnDeath; diff --git a/Aquaria/Game.cpp b/Aquaria/Game.cpp index 17b450c..824e8d2 100644 --- a/Aquaria/Game.cpp +++ b/Aquaria/Game.cpp @@ -42,8 +42,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. std::vector allowedMaps; -const int PATH_ACTIVATION_RANGE = 800; - Vector worldLeftCenter(217,250), worldRightCenter(575, 250); Vector opt_save_original = Vector(350, 350), opt_cancel_original = Vector(450, 350); @@ -3384,12 +3382,14 @@ void Game::createInGameMenu() resolutionLabel->position = Vector(160, 260); options->addChild(resolutionLabel, PM_POINTER); - resBox = new AquariaComboBox(); + resBox = new AquariaComboBox(Vector(0.7f, 1.0f)); resBox->position = Vector(196, 285); for (i = 0; i < core->screenModes.size(); i++) { std::ostringstream os; os << core->screenModes[i].x << "x" << core->screenModes[i].y; + if(core->screenModes[i].hz) + os << " (" << core->screenModes[i].hz << "hz)"; resBox->addItem(os.str()); if (core->screenModes[i].x == dsq->user.video.resx && core->screenModes[i].y == dsq->user.video.resy) { @@ -5910,22 +5910,14 @@ void Game::rebuildElementUpdateList() elementUpdateList.clear(); elementInteractionList.clear(); for (int i = 0; i < dsq->getNumElements(); i++) - //for (int i = LR_ELEMENTS1; i <= LR_ELEMENTS8; i++) { - //RenderObjectLayer *rl = dsq->getRenderObjectLayer(i); Element *e = dsq->getElement(i); - if (e && e->layer >= LR_ELEMENTS1 && e->layer <= LR_ELEMENTS8) - { - if (e->getElementEffectIndex() != -1) - { - elementUpdateList.push_back(e); - } - ElementEffect ee = dsq->getElementEffectByIndex(e->getElementEffectIndex()); - if(ee.type == EFX_WAVY) - { - elementInteractionList.push_back(e); - } - } + const int eeidx = e->getElementEffectIndex(); + if (eeidx != -1 && e->layer >= LR_ELEMENTS1 && e->layer <= LR_ELEMENTS8) + elementUpdateList.push_back(e); + ElementEffect ee = dsq->getElementEffectByIndex(eeidx); + if(ee.type == EFX_WAVY) + elementInteractionList.push_back(e); } } @@ -6460,18 +6452,9 @@ void Game::applyState() } #endif - worldMapRender = 0; - dsq->continuity.worldMap.revealMap(sceneToLoad); - - debugLog("Creating WorldMapRender"); - if(dsq->mod.isActive() && dsq->mod.mapRevealMethod != REVEAL_UNSPECIFIED) - WorldMapRender::setRevealMethod(dsq->mod.mapRevealMethod); - else - WorldMapRender::setRevealMethod((WorldMapRevealMethod)dsq->user.video.worldMapRevealMethod); - - worldMapRender = new WorldMapRender; - addRenderObject(worldMapRender, LR_WORLDMAP); - +/* + if (liFlag == 100) + */ if (verbose) debugLog("Creating Avatar"); avatar = new Avatar(); @@ -6535,6 +6518,8 @@ void Game::applyState() if (verbose) debugLog("...Done"); backupSceneColor = sceneColor; + dsq->continuity.worldMap.revealMap(sceneName); + colorTest(); if (!warpAreaType.empty()) @@ -6663,6 +6648,18 @@ void Game::applyState() timerText->followCamera = 1; addRenderObject(timerText, LR_MINIMAP); + worldMapRender = 0; + + if(dsq->mod.isActive() && dsq->mod.mapRevealMethod != REVEAL_UNSPECIFIED) + WorldMapRender::setRevealMethod(dsq->mod.mapRevealMethod); + else + WorldMapRender::setRevealMethod((WorldMapRevealMethod)dsq->user.video.worldMapRevealMethod); + + worldMapRender = new WorldMapRender; + addRenderObject(worldMapRender, LR_WORLDMAP); + // to hide minimap + //miniMapRender->position += Vector(800,0); + sceneToLoad=""; if (!fromScene.empty()) @@ -9328,7 +9325,7 @@ void Game::toggleKeyConfigMenu(bool f) //group_keyConfig->children[group_keyConfig->children.size()-3] - RenderObjectList::reverse_iterator i = group_keyConfig->children.rbegin(); + RenderObject::Children::reverse_iterator i = group_keyConfig->children.rbegin(); AquariaKeyConfig *upright0 = (AquariaKeyConfig*)(*i); i++; AquariaKeyConfig *upright = (AquariaKeyConfig*)(*i); @@ -10372,7 +10369,7 @@ void Game::update(float dt) { Vector diff = p->nodes[0].position - dsq->game->avatar->position; - if (p->isCoordinateInside(dsq->game->avatar->position) || diff.getSquaredLength2D() < sqr(PATH_ACTIVATION_RANGE)) + if (p->isCoordinateInside(dsq->game->avatar->position) || diff.getSquaredLength2D() < sqr(p->activationRange)) { //if (trace(avatar->position, p->nodes[0].position)) { @@ -10819,6 +10816,7 @@ void Game::removeState() core->particlesPaused = false; elementUpdateList.clear(); + elementInteractionList.clear(); dsq->setCursor(CURSOR_NORMAL); dsq->darkLayer.toggle(0); diff --git a/Aquaria/MiniMapRender.cpp b/Aquaria/MiniMapRender.cpp index 5e0d24b..d952e89 100644 --- a/Aquaria/MiniMapRender.cpp +++ b/Aquaria/MiniMapRender.cpp @@ -66,14 +66,14 @@ namespace MiniMapRenderSpace const int healthMarkerSize = 20; - Texture *texCook = 0; - Texture *texWaterBit = 0; - Texture *texMinimapBtm = 0; - Texture *texMinimapTop = 0; - Texture *texRipple = 0; - Texture *texNaija = 0; - Texture *texHealthBar = 0; - Texture *texMarker = 0; + CountedPtr texCook = 0; + CountedPtr texWaterBit = 0; + CountedPtr texMinimapBtm = 0; + CountedPtr texMinimapTop = 0; + CountedPtr texRipple = 0; + CountedPtr texNaija = 0; + CountedPtr texHealthBar = 0; + CountedPtr texMarker = 0; float waterSin = 0; diff --git a/Aquaria/ModSelector.cpp b/Aquaria/ModSelector.cpp index 2a48670..3f95a16 100644 --- a/Aquaria/ModSelector.cpp +++ b/Aquaria/ModSelector.cpp @@ -640,8 +640,7 @@ bool ModIconOnline::fixIcon() quad->setDecayRate(2); quad = 0; } - useQuad(iconfile); - result = Texture::textureError == TEXERR_OK; + result = useQuad(iconfile); } if(!quad) { diff --git a/Aquaria/Path.cpp b/Aquaria/Path.cpp index 3b1bc1f..5763e91 100644 --- a/Aquaria/Path.cpp +++ b/Aquaria/Path.cpp @@ -54,6 +54,7 @@ Path::Path() warpType = 0; spiritFreeze = true; pauseFreeze = true; + activationRange = 800; } void Path::clampPosition(Vector *pos, float radius) @@ -450,14 +451,23 @@ void Path::refreshScript() //core->removeRenderObject(&emitter, Core::DO_NOT_DESTROY_RENDER_OBJECT); //core->getTopStateData()->addRenderObject(&emitter, LR_PARTICLES); - if (emitter) - { - emitter->safeKill(); - emitter = 0; - } + setEmitter(particleEffect); + } +} + +void Path::setEmitter(const std::string& name) +{ + if (emitter) + { + emitter->safeKill(); + emitter = 0; + } + if(!name.empty()) + { emitter = new ParticleEffect; - emitter->load(particleEffect); - emitter->start(); + emitter->load(name); + if(active) + emitter->start(); if (!nodes.empty()) { emitter->position = nodes[0].position; diff --git a/Aquaria/Path.h b/Aquaria/Path.h index 203ee92..170ff65 100644 --- a/Aquaria/Path.h +++ b/Aquaria/Path.h @@ -89,6 +89,7 @@ public: void update(float dt); void setActive(bool v); bool action(int id, int state); + void setEmitter(const std::string& name); PathNode *getPathNode(int idx); bool isCoordinateInside(const Vector &pos, int rad=0); @@ -144,6 +145,7 @@ public: bool pauseFreeze; PathShape pathShape; + float activationRange; void parseWarpNodeData(const std::string &dataString); diff --git a/Aquaria/PathFinding.cpp b/Aquaria/PathFinding.cpp index 3a0f69e..ee450b7 100644 --- a/Aquaria/PathFinding.cpp +++ b/Aquaria/PathFinding.cpp @@ -24,6 +24,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "DSQ.h" #include "Game.h" + class SearchGridRaw { public: @@ -33,11 +34,19 @@ public: return (game->getGridRaw(TileVector(x, y)) & blockingObsBits) == OT_EMPTY; } -private: - const ObsType blockingObsBits; + ObsType blockingObsBits; const Game *game; }; +class PathFinding::State : public ScriptObject +{ +public: + State(ObsType obs) : grid(obs), searcher(grid), result(JPS::NO_PATH) {} + SearchGridRaw grid; + JPS::Searcher searcher; + JPS::Result result; +}; + static void generateVectorPath(const JPS::PathVector& rawpath, VectorPath& vp, int offx, int offy) { for(JPS::PathVector::const_iterator it = rawpath.begin(); it != rawpath.end(); ++it) @@ -124,7 +133,7 @@ void PathFinding::molestPath(VectorPath &path) lastSuccessNode = 0; hadSuccess = false; Vector node = path.getPathNode(i)->value; - for (int j = sz-3; j >= i+adjust; j--) + for (int j = sz-1; j >= i+adjust; j--) { Vector target = path.getPathNode(j)->value; if (dsq->game->trace(node, target)) @@ -183,3 +192,55 @@ bool PathFinding::generatePathSimple(VectorPath& path, const Vector& start, cons molestPath(path); return true; } + +PathFinding::State *PathFinding::initFindPath() +{ + State *state = new PathFinding::State(OT_BLOCKING); + return state; +} + +void PathFinding::deleteFindPath(State *state) +{ + delete state; +} + +void PathFinding::beginFindPath(PathFinding::State *state, const Vector& start, const Vector& end, unsigned int obs /* = 0 */) +{ + if(obs == OT_EMPTY) + obs = OT_BLOCKING; + + state->grid.blockingObsBits = (ObsType)obs; + JPS::Position istart = JPS::Pos(start.x, start.y); + JPS::Position iend = JPS::Pos(end.x, end.y); + state->result = state->searcher.findPathInit(istart, iend); +} + +bool PathFinding::updateFindPath(PathFinding::State *state, int limit) +{ + int oldres = state->result; + if(oldres == JPS::NEED_MORE_STEPS) + { + state->result = state->searcher.findPathStep(limit); + return oldres != state->result; + } + return true; // done +} + +bool PathFinding::finishFindPath(PathFinding::State *state, VectorPath& path, unsigned step /* = 0 */) +{ + if(state->result != JPS::FOUND_PATH) + return false; + + JPS::PathVector rawpath; + state->searcher.findPathFinish(rawpath, step); + generateVectorPath(rawpath, path, 0, 0); + molestPath(path); + return true; +} + +void PathFinding::getStats(PathFinding::State *state, unsigned& stepsDone, unsigned& nodesExpanded) +{ + stepsDone = (unsigned)state->searcher.getStepsDone(); + nodesExpanded = (unsigned)state->searcher.getNodesExpanded(); +} + diff --git a/Aquaria/PathFinding.h b/Aquaria/PathFinding.h index 7920cbb..1193afb 100644 --- a/Aquaria/PathFinding.h +++ b/Aquaria/PathFinding.h @@ -30,14 +30,23 @@ class RenderObject; class SearchGrid; class Game; -class PathFinding +namespace PathFinding { -public: + class State; + void forceMinimumPath(VectorPath &path, const Vector &start, const Vector &dest); void molestPath(VectorPath &path); void generatePath(RenderObject *go, TileVector g1, TileVector g2, int offx=0, int offy=0); bool generatePathSimple(VectorPath& path, const Vector& start, const Vector& end, unsigned int step = 0, unsigned int obs = 0); + + State *initFindPath(); + void deleteFindPath(State *state); + + void beginFindPath(State *state, const Vector& start, const Vector& end, unsigned int obs = 0); + bool updateFindPath(State *state, int limit); + bool finishFindPath(State *state, VectorPath& path, unsigned step = 0); + void getStats(State *state, unsigned& stepsDone, unsigned& nodesExpanded); }; #endif diff --git a/Aquaria/SchoolFish.cpp b/Aquaria/SchoolFish.cpp index 988e810..38005f6 100644 --- a/Aquaria/SchoolFish.cpp +++ b/Aquaria/SchoolFish.cpp @@ -23,19 +23,19 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "Avatar.h" #include "../BBGE/AfterEffect.h" -float strengthSeparation = 1; -float strengthAlignment = 0.8; -float strengthAvoidance = 1; -float strengthCohesion = 0.5; +const float strengthSeparation = 1; +const float strengthAlignment = 0.8f; +const float strengthAvoidance = 1; +const float strengthCohesion = 0.5f; -float avoidanceDistance = 128; -float separationDistance = 128; -float minUrgency = 5;//0.05; -float maxUrgency = 10;//0.1; -float maxSpeed = 400; // 1 -float maxChange = maxSpeed*maxUrgency; +const float avoidanceDistance = 128; +const float separationDistance = 128; +const float minUrgency = 5;//0.05; +const float maxUrgency = 10;//0.1; +const float maxSpeed = 400; // 1 +const float maxChange = maxSpeed*maxUrgency; -float velocityScale = 1; +const float velocityScale = 1; SchoolFish::SchoolFish(const std::string &texname) : FlockEntity() diff --git a/Aquaria/ScriptInterface.cpp b/Aquaria/ScriptInterface.cpp index 04950c5..3e6202c 100644 --- a/Aquaria/ScriptInterface.cpp +++ b/Aquaria/ScriptInterface.cpp @@ -36,7 +36,9 @@ extern "C" #include "Web.h" #include "GridRender.h" #include "AfterEffect.h" +#include "PathFinding.h" #include +#include "Gradient.h" #include "../BBGE/MathFunctions.h" @@ -874,7 +876,26 @@ luaFunc(fileExists) safePath(L, s); std::string res; bool there = findFile_helper(s.c_str(), res); - luaReturnBool(there); + lua_pushboolean(L, there); + lua_pushstring(L, res.c_str()); + return 2; +} + +luaFunc(getModName) +{ + luaReturnStr(dsq->mod.isActive() ? dsq->mod.getName().c_str() : ""); +} + +luaFunc(getModPath) +{ + std::string path; + if (dsq->mod.isActive()) + { + path = dsq->mod.getPath(); + if(path[path.length() - 1] != '/') + path += '/'; + } + luaReturnStr(path.c_str()); } @@ -890,6 +911,7 @@ MakeTypeCheckFunc(isNode, SCO_PATH); MakeTypeCheckFunc(isObject, SCO_RENDEROBJECT); MakeTypeCheckFunc(isEntity, SCO_ENTITY) MakeTypeCheckFunc(isScriptedEntity, SCO_SCRIPTED_ENTITY) +MakeTypeCheckFunc(isBone, SCO_BONE) MakeTypeCheckFunc(isShot, SCO_SHOT) MakeTypeCheckFunc(isWeb, SCO_WEB) MakeTypeCheckFunc(isIng, SCO_INGREDIENT) @@ -1110,9 +1132,7 @@ luaFunc(obj_setBlendType) luaFunc(obj_setTexture) { RenderObject *r = robj(L); - if (r) - r->setTexture(getString(L, 2)); - luaReturnNil(); + luaReturnBool(r ? r->setTexture(getString(L, 2)) : false); } luaFunc(obj_getTexture) @@ -1179,6 +1199,7 @@ luaFunc(obj_addChild) RenderObject *r = robj(L); RenderObject *which = robj(L, 2); bool takeOwnership = getBool(L, 3); + bool front = getBool(L, 4); if (r && which) { if (takeOwnership) @@ -1188,7 +1209,7 @@ luaFunc(obj_addChild) dsq->getState(dsq->game->name)->removeRenderObjectFromList(which); which->setStateDataObject(NULL); core->removeRenderObject(which, Core::DO_NOT_DESTROY_RENDER_OBJECT); - r->addChild(which, PM_POINTER); + r->addChild(which, PM_POINTER, RBP_NONE, front ? CHILD_FRONT : CHILD_BACK); } else r->addChild(which, PM_STATIC); @@ -1541,10 +1562,15 @@ luaFunc(obj_setUpdateCull) { RenderObject *r = robj(L);; if (r) - r->updateCull = lua_tointeger(L, 2); + r->updateCull = lua_tonumber(L, 2); luaReturnNil(); } +luaFunc(obj_getUpdateCull) +{ + RenderObject *r = robj(L);; + luaReturnNum(r ? r->updateCull : 0.0f); +} luaFunc(obj_setPositionX) { @@ -1832,6 +1858,7 @@ luaFunc(quad_getBorderAlpha) RO_FUNC(getter, prefix, setCull ) \ RO_FUNC(getter, prefix, setCullRadius ) \ RO_FUNC(getter, prefix, setUpdateCull ) \ + RO_FUNC(getter, prefix, getUpdateCull ) \ RO_FUNC(getter, prefix, setRenderPass ) \ RO_FUNC(getter, prefix, setOverrideRenderPass ) \ RO_FUNC(getter, prefix, setPositionX ) \ @@ -3129,6 +3156,11 @@ luaFunc(createShot) luaReturnPtr(s); } +luaFunc(isSkippingCutscene) +{ + luaReturnBool(dsq->isSkippingCutscene()); +} + // deprecated, use entity_playSfx luaFunc(entity_sound) { @@ -3318,45 +3350,67 @@ luaFunc(entity_moveToNode) { Entity *e = entity(L); Path *p = path(L, 2); + float time = 0; if (e && p) { - e->moveToNode(p, lua_tointeger(L, 3), lua_tointeger(L, 4), 0); + float speed = dsq->continuity.getSpeedType(lua_tointeger(L, 3)); + time = e->moveToPos(p->nodes[0].position, speed, lua_tointeger(L, 4), 0); } - luaReturnNil(); + luaReturnNum(time); } luaFunc(entity_swimToNode) { Entity *e = entity(L); Path *p = path(L, 2); + float time = 0; if (e && p) { - e->moveToNode(p, lua_tointeger(L, 3), lua_tointeger(L, 4), 1); - /* - ScriptedEntity *se = dynamic_cast(e); - se->swimPath = true; - */ + float speed = dsq->continuity.getSpeedType(lua_tointeger(L, 3)); + time = e->moveToPos(p->nodes[0].position, speed, lua_tointeger(L, 4), 1); } - luaReturnNil(); + luaReturnNum(time); } luaFunc(entity_swimToPosition) { Entity *e = entity(L); - //Path *p = path(L, 2); - Path p; - PathNode n; - n.position = Vector(lua_tonumber(L, 2), lua_tonumber(L, 3)); - p.nodes.push_back(n); + float time = 0; if (e) { - e->moveToNode(&p, lua_tointeger(L, 4), lua_tointeger(L, 5), 1); - /* - ScriptedEntity *se = dynamic_cast(e); - se->swimPath = true; - */ + float speed = dsq->continuity.getSpeedType(lua_tointeger(L, 4)); + time = e->moveToPos(Vector(lua_tonumber(L, 2), lua_tonumber(L, 3)), speed, lua_tointeger(L, 5), 1); } - luaReturnNil(); + luaReturnNum(time); +} + +luaFunc(entity_moveToNodeSpeed) +{ + Entity *e = entity(L); + Path *p = path(L, 2); + float time = 0; + if (e && p) + time = e->moveToPos(p->nodes[0].position, lua_tonumber(L, 3), lua_tointeger(L, 4), 0); + luaReturnNum(time); +} + +luaFunc(entity_swimToNodeSpeed) +{ + Entity *e = entity(L); + Path *p = path(L, 2); + float time = 0; + if (e && p) + time = e->moveToPos(p->nodes[0].position, lua_tonumber(L, 3), lua_tointeger(L, 4), 1); + luaReturnNum(time); +} + +luaFunc(entity_swimToPositionSpeed) +{ + Entity *e = entity(L); + float time = 0; + if (e) + time = e->moveToPos(Vector(lua_tonumber(L, 2), lua_tonumber(L, 3)), lua_tonumber(L, 4), lua_tointeger(L, 5), 1); + luaReturnNum(time); } @@ -3642,15 +3696,30 @@ luaFunc(loadMap) luaFunc(entity_followPath) { Entity *e = entity(L); + float time = 0; if (e) { Path *p = path(L, 2); int speedType = lua_tointeger(L, 3); int dir = lua_tointeger(L, 4); - - e->followPath(p, speedType, dir); + float speed = dsq->continuity.getSpeedType(speedType); + time = e->followPath(p, speed, dir); } - luaReturnNil(); + luaReturnNum(time); +} + +luaFunc(entity_followPathSpeed) +{ + Entity *e = entity(L); + float time = 0; + if (e) + { + Path *p = path(L, 2); + float speed = lua_tonumber(L, 3); + int dir = lua_tointeger(L, 4); + time = e->followPath(p, speed, dir); + } + luaReturnNum(time); } luaFunc(spawnIngredient) @@ -4846,12 +4915,13 @@ luaFunc(getWallNormal) x = lua_tonumber(L, 1); y = lua_tonumber(L, 2); int range = lua_tointeger(L, 3); + int obs = lua_tointeger(L, 4); if (range == 0) - { range = 5; - } + if (!obs) + obs = OT_BLOCKING; - Vector n = dsq->game->getWallNormal(Vector(x, y), range); + Vector n = dsq->game->getWallNormal(Vector(x, y), range, NULL, obs); luaReturnVec2(n.x, n.y); } @@ -4905,6 +4975,21 @@ luaFunc(getStringFlag) luaReturnStr(dsq->continuity.getStringFlag(getString(L, 1)).c_str()); } +luaFunc(node_setEmitter) +{ + Path *p = path(L); + if(p) + p->setEmitter(getString(L, 2)); + luaReturnPtr(p->emitter); +} + +luaFunc(node_getEmitter) +{ + Path *p = path(L); + luaReturnPtr(p ? p->emitter : NULL); +} + + luaFunc(node_setActive) { Path *p = path(L); @@ -4912,6 +4997,13 @@ luaFunc(node_setActive) if (p) { p->active = v; + if(p->emitter) + { + if(v) + p->emitter->start(); + else + p->emitter->stop(); + } } luaReturnNil(); } @@ -4933,6 +5025,14 @@ luaFunc(node_setCursorActivation) luaReturnNil(); } +luaFunc(node_setActivationRange) +{ + Path *p = path(L); + if(p) + p->activationRange = lua_tonumber(L, 2); + luaReturnNil(); +} + luaFunc(node_setCatchActions) { Path *p = path(L); @@ -5523,7 +5623,7 @@ luaFunc(entity_doElementInteraction) if (!touchWidth) touchWidth = 16; - ElementUpdateList& elems = dsq->game->elementUpdateList; + ElementUpdateList& elems = dsq->game->elementInteractionList; for (ElementUpdateList::iterator it = elems.begin(); it != elems.end(); ++it) { (*it)->doInteraction(e, mult, touchWidth); @@ -6027,7 +6127,7 @@ luaFunc(entity_setMaxSpeed) { Entity *e = entity(L); if (e) - e->setMaxSpeed(lua_tointeger(L, 2)); + e->setMaxSpeed(lua_tonumber(L, 2)); luaReturnNil(); } @@ -6478,7 +6578,7 @@ luaFunc(playSfx) if (sfx.vol <= 0) sfx.vol = 1; sfx.loops = lua_tointeger(L, 4); - if(lua_isnumber(L, 6) && lua_isnumber(L, 7)) + if(lua_isnumber(L, 5) && lua_isnumber(L, 6)) { sfx.x = lua_tonumber(L, 5); sfx.y = lua_tonumber(L, 6); @@ -7862,7 +7962,7 @@ luaFunc(entity_offsetUpdate) Entity *e = entity(L); if (e) { - int uc = e->updateCull; + float uc = e->updateCull; e->updateCull = -1; float t = float(rand()%10000)/1000.0f; e->update(t); @@ -8385,6 +8485,44 @@ luaFunc(setGemPosition) luaReturnBool(result); } +luaFunc(setGemName) +{ + int gemId = lua_tointeger(L, 1); + bool result = false; + + if(gemId >= 0 && gemId < dsq->continuity.gems.size()) + { + Continuity::Gems::iterator it = dsq->continuity.gems.begin(); + std::advance(it, gemId); + GemData& gem = *it; + gem.name = getString(L, 2); + result = true; + } + else + debugLog("setGemName: invalid index"); + + luaReturnBool(result); +} + +luaFunc(setGemBlink) +{ + int gemId = lua_tointeger(L, 1); + bool result = false; + + if(gemId >= 0 && gemId < dsq->continuity.gems.size()) + { + Continuity::Gems::iterator it = dsq->continuity.gems.begin(); + std::advance(it, gemId); + GemData& gem = *it; + gem.blink = getBool(L, 2); + result = true; + } + else + debugLog("setGemBlink: invalid index"); + + luaReturnBool(result); +} + luaFunc(removeGem) { int gemId = lua_tointeger(L, 1); @@ -8647,7 +8785,7 @@ luaFunc(avatar_updatePosition) luaFunc(avatar_toggleMovement) { - dsq->game->avatar->toggleMovement((bool)lua_tointeger(L, 1)); + dsq->game->avatar->toggleMovement(getBool(L)); luaReturnNil(); } @@ -8729,6 +8867,43 @@ luaFunc(isShuttingDownGameState) luaReturnBool(dsq->game->isShuttingDownGameState()); } +static void _fillPathfindTables(lua_State *L, VectorPath& path, int xs_idx, int ys_idx) +{ + const unsigned num = path.getNumPathNodes(); + + if(lua_istable(L, xs_idx)) + lua_pushvalue(L, xs_idx); + else + lua_createtable(L, num, 0); + + if(lua_istable(L, ys_idx)) + lua_pushvalue(L, ys_idx); + else + lua_createtable(L, num, 0); + + // [..., xs, yx] + for(unsigned i = 0; i < num; ++i) + { + const VectorPathNode *n = path.getPathNode(i); + lua_pushnumber(L, n->value.x); // [..., xs, ys, x] + lua_rawseti(L, -3, i+1); // [..., xs, ys] + lua_pushnumber(L, n->value.y); // [..., xs, ys, y] + lua_rawseti(L, -2, i+1); // [..., xs, ys] + } + // terminate tables + lua_pushnil(L); // [..., xs, ys, nil] + lua_rawseti(L, -3, num+1); // [..., xs, ys] + lua_pushnil(L); // [..., xs, ys, nil] + lua_rawseti(L, -2, num+1); // [..., xs, ys] +} + +static int _pathfindDelete(lua_State *L) +{ + PathFinding::State *state = *(PathFinding::State**)luaL_checkudata(L, 1, "pathfinder"); + PathFinding::deleteFindPath(state); + return 0; +} + // startx, starty, endx, endy [, step, xtab, ytab, obsMask] luaFunc(findPath) { @@ -8736,55 +8911,81 @@ luaFunc(findPath) Vector start(lua_tonumber(L, 1), lua_tonumber(L, 2)); Vector end(lua_tonumber(L, 3), lua_tonumber(L, 4)); ObsType obs = ObsType(lua_tointeger(L, 8)); - if(!dsq->pathFinding.generatePathSimple(path, start, end, lua_tointeger(L, 5), obs)) + if(!PathFinding::generatePathSimple(path, start, end, lua_tointeger(L, 5), obs)) luaReturnBool(false); const unsigned num = path.getNumPathNodes(); lua_pushinteger(L, num); - if(lua_istable(L, 6)) - lua_pushvalue(L, 6); - else - lua_createtable(L, num, 0); - - if(lua_istable(L, 7)) - lua_pushvalue(L, 7); - else - lua_createtable(L, num, 0); - - // [true, xs, yx] - - for(unsigned i = 0; i < num; ++i) - { - const VectorPathNode *n = path.getPathNode(i); - lua_pushnumber(L, n->value.x); // [num, xs, ys, x] - lua_rawseti(L, -3, i+1); // [num, xs, ys] - lua_pushnumber(L, n->value.y); // [num, xs, ys, y] - lua_rawseti(L, -2, i+1); // [num, xs, ys] - } - // terminate tables - lua_pushnil(L); // [num xs, ys, nil] - lua_rawseti(L, -3, num+1); // [num, xs, ys] - lua_pushnil(L); // [num, xs, ys, nil] - lua_rawseti(L, -2, num+1); // [num, xs, ys] + _fillPathfindTables(L, path, 6, 7); return 3; // found path?, x positions, y positions } +luaFunc(createFindPath) +{ + PathFinding::State **statep = (PathFinding::State**)lua_newuserdata(L, sizeof(void*)); + *statep = PathFinding::initFindPath(); + luaL_getmetatable(L, "pathfinder"); + lua_setmetatable(L, -2); + return 1; +} + +luaFunc(findPathBegin) +{ + PathFinding::State *state = *(PathFinding::State**)luaL_checkudata(L, 1, "pathfinder"); + Vector start(lua_tonumber(L, 1), lua_tonumber(L, 2)); + Vector end(lua_tonumber(L, 3), lua_tonumber(L, 4)); + ObsType obs = ObsType(lua_tointeger(L, 8)); + PathFinding::beginFindPath(state, start, end, obs); + luaReturnNil(); +} + +luaFunc(findPathUpdate) +{ + PathFinding::State *state = *(PathFinding::State**)luaL_checkudata(L, 1, "pathfinder"); + int limit = lua_tointeger(L, 2); + bool done = PathFinding::updateFindPath(state, limit); + luaReturnBool(done); +} + +luaFunc(findPathFinish) +{ + PathFinding::State *state = *(PathFinding::State**)luaL_checkudata(L, 1, "pathfinder"); + VectorPath path; + bool found = PathFinding::finishFindPath(state, path); + if(!found) + luaReturnBool(false); + + lua_pushinteger(L, (int)path.getNumPathNodes()); + _fillPathfindTables(L, path, 2, 3); + return 3; +} + +luaFunc(findPathGetStats) +{ + PathFinding::State *state = *(PathFinding::State**)luaL_checkudata(L, 1, "pathfinder"); + unsigned stepsDone, nodesExpanded; + PathFinding::getStats(state, stepsDone, nodesExpanded); + lua_pushinteger(L, stepsDone); + lua_pushinteger(L, nodesExpanded); + return 2; +} + luaFunc(castLine) { Vector v(lua_tonumber(L, 1), lua_tonumber(L, 2)); Vector end(lua_tonumber(L, 3), lua_tonumber(L, 4)); int tiletype = lua_tointeger(L, 5); if(!tiletype) - tiletype = -1; + tiletype = OT_BLOCKING; Vector step = end - v; int steps = step.getLength2D() / TILE_SIZE; step.setLength2D(TILE_SIZE); for(int i = 0; i < steps; ++i) { - if(dsq->game->isObstructed(TileVector(v), tiletype)) + if(dsq->game->getGridRaw(TileVector(v)) & tiletype) { lua_pushinteger(L, dsq->game->getGrid(TileVector(v))); lua_pushnumber(L, v.x); @@ -8910,6 +9111,19 @@ luaFunc(learnRecipe) luaReturnNil(); } +luaFunc(setBGGradient) +{ + if(!dsq->game->grad) + dsq->game->createGradient(); + Vector c1(lua_tonumber(L, 1), lua_tonumber(L, 2), lua_tonumber(L, 3)); + Vector c2(lua_tonumber(L, 4), lua_tonumber(L, 5), lua_tonumber(L, 6)); + if(getBool(L, 7)) + dsq->game->grad->makeHorizontal(c1, c2); + else + dsq->game->grad->makeVertical(c1, c2); + luaReturnNil(); +} + luaFunc(createDebugText) { DebugFont *txt = new DebugFont(lua_tointeger(L, 2), getString(L, 1)); @@ -8967,6 +9181,12 @@ luaFunc(text_getHeight) luaReturnNum(txt ? txt->getHeight() : 0.0f); } +luaFunc(text_getStringWidth) +{ + BaseText *txt = getText(L); + luaReturnNum(txt ? txt->getStringWidth(getString(L, 2)) : 0.0f); +} + luaFunc(loadShader) { int handle = 0; @@ -9064,6 +9284,24 @@ luaFunc(pe_isRunning) luaReturnBool(pe && pe->isRunning()); } +luaFunc(getPerformanceCounter) +{ +#ifdef BBGE_BUILD_SDL2 + luaReturnNum((lua_Number)SDL_GetPerformanceCounter()); +#else + luaReturnNum((lua_Number)SDL_GetTicks()); +#endif +} + +luaFunc(getPerformanceFreq) +{ +#ifdef BBGE_BUILD_SDL2 + luaReturnNum((lua_Number)SDL_GetPerformanceFrequency()); +#else + luaReturnNum((lua_Number)1000); +#endif +} + //-------------------------------------------------------------------------------------------- #define luaRegister(func) {#func, l_##func} @@ -9078,6 +9316,8 @@ static const struct { {"loadfile", l_loadfile_caseinsensitive}, luaRegister(fileExists), + luaRegister(getModName), + luaRegister(getModPath), luaRegister(debugBreak), luaRegister(setIgnoreAction), @@ -9468,6 +9708,7 @@ static const struct { luaRegister(entity_stopInterpolating), luaRegister(entity_followPath), + luaRegister(entity_followPathSpeed), luaRegister(entity_isFollowingPath), luaRegister(entity_followEntity), luaRegister(entity_sound), @@ -9580,6 +9821,8 @@ static const struct { luaRegister(pickupGem), luaRegister(setGemPosition), + luaRegister(setGemName), + luaRegister(setGemBlink), luaRegister(removeGem), luaRegister(setBeacon), luaRegister(getBeacon), @@ -9628,6 +9871,11 @@ static const struct { luaRegister(getObstruction), luaRegister(getGridRaw), luaRegister(findPath), + luaRegister(createFindPath), + luaRegister(findPathBegin), + luaRegister(findPathUpdate), + luaRegister(findPathFinish), + luaRegister(findPathGetStats), luaRegister(castLine), luaRegister(getUserInputString), luaRegister(getMaxCameraValues), @@ -9716,6 +9964,7 @@ static const struct { luaRegister(entity_warpToNode), luaRegister(entity_moveToNode), + luaRegister(entity_moveToNodeSpeed), luaRegister(cam_toNode), luaRegister(cam_snap), @@ -9730,7 +9979,9 @@ static const struct { luaRegister(entity_flipToVel), luaRegister(entity_swimToNode), + luaRegister(entity_swimToNodeSpeed), luaRegister(entity_swimToPosition), + luaRegister(entity_swimToPositionSpeed), luaRegister(createShot), @@ -9818,6 +10069,7 @@ static const struct { luaRegister(getNumberOfEntitiesNamed), luaRegister(isNested), + luaRegister(isSkippingCutscene), luaRegister(entity_idle), luaRegister(entity_stopAllAnimations), @@ -9870,6 +10122,7 @@ static const struct { luaRegister(entity_isName), + luaRegister(node_setActivationRange), luaRegister(node_setCursorActivation), luaRegister(node_setCatchActions), @@ -9883,6 +10136,8 @@ static const struct { luaRegister(node_setActive), luaRegister(node_isActive), + luaRegister(node_setEmitter), + luaRegister(node_getEmitter), luaRegister(setSceneColor), @@ -10011,6 +10266,7 @@ static const struct { luaRegister(getScreenVirtualSize), luaRegister(isMiniMapCursorOkay), luaRegister(isShuttingDownGameState), + luaRegister(setBGGradient), luaRegister(inv_isFull), luaRegister(inv_getMaxAmount), @@ -10034,6 +10290,7 @@ static const struct { luaRegister(text_setWidth), luaRegister(text_setAlign), luaRegister(text_getHeight), + luaRegister(text_getStringWidth), luaRegister(loadShader), luaRegister(createShader), @@ -10052,6 +10309,7 @@ static const struct { luaRegister(isObject), luaRegister(isEntity), luaRegister(isScriptedEntity), + luaRegister(isBone), luaRegister(isShot), luaRegister(isWeb), luaRegister(isIng), @@ -10060,6 +10318,10 @@ static const struct { luaRegister(isShader), luaRegister(isParticleEffect), + luaRegister(getPerformanceCounter), + luaRegister(getPerformanceFreq), + + #undef MK_FUNC #undef MK_ALIAS @@ -10881,6 +11143,13 @@ lua_State *ScriptInterface::createLuaVM() // In case a script errors outside of any protected environment, report and exit. lua_atpanic(state, l_panicHandler); + // Register Lua classes + luaL_newmetatable(state, "pathfinder"); + lua_pushliteral(state, "__gc"); + lua_pushcfunction(state, _pathfindDelete); + lua_settable(state, -3); + lua_pop(state, 1); + // All done, return the new state. return state; } diff --git a/Aquaria/ScriptedEntity.cpp b/Aquaria/ScriptedEntity.cpp index 6ac9b53..6316e5f 100644 --- a/Aquaria/ScriptedEntity.cpp +++ b/Aquaria/ScriptedEntity.cpp @@ -153,6 +153,9 @@ void ScriptedEntity::initEmitter(int emit, const std::string &file) void ScriptedEntity::startEmitter(int emit) { + if(emit >= emitters.size()) + return; + if (emitters[emit]) { emitters[emit]->start(); @@ -161,6 +164,9 @@ void ScriptedEntity::startEmitter(int emit) void ScriptedEntity::stopEmitter(int emit) { + if(emit >= emitters.size()) + return; + if (emitters[emit]) { emitters[emit]->stop(); diff --git a/Aquaria/WorldMapRender.cpp b/Aquaria/WorldMapRender.cpp index 55d9fe0..30c9635 100644 --- a/Aquaria/WorldMapRender.cpp +++ b/Aquaria/WorldMapRender.cpp @@ -48,13 +48,11 @@ namespace WorldMapRenderNamespace VIS_WRITE = 1 // Uses render-to-texture instead }; - VisMethod visMethod = VIS_VERTEX; + const VisMethod visMethod = VIS_VERTEX; WorldMapRevealMethod revMethod = REVEAL_DEFAULT; std::vector tiles; - std::vector particles; - Quad *activeQuad=0, *lastActiveQuad=0, *originalActiveQuad=0; Quad *lastVisQuad=0, *visQuad=0; WorldMapTile *lastVisTile=0; @@ -512,6 +510,7 @@ static void tileDataToVis(WorldMapTile *tile, Vector **vis) if (data != 0) { + const float a = tile->prerevealed ? 0.4f : baseMapSegAlpha; const unsigned int rowSize = MAPVIS_SUBDIV/8; for (unsigned int y = 0; y < MAPVIS_SUBDIV; y++, data += rowSize) { @@ -520,18 +519,19 @@ static void tileDataToVis(WorldMapTile *tile, Vector **vis) unsigned char dataByte = data[x/8]; for (unsigned int x2 = 0; x2 < 8; x2++) { - vis[x+x2][y].z = (dataByte & (1 << x2)) ? visibleMapSegAlpha : baseMapSegAlpha; + vis[x+x2][y].z = (dataByte & (1 << x2)) ? visibleMapSegAlpha : a; } } } } else { + const float a = tile->prerevealed ? 0.4f : baseMapSegAlpha; for (int x = 0; x < MAPVIS_SUBDIV; x++) { for (int y = 0; y < MAPVIS_SUBDIV; y++) { - vis[x][y].z = baseMapSegAlpha; + vis[x][y].z = a; } } return; @@ -1342,7 +1342,7 @@ void WorldMapRender::addAllGems() for (Continuity::Gems::reverse_iterator i = dsq->continuity.gems.rbegin(); i != dsq->continuity.gems.rend(); i++) { GemMover *g = addGem(&(*i)); - if (c == dsq->continuity.gems.size()-1) + if (c == dsq->continuity.gems.size()-1 || i->blink) g->setBlink(true); else g->setBlink(false); diff --git a/BBGE/Base.cpp b/BBGE/Base.cpp index 7cc5958..785e3fb 100644 --- a/BBGE/Base.cpp +++ b/BBGE/Base.cpp @@ -547,13 +547,13 @@ tinyxml2::XMLError readXML(const std::string& fn, tinyxml2::XMLDocument& doc) return err; } -tinyxml2::XMLDocument *readXML(const std::string& fn, tinyxml2::XMLError *perr /* = 0 */) +tinyxml2::XMLDocument *readXML(const std::string& fn, tinyxml2::XMLError *perr /* = 0 */, bool keepEmpty /* = false */) { tinyxml2::XMLDocument *doc = new tinyxml2::XMLDocument(); tinyxml2::XMLError err = readXML(fn, *doc); if(perr) *perr = err; - if(err != tinyxml2::XML_SUCCESS) + if(err != tinyxml2::XML_SUCCESS && !keepEmpty) { delete doc; doc = NULL; diff --git a/BBGE/Base.h b/BBGE/Base.h index 8471dd4..1f650e3 100644 --- a/BBGE/Base.h +++ b/BBGE/Base.h @@ -144,6 +144,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "ttvfs_stdio.h" #include "tinyxml2.h" +#include "Refcounted.h" #ifdef BBGE_BUILD_LINUX # include @@ -206,7 +207,7 @@ bool exists(const std::string &f, bool makeFatal = false, bool skipVFS = false); void errorLog(const std::string &s); void debugLog(const std::string &s); char *readFile(const std::string& path, unsigned long *size_ret = 0); -tinyxml2::XMLDocument *readXML(const std::string& fn, tinyxml2::XMLError *perr = 0); +tinyxml2::XMLDocument *readXML(const std::string& fn, tinyxml2::XMLError *perr = 0, bool keepEmpty = false); tinyxml2::XMLError readXML(const std::string& fn, tinyxml2::XMLDocument& doc); char *readCompressedFile(std::string path, unsigned long *size_ret = 0); void forEachFile(std::string path, std::string type, void callback(const std::string &filename, intptr_t param), intptr_t param); diff --git a/BBGE/BaseText.h b/BBGE/BaseText.h index 203bf18..ec84314 100644 --- a/BBGE/BaseText.h +++ b/BBGE/BaseText.h @@ -14,6 +14,7 @@ public: virtual void setFontSize(int sz) = 0; virtual void setAlign(Align a) = 0; virtual float getHeight() = 0; + virtual float getStringWidth(const std::string& text) = 0; }; diff --git a/BBGE/BitmapFont.cpp b/BBGE/BitmapFont.cpp index 9bf0fc2..277656d 100644 --- a/BBGE/BitmapFont.cpp +++ b/BBGE/BitmapFont.cpp @@ -45,11 +45,8 @@ void BmpFont::destroy() font.Destroy(); loaded = false; } - if (overrideTexture) - { - overrideTexture->removeRef(); - overrideTexture = 0; - } + + overrideTexture = NULL; } void BmpFont::load(const std::string &file, float scale, bool loadTexture) @@ -425,6 +422,30 @@ int BitmapText::getNumLines() return lines.size(); } +float BitmapText::getStringWidth(const std::string& text) +{ + std::string tmp; + int maxsize = 0; + tmp.reserve(text.length()); + for (size_t i = 0; i < text.size(); i++) + { + if(text[i] == '\n') + { + std::pair dim; + bmpFont->font.GetStringSize(tmp, &dim); + maxsize = std::max(maxsize, dim.first); + tmp.resize(0); + } + else + tmp += text[i]; + } + std::pair dim; + bmpFont->font.GetStringSize(tmp, &dim); + maxsize = std::max(maxsize, dim.first); + + return maxsize * bmpFont->scale; +} + /* BitmapText::BitmapText() : RenderObject() { diff --git a/BBGE/BitmapFont.h b/BBGE/BitmapFont.h index 613faf9..188d4c1 100644 --- a/BBGE/BitmapFont.h +++ b/BBGE/BitmapFont.h @@ -48,7 +48,7 @@ struct BmpFont Vector fontTopColor; Vector fontBtmColor; - Texture *overrideTexture; + CountedPtr overrideTexture; }; class BitmapText : public BaseText @@ -75,6 +75,7 @@ public: virtual float getHeight(); void unloadDevice(); void reloadDevice(); + virtual float getStringWidth(const std::string& text); int getNumLines(); protected: diff --git a/BBGE/Core.cpp b/BBGE/Core.cpp index 7a0d1a6..2e3be81 100644 --- a/BBGE/Core.cpp +++ b/BBGE/Core.cpp @@ -2138,7 +2138,7 @@ void Core::enumerateScreenModes() SDL_GetDisplayMode(0, i, &mode); if (mode.w && mode.h && (mode.w > mode.h)) { - screenModes.push_back(ScreenMode(i, mode.w, mode.h)); + screenModes.push_back(ScreenMode(i, mode.w, mode.h, mode.refresh_rate)); } } @@ -2165,7 +2165,7 @@ void Core::enumerateScreenModes() { if (modes[i]->w > modes[i]->h) { - screenModes.push_back(ScreenMode(i, modes[i]->w, modes[i]->h)); + screenModes.push_back(ScreenMode(i, modes[i]->w, modes[i]->h, 0)); } } } @@ -4240,26 +4240,13 @@ void Core::showBuffer() // when destroy is called on them void Core::clearResources() { - std::vector deletedResources; - int i; - for (i = 0; i < resources.size(); i++) + if(resources.size()) { - int j = 0; - for (j = 0; j < deletedResources.size(); j++) - { - if (deletedResources[j] == resources[i]) - break; - } - if (j == deletedResources.size()) - { - deletedResources.push_back (resources[i]); - Resource *r = resources[i]; - r->destroy(); - delete r; - } + debugLog("Warning: The following resources were not cleared:"); + for(size_t i = 0; i < resources.size(); ++i) + debugLog(resources[i]->name); + resources.clear(); // nothing we can do; refcounting is messed up } - resourceNames.clear(); - resources.clear(); } void Core::shutdownInputLibrary() @@ -4408,20 +4395,7 @@ bool Core::exists(const std::string &filename) return ::exists(filename, false); // defined in Base.cpp } -Resource* Core::findResource(const std::string &name) -{ - for (int i = 0; i < resources.size(); i++) - { - if (resources[i]->name == name) - { - return resources[i]; - } - } - return 0; -} - - -Texture* Core::findTexture(const std::string &name) +CountedPtr Core::findTexture(const std::string &name) { //stringToUpper(name); //std::ofstream out("texturefind.log"); @@ -4432,19 +4406,12 @@ Texture* Core::findTexture(const std::string &name) //NOTE: ensure all names are lowercase before this point if (resources[i]->name == name) { - return (Texture*)resources[i]; + return resources[i]; } } return 0; } -std::string Core::getInternalTextureName(const std::string &name) -{ - std::string n = name; - stringToUpper(n); - return n; -} - // This handles unix/win32 relative paths: ./rel/path // Unix abs paths: /home/user/... // Win32 abs paths: C:/Stuff/.. and also C:\Stuff\... @@ -4462,7 +4429,7 @@ std::string Core::getTextureLoadName(const std::string &texture) return loadName; } -Texture *Core::doTextureAdd(const std::string &texture, const std::string &loadName, std::string internalTextureName) +std::pair, TextureLoadResult> Core::doTextureAdd(const std::string &texture, const std::string &loadName, std::string internalTextureName) { if (texture.empty() || !ISPATHROOT(texture)) { @@ -4479,48 +4446,37 @@ Texture *Core::doTextureAdd(const std::string &texture, const std::string &loadN } stringToLowerUserData(internalTextureName); - Texture *t = core->findTexture(internalTextureName); + CountedPtr t = core->findTexture(internalTextureName); if (t) - { - t->addRef(); - - Texture::textureError = TEXERR_OK; - - /* - std::ostringstream os; - os << "reference texture: " << internalTextureName << " ref: " << t->getRef(); - debugLog(os.str()); - */ - - //msg ("found texture " + internalTextureName); - return t; - } + return std::make_pair(t, TEX_SUCCESS); t = new Texture; t->name = internalTextureName; - t->load(loadName); - t->addRef(); - //resources.push_back (t); - addResource(t); + unsigned res = TEX_FAILED; - if (debugLogTextures) + if(t->load(loadName)) + res |= (TEX_LOADED | TEX_SUCCESS); + else { - std::ostringstream os; - os << "LOADED TEXTURE FROM DISK: [" << internalTextureName << "] ref: " << t->getRef() << " idx: " << resources.size()-1; - debugLog(os.str()); + t->width = 64; + t->height = 64; } - return t; + return std::make_pair(t, (TextureLoadResult)res); } -Texture* Core::addTexture(const std::string &textureName) +CountedPtr Core::addTexture(const std::string &textureName, TextureLoadResult *pLoadResult /* = 0 */) { - if (textureName.empty()) return 0; - BBGE_PROF(Core_addTexture); - Texture *texPointer = 0; + if (textureName.empty()) + { + if(pLoadResult) + *pLoadResult = TEX_FAILED; + return NULL; + } + std::pair, TextureLoadResult> texResult; std::string texture = textureName; stringToLowerUserData(texture); std::string internalTextureName = texture; @@ -4537,30 +4493,35 @@ Texture* Core::addTexture(const std::string &textureName) std::string ln = loadName; texture = secondaryTexturePath + texture; loadName = texture; - texPointer = doTextureAdd(texture, loadName, internalTextureName); - if (Texture::textureError != TEXERR_OK) - { - if (texPointer) - { - texPointer->destroy(); - texPointer = 0; - } - texPointer = doTextureAdd(t, ln, internalTextureName); - } + texResult = doTextureAdd(texture, loadName, internalTextureName); + if (!texResult.second) + texResult = doTextureAdd(t, ln, internalTextureName); } else - texPointer = doTextureAdd(texture, loadName, internalTextureName); + texResult = doTextureAdd(texture, loadName, internalTextureName); - return texPointer; + addTexture(texResult.first.content()); + + if(debugLogTextures) + { + if (texResult.second & TEX_LOADED) + { + std::ostringstream os; + os << "LOADED TEXTURE FROM DISK: [" << internalTextureName << "] idx: " << resources.size()-1; + debugLog(os.str()); + } + else if(!(texResult.second & TEX_SUCCESS)) + { + std::ostringstream os; + os << "FAILED TO LOAD TEXTURE: [" << internalTextureName << "] idx: " << resources.size()-1; + debugLog(os.str()); + } + } + if(pLoadResult) + *pLoadResult = texResult.second; + return texResult.first; } -void Core::removeTexture(std::string texture) -{ - //std::string internalName = baseTextureDirectory + texture; - removeResource(texture, DESTROY); -} - - void Core::addRenderObject(RenderObject *o, int layer) { if (!o) return; @@ -4603,59 +4564,36 @@ void Core::reloadResources() onReloadResources(); } -void Core::addResource(Resource *r) +void Core::addTexture(Texture *r) { + for(size_t i = 0; i < resources.size(); ++i) + if(resources[i] == r) + return; + resources.push_back(r); - resourceNames.push_back(r->name); if (r->name.empty()) { debugLog("Empty name resource added"); } } -void Core::removeResource(std::string name, RemoveResource removeFlag) +void Core::removeTexture(Texture *res) { - //Resource *r = findResource(name); - //int idx = 0; - int i = 0; - std::vectorcopy; - copy = resources; - resources.clear(); + std::vector copy; + copy.swap(resources); - - std::vector copyNames; - copyNames = resourceNames; - resourceNames.clear(); - - bool isDestroyed = false; - - - for (i = 0; i < copy.size(); i++) + for (size_t i = 0; i < copy.size(); ++i) { -#ifdef _DEBUG - std::string s = copy[i]->name; -#endif - if (!isDestroyed && copy[i]->name == name) + if (copy[i] == res) { - if (removeFlag == DESTROY) - { - copy[i]->destroy(); - delete copy[i]; - isDestroyed = true; - } - continue; - } - // also remove other entries of the same resource - else if (isDestroyed && copyNames[i] == name) - { - continue; - } - else - { - resources.push_back(copy[i]); - resourceNames.push_back(copy[i]->name); + copy[i]->destroy(); + copy[i] = copy.back(); + copy.pop_back(); + break; } } + + resources.swap(copy); } void Core::deleteRenderObjectMemory(RenderObject *r) @@ -4709,25 +4647,6 @@ void Core::clearGarbage() } garbage.clear(); - - // to clear resources - for (std::vector::iterator i = resources.begin(); i != resources.end(); ) - { - if ((*i)->getRef() == 0) - { - clearedGarbageFlag = true; - delete (*i); - i = resources.erase(i); - continue; - } - - if ((*i)->getRef() < 0) - { - errorLog("Texture ref < 0"); - } - - i++; - } } bool Core::canChangeState() diff --git a/BBGE/Core.h b/BBGE/Core.h index 55d2233..34799d8 100644 --- a/BBGE/Core.h +++ b/BBGE/Core.h @@ -70,10 +70,10 @@ enum TimeUpdateType struct ScreenMode { - ScreenMode() { idx = x = y = 0; } - ScreenMode(int i, int x, int y) : idx(i), x(x), y(y) {} + ScreenMode() { idx = x = y = hz = 0; } + ScreenMode(int i, int x, int y, int hz) : idx(i), x(x), y(y), hz(hz) {} - int idx, x, y; + int idx, x, y, hz; }; struct CoreSettings @@ -964,11 +964,6 @@ class Core : public ActionMapper, public StateManager { public: - enum RemoveResource - { - DESTROY = 0, - NO_DESTROY - }; // init Core(const std::string &filesystem, const std::string& extraDataDir, int numRenderLayers, const std::string &appName="BBGE", int particleSize=1024, std::string userDataSubFolder=""); void initPlatform(const std::string &filesystem); @@ -1023,13 +1018,12 @@ public: void enable2D(int pixelScaleX=0, int pixelScaleY=0, bool forcePixelScale=false); void addRenderObject(RenderObject *o, int layer=0); void switchRenderObjectLayer(RenderObject *o, int toLayer); - void addResource(Resource *r); - Resource *findResource(const std::string &name); - Texture *findTexture(const std::string &name); - void removeResource(std::string name, RemoveResource removeFlag); + void addTexture(Texture *r); + CountedPtr findTexture(const std::string &name); + void removeTexture(Texture *res); + void clearResources(); - Texture *addTexture(const std::string &texture); - void removeTexture(std::string texture); + CountedPtr addTexture(const std::string &texture, TextureLoadResult *pLoadResult = 0); PostProcessingFX postProcessingFx; @@ -1047,7 +1041,6 @@ public: void enqueueRenderObjectDeletion(RenderObject *object); void clearGarbage(); - void clearResources(); bool isNested() { return nestedMains > 1; } @@ -1103,8 +1096,7 @@ public: HINSTANCE hInstance; // Holds The Instance Of The Application #endif - std::vectorresources; - std::vector resourceNames; + std::vector resources; RenderObjectLayer *getRenderObjectLayer(int i); std::vector renderObjectLayerOrder; @@ -1247,7 +1239,6 @@ public: Joystick joystick; - std::string getInternalTextureName(const std::string &name); void setClearColor(const Vector &c); Vector getClearColor(); int flipMouseButtons; @@ -1337,7 +1328,7 @@ protected: virtual void onReloadResources(); - Texture* doTextureAdd(const std::string &texture, const std::string &name, std::string internalTextureName); + std::pair, TextureLoadResult> doTextureAdd(const std::string &texture, const std::string &name, std::string internalTextureName); void deleteRenderObjectMemory(RenderObject *r); bool _hasFocus; @@ -1398,6 +1389,8 @@ protected: int numSavedScreenshots; + CountedPtr texError; + //unsigned int windowWidth, windowHeight; diff --git a/BBGE/DebugFont.cpp b/BBGE/DebugFont.cpp index f1ffc69..0e253d8 100644 --- a/BBGE/DebugFont.cpp +++ b/BBGE/DebugFont.cpp @@ -52,6 +52,24 @@ float DebugFont::getHeight() return fontDrawSize * lines.size() * 1.5f; // vspc in render() } +float DebugFont::getStringWidth(const std::string& text) +{ + int maxchars = 0; + int c = 0; + for (size_t i = 0; i < text.size(); i++) + { + if(text[i] == '\n') + { + maxchars = std::max(maxchars, c); + c = 0; + } + else + ++c; + } + maxchars = std::max(maxchars, c); + return float(fontDrawSize * maxchars); +} + void DebugFont::formatText() { std::string text; diff --git a/BBGE/DebugFont.h b/BBGE/DebugFont.h index 2a1d5bc..d68d3e9 100644 --- a/BBGE/DebugFont.h +++ b/BBGE/DebugFont.h @@ -34,6 +34,7 @@ public: int getNumLines() { return lines.size(); } virtual void setAlign(Align align); virtual float getHeight(); + virtual float getStringWidth(const std::string& text); protected: int fontDrawSize, textWidth; void formatText(); diff --git a/BBGE/FmodOpenALBridge.cpp b/BBGE/FmodOpenALBridge.cpp index 23b88cb..aad7b3c 100644 --- a/BBGE/FmodOpenALBridge.cpp +++ b/BBGE/FmodOpenALBridge.cpp @@ -630,7 +630,7 @@ class OpenALSound { public: OpenALSound(VFILE *_fp, const bool _looping); // ctor for ogg streamed from file - OpenALSound(void *_data, long _size, const bool _looping); // ctor for ogg streamed from memory + OpenALSound(void *_data, size_t _size, const bool _looping); // ctor for ogg streamed from memory OpenALSound(ALuint _bid, const bool _looping); // ctor for raw samples already assigned an opanAL buffer ID VFILE *getFile() const { return fp; } const void *getData() const { return data; } @@ -647,7 +647,7 @@ public: private: VFILE * const fp; void * const data; // Only used if fp==NULL - const long size; // Only used if fp==NULL + const size_t size; // Only used if fp==NULL const bool looping; int refcount; const bool raw; // true if buffer holds raw PCM data @@ -667,7 +667,7 @@ OpenALSound::OpenALSound(VFILE *_fp, const bool _looping) { } -OpenALSound::OpenALSound(void *_data, long _size, const bool _looping) +OpenALSound::OpenALSound(void *_data, size_t _size, const bool _looping) : fp(NULL) , data(_data) , size(_size) @@ -1436,6 +1436,11 @@ FMOD_RESULT OpenALSystem::createSound(const char *name_or_data, const FMOD_MODE VFILE *io = vfopen(core->adjustFilenameCase(fname).c_str(), "rb"); if (io == NULL) return FMOD_ERR_INTERNAL; + size_t filesize = 0; + if(vfsize(io, &filesize)) + return FMOD_ERR_INTERNAL; + if(!filesize) + return FMOD_ERR_INTERNAL; if (mode & FMOD_CREATESTREAM) { @@ -1468,16 +1473,7 @@ FMOD_RESULT OpenALSystem::createSound(const char *name_or_data, const FMOD_MODE else { // Create streaming memory decoder - vfseek(io, 0, SEEK_END); - long size = vftell(io); - if (vfseek(io, 0, SEEK_SET) != 0) - { - debugLog("Seek error on " + std::string(fname)); - vfclose(io); - return FMOD_ERR_INTERNAL; - } - - void *data = malloc(size); + void *data = malloc(filesize); if (data == NULL) { debugLog("Out of memory for " + std::string(fname)); @@ -1485,16 +1481,16 @@ FMOD_RESULT OpenALSystem::createSound(const char *name_or_data, const FMOD_MODE return FMOD_ERR_INTERNAL; } - long nread = vfread(data, 1, size, io); + size_t nread = vfread(data, 1, filesize, io); vfclose(io); - if (nread != size) + if (nread != filesize) { debugLog("Failed to read data from " + std::string(fname)); free(data); return FMOD_ERR_INTERNAL; } - *sound = (Sound *) new OpenALSound(data, size, (((mode & FMOD_LOOP_OFF) == 0) && (mode & FMOD_LOOP_NORMAL))); + *sound = (Sound *) new OpenALSound(data, filesize, (((mode & FMOD_LOOP_OFF) == 0) && (mode & FMOD_LOOP_NORMAL))); retval = FMOD_OK; } diff --git a/BBGE/Localization.cpp b/BBGE/Localization.cpp index 24c5417..333fc2f 100644 --- a/BBGE/Localization.cpp +++ b/BBGE/Localization.cpp @@ -7,7 +7,6 @@ #endif #ifdef BBGE_BUILD_MACOSX -#include #include #include @@ -112,13 +111,11 @@ std::string getSystemLocale() if ((buf = (CFStringRef)CFLocaleGetValue(locale, kCFLocaleLanguageCode)) != NULL) { localeStr = _CFToStdString(buf); - CFRelease(buf); if ((buf = (CFStringRef)CFLocaleGetValue(locale, kCFLocaleCountryCode)) != NULL) { localeStr += "_"; localeStr += _CFToStdString(buf); - CFRelease(buf); } } diff --git a/BBGE/Quad.cpp b/BBGE/Quad.cpp index ae32b08..a8c8f41 100644 --- a/BBGE/Quad.cpp +++ b/BBGE/Quad.cpp @@ -798,6 +798,11 @@ void Quad::onSetTexture() width = this->texture->width; height = this->texture->height; } + else + { + width = 64; + height = 64; + } } PauseQuad::PauseQuad() : Quad(), pauseLevel(0) diff --git a/BBGE/Refcounted.h b/BBGE/Refcounted.h new file mode 100644 index 0000000..f79fa1b --- /dev/null +++ b/BBGE/Refcounted.h @@ -0,0 +1,95 @@ +#ifndef CG_CORE_REFCOUNTED_H +#define CG_CORE_REFCOUNTED_H + +#include +#include +#include + + +class Refcounted +{ +protected: + + Refcounted() : _refcount(0) + { + } + virtual ~Refcounted() + { + assert(_refcount == 0 && "Object was deleted with refcount != 0"); + } + +public: + + inline void incref() + { + ++_refcount; + } + inline void decref() + { + if (!--_refcount) + delete this; + } + +private: + unsigned _refcount; +}; + + +template class CountedPtr +{ +public: + inline ~CountedPtr() + { + if(_p) + _p->decref(); + } + inline CountedPtr() : _p(NULL) + {} + inline CountedPtr(T* p) : _p(p) + { + if(p) + p->incref(); + } + inline CountedPtr(const CountedPtr& ref) : _p(ref._p) + { + if (_p) + _p->incref(); + } + + // intentionally not a reference -- see http://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom + CountedPtr& operator=(CountedPtr ref) + { + CountedPtr::swap(*this, ref); + return *this; + } + + const T* operator->() const { return _p; } + T* operator->() { return _p; } + + bool operator!() const { return !_p; } + + // Safe for use in if statements + operator bool() const { return !!_p; } + + T* content () { return _p; } + const T* content () const { return _p; } + + bool operator<(const CountedPtr& ref) const { return _p < ref._p; } + bool operator<=(const CountedPtr& ref) const { return _p <= ref._p; } + bool operator==(const CountedPtr& ref) const { return _p == ref._p; } + bool operator!=(const CountedPtr& ref) const { return _p != ref._p; } + bool operator>=(const CountedPtr& ref) const { return _p >= ref._p; } + bool operator>(const CountedPtr& ref) const { return _p > ref._p; } + + inline static void swap(CountedPtr& a, CountedPtr& b) + { + std::swap(a._p, b._p); + } + +private: + + T *_p; +}; + + +#endif diff --git a/BBGE/RenderObject.cpp b/BBGE/RenderObject.cpp index 6268eee..f61256c 100644 --- a/BBGE/RenderObject.cpp +++ b/BBGE/RenderObject.cpp @@ -23,6 +23,12 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "MathFunctions.h" #include +#include + +#ifdef BBGE_USE_GLM +#include "glm/glm.hpp" +#include "glm/gtx/transform.hpp" +#endif bool RenderObject::renderCollisionShape = false; int RenderObject::lastTextureApplied = 0; @@ -291,24 +297,51 @@ Vector RenderObject::getInvRotPosition(const Vector &vec) #endif } -void RenderObject::matrixChain() +#ifdef BBGE_USE_GLM +static glm::mat4 matrixChain(const RenderObject *ro) { - if (parent) - parent->matrixChain(); + glm::mat4 tranformMatrix = glm::scale( + glm::translate( + glm::rotate( + glm::translate( + ro->getParent() ? matrixChain(ro->getParent()) : glm::mat4(1.0f), + glm::vec3(ro->position.x+ro->offset.x, ro->position.y+ro->offset.y, 0) + ), + ro->rotation.z + ro->rotationOffset.z, + glm::vec3(0, 0, 1) + ), + glm::vec3(ro->beforeScaleOffset.x, ro->beforeScaleOffset.y, 0.0f) + ), + glm::vec3(ro->scale.x, ro->scale.y, 0.0f) + ); + + if (ro->isfh()) + tranformMatrix *= glm::rotate(180.0f, 0.0f, 1.0f, 0.0f); + + tranformMatrix *= glm::translate(ro->internalOffset.x, ro->internalOffset.y, 0.0f); + + return tranformMatrix; +} +#else +static void matrixChain(RenderObject *ro) +{ + if (RenderObject *parent = ro->getParent()) + matrixChain(parent); #ifdef BBGE_BUILD_OPENGL - glTranslatef(position.x+offset.x, position.y+offset.y, 0); - glRotatef(rotation.z+rotationOffset.z, 0, 0, 1); - glTranslatef(beforeScaleOffset.x, beforeScaleOffset.y, 0); - glScalef(scale.x, scale.y, 0); - if (isfh()) + glTranslatef(ro->position.x+ro->offset.x, ro->position.y+ro->offset.y, 0); + glRotatef(ro->rotation.z+ro->rotationOffset.z, 0, 0, 1); + glTranslatef(ro->beforeScaleOffset.x, ro->beforeScaleOffset.y, 0); + glScalef(ro->scale.x, ro->scale.y, 0); + if (ro->isfh()) { //glDisable(GL_CULL_FACE); glRotatef(180, 0, 1, 0); } - glTranslatef(internalOffset.x, internalOffset.y, 0); + glTranslatef(ro->internalOffset.x, ro->internalOffset.y, 0); #endif } +#endif float RenderObject::getWorldRotation() { @@ -329,11 +362,19 @@ Vector RenderObject::getWorldPositionAndRotation() Vector RenderObject::getWorldCollidePosition(const Vector &vec) { +#ifdef BBGE_USE_GLM + glm::mat4 transformMatrix = glm::translate( + matrixChain(this), + glm::vec3(collidePosition.x + vec.x, collidePosition.y + vec.y, 0.0f) + ); + + return Vector(transformMatrix[3][0], transformMatrix[3][1], 0); +#else #ifdef BBGE_BUILD_OPENGL glPushMatrix(); glLoadIdentity(); - matrixChain(); + matrixChain(this); glTranslatef(collidePosition.x+vec.x, collidePosition.y+vec.y, 0); float m[16]; @@ -346,6 +387,7 @@ Vector RenderObject::getWorldCollidePosition(const Vector &vec) #elif BBGE_BUILD_DIRECTX return vec; #endif +#endif } void RenderObject::fhTo(bool fh) @@ -415,11 +457,8 @@ void RenderObject::destroy() parent->removeChild(this); parent = 0; } - if (texture) - { - texture->removeRef(); - texture = 0; - } + + texture = NULL; } void RenderObject::copyProperties(RenderObject *target) @@ -467,13 +506,29 @@ void RenderObject::toggleCull(bool value) void RenderObject::moveToFront() { - if (layer != -1) + if(RenderObject *p = parent) + { + if(p->children.size() && p->children[0] != this) + { + p->removeChild(this); + p->addChild(this, (ParentManaged)this->pm, RBP_NONE, CHILD_FRONT); + } + } + else if (layer != -1) core->renderObjectLayers[this->layer].moveToFront(this); } void RenderObject::moveToBack() { - if (layer != -1) + if(RenderObject *p = parent) + { + if(p->children.size() && p->children[p->children.size()-1] != this) + { + p->removeChild(this); + p->addChild(this, (ParentManaged)this->pm, RBP_NONE, CHILD_BACK); + } + } + else if (layer != -1) core->renderObjectLayers[this->layer].moveToBack(this); } @@ -1099,26 +1154,6 @@ void RenderObject::lookAt(const Vector &pos, float t, float minAngle, float maxA rotation.interpolateTo(Vector(0,0,angle), t); } -void RenderObject::removeAllChildren() -{ - if (!children.empty()) - { - removeChild(children.front()); - removeAllChildren(); - } -} - -void RenderObject::recursivelyRemoveEveryChild() -{ - if (!children.empty()) - { - RenderObject *child = (children.front()); - child->recursivelyRemoveEveryChild(); - removeChild(child); - recursivelyRemoveEveryChild(); - } -} - void RenderObject::update(float dt) { if (ignoreUpdate) @@ -1149,8 +1184,14 @@ void RenderObject::update(float dt) void RenderObject::removeChild(RenderObject *r) { - children.remove(r); r->parent = 0; + Children::iterator oldend = children.end(); + Children::iterator newend = std::remove(children.begin(), oldend, r); + if(oldend != newend) + { + children.resize(std::distance(children.begin(), newend)); + return; + } for (Children::iterator i = children.begin(); i != children.end(); i++) { @@ -1301,29 +1342,6 @@ void RenderObject::onUpdate(float dt) // updateCullVariables(); } -void RenderObject::propogateAlpha() -{ - /* - if (!shareAlphaWithChildren) return; - for (int i = 0; i < children.size(); i++) - { - children[i]->alpha = this->alpha * children[i]->parentAlphaModifier.getValue(); - children[i]->propogateAlpha(); - } - - */ - /* - if (shareAlphaWithChildren && !children.empty()) - { - for (int i = 0; i < children.size(); i++) - { - - //children[i]->alpha = this->alpha * children[i]->parentAlphaModifier.getValue(); - } - } - */ -} - void RenderObject::unloadDevice() { for (Children::iterator i = children.begin(); i != children.end(); i++) @@ -1340,23 +1358,21 @@ void RenderObject::reloadDevice() } } -void RenderObject::setTexture(const std::string &n) +bool RenderObject::setTexture(const std::string &n) { std::string name = n; stringToLowerUserData(name); if (name.empty()) - return; + return false; - if(texture && texture->name == core->getInternalTextureName(name)) - return; // no texture change + if(texture && name == texture->name) + return true; // no texture change - Texture *oldtex = texture; - Texture *t = core->addTexture(name); - setTexturePointer(t, NO_ADD_REF); - - if (oldtex) - oldtex->removeRef(); + TextureLoadResult res = TEX_FAILED; + CountedPtr tex = core->addTexture(name, &res); + setTexturePointer(tex); + return !!tex && res != TEX_FAILED; } float RenderObject::getSortDepth() @@ -1375,7 +1391,7 @@ void RenderObject::addChild(RenderObject *r, ParentManaged pm, RenderBeforeParen if (order == CHILD_BACK) children.push_back(r); else - children.push_front(r); + children.insert(children.begin(), r); r->pm = pm; @@ -1407,15 +1423,6 @@ void RenderObject::setOverrideCullRadius(float ovr) overrideCullRadiusSqr = ovr * ovr; } -void RenderObject::propogateParentManagedStatic() -{ - for (Children::iterator i = children.begin(); i != children.end(); i++) - { - (*i)->pm = PM_STATIC; - (*i)->propogateParentManagedStatic(); - } -} - bool RenderObject::isCoordinateInRadius(const Vector &pos, float r) { Vector d = pos-getRealPosition(); diff --git a/BBGE/RenderObject.h b/BBGE/RenderObject.h index 1925570..369b3b5 100644 --- a/BBGE/RenderObject.h +++ b/BBGE/RenderObject.h @@ -83,21 +83,16 @@ public: static RenderObjectLayer *rlayer; - enum AddRefChoice { NO_ADD_REF = 0, ADD_REF = 1}; - - void setTexturePointer(Texture *t, AddRefChoice addRefChoice) + void setTexturePointer(CountedPtr t) { this->texture = t; - if (addRefChoice == ADD_REF) - texture->addRef(); onSetTexture(); } void setStateDataObject(StateData *state); - void setTexture(const std::string &name); + bool setTexture(const std::string &name); void toggleAlpha(float t = 0.2); - void matrixChain(); virtual void update(float dt); bool isDead() const {return _dead;} @@ -134,8 +129,8 @@ public: virtual void flipHorizontal(); virtual void flipVertical(); - bool isfh() { return _fh; } - bool isfv() { return _fv; } + bool isfh() const { return _fh; } + bool isfv() const { return _fv; } // recursive bool isfhr(); @@ -167,8 +162,6 @@ public: void addChild(RenderObject *r, ParentManaged pm, RenderBeforeParent rbp = RBP_NONE, ChildOrder order = CHILD_BACK); void removeChild(RenderObject *r); - void removeAllChildren(); - void recursivelyRemoveEveryChild(); Vector getRealPosition(); Vector getRealScale(); @@ -241,7 +234,7 @@ public: InterpolatedVector offset, rotationOffset, internalOffset, beforeScaleOffset; InterpolatedVector velocity, gravity; - Texture *texture; + CountedPtr texture; //int mode; @@ -273,13 +266,13 @@ public: bool shareColorWithChildren; bool cull; - int updateCull; + float updateCull; int layer; InterpolatedVector *positionSnapTo; //DestroyType destroyType; - typedef std::list Children; + typedef std::vector Children; Children children, childGarbage; //Flags flags; @@ -312,10 +305,6 @@ protected: virtual void deathNotify(RenderObject *r); virtual void onEndOfLife() {} - // spread parentManagedStatic flag to the entire child tree - void propogateParentManagedStatic(); - void propogateAlpha(); - inline void updateLife(float dt) { if (decayRate > 0) diff --git a/BBGE/Resource.cpp b/BBGE/Resource.cpp deleted file mode 100644 index eea6ac3..0000000 --- a/BBGE/Resource.cpp +++ /dev/null @@ -1,28 +0,0 @@ -/* -Copyright (C) 2007, 2010 - Bit-Blot - -This file is part of Aquaria. - -Aquaria is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#include "Resource.h" -#include "Core.h" - - -void Resource::destroy() -{ - core->removeResource(this->name, Core::NO_DESTROY); -} diff --git a/BBGE/Resource.h b/BBGE/Resource.h deleted file mode 100644 index 5ea7f6d..0000000 --- a/BBGE/Resource.h +++ /dev/null @@ -1,57 +0,0 @@ -/* -Copyright (C) 2007, 2010 - Bit-Blot - -This file is part of Aquaria. - -Aquaria is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef __resource__ -#define __resource__ - -#include "Base.h" - -class Resource -{ -public: - Resource() - { - ref = 0; - } - ~Resource() - { - destroy(); - } - virtual void destroy(); - - void addRef() - { - ref++; - } - void removeRef() - { - ref--; - if (ref == 0) - destroy(); - } - int getRef() { return ref; } - std::string name; - virtual void reload() {} - virtual void unload() {} -protected: - int ref; -}; - -#endif diff --git a/BBGE/SkeletalSprite.cpp b/BBGE/SkeletalSprite.cpp index 3313034..8666bf4 100644 --- a/BBGE/SkeletalSprite.cpp +++ b/BBGE/SkeletalSprite.cpp @@ -34,13 +34,13 @@ std::string SkeletalSprite::secondaryAnimationPath = ""; static std::map skelCache; -static XMLDocument *_retrieveSkeletalXML(const std::string& name) +static XMLDocument *_retrieveSkeletalXML(const std::string& name, bool keepEmpty) { std::map::iterator it = skelCache.find(name); if(it != skelCache.end()) return it->second; - XMLDocument *doc = readXML(name); + XMLDocument *doc = readXML(name, NULL, keepEmpty); if(doc) skelCache[name] = doc; @@ -49,6 +49,8 @@ static XMLDocument *_retrieveSkeletalXML(const std::string& name) void SkeletalSprite::clearCache() { + for(std::map::iterator it = skelCache.begin(); it != skelCache.end(); ++it) + delete it->second; skelCache.clear(); } @@ -869,7 +871,7 @@ bool SkeletalSprite::saveSkeletal(const std::string &fn) } int i = 0; - XMLDocument *xml = _retrieveSkeletalXML(file); + XMLDocument *xml = _retrieveSkeletalXML(file, true); xml->Clear(); XMLElement *animationLayers = xml->NewElement("AnimationLayers"); @@ -1144,16 +1146,10 @@ void SkeletalSprite::prevAnimation() void SkeletalSprite::deleteBones() { bones.clear(); - if (!children.empty()) + for(Children::iterator it = children.begin(); it != children.end(); ++it) { - // remove child had better be recursive - Bone *b = (Bone*)children.front(); - //removeChild(b); - b->destroy(); - delete b; - deleteBones(); + (*it)->safeKill(); } - children.clear(); bones.clear(); } @@ -1185,10 +1181,15 @@ void SkeletalSprite::loadSkin(const std::string &fn) if (!exists(file)) { - errorLog("Could not load skin[" + file + "]"); + errorLog("Could not load skin[" + file + "] - File not found."); + return; + } + XMLDocument *d = _retrieveSkeletalXML(file, false); + if(!d) + { + errorLog("Could not load skin[" + file + "] - Malformed XML."); return; } - XMLDocument *d = _retrieveSkeletalXML(file); XMLElement *bonesXml = d->FirstChildElement("Bones"); if (bonesXml) @@ -1290,10 +1291,7 @@ void SkeletalSprite::loadSkeletal(const std::string &fn) filenameLoaded = ""; loaded = false; stopAnimation(); - for (int i = 0; i < animLayers.size(); i++) - { - animLayers[i].currentAnimation = 0; - } + animLayers.clear(); deleteBones(); @@ -1321,7 +1319,7 @@ void SkeletalSprite::loadSkeletal(const std::string &fn) file = core->adjustFilenameCase(file); - XMLDocument *xml = _retrieveSkeletalXML(file); + XMLDocument *xml = _retrieveSkeletalXML(file, false); if(!xml) { filenameLoaded = ""; diff --git a/BBGE/StateMachine.cpp b/BBGE/StateMachine.cpp index 682a480..88895ff 100644 --- a/BBGE/StateMachine.cpp +++ b/BBGE/StateMachine.cpp @@ -28,7 +28,6 @@ StateMachine::StateMachine () enqueuedState = nextState = prevState = currentState = STATE_NONE; stateCounter = 0; - currentStateData = enqueuedStateData = 0; } int StateMachine::getState() @@ -46,7 +45,7 @@ int StateMachine::getPrevState() return prevState; } -void StateMachine::perform(int state, float time, void *stateData) +void StateMachine::perform(int state, float time) { //debugLog("in perform"); stateExtraDT = 0; @@ -56,33 +55,30 @@ void StateMachine::perform(int state, float time, void *stateData) // do this to prevent scripts from repeating endlessly when running main loops enqueuedState = STATE_NONE; - enqueuedStateData = 0; onExitState(currentState); stateCounter = 0; stateTime = time; currentState = state; nextState = STATE_NONE; - this->currentStateData = stateData; //debugLog("onActionInit"); onEnterState(currentState); //debugLog("done"); } -void StateMachine::setState(int state, float time, bool force, void *stateData) +void StateMachine::setState(int state, float time, bool force) { if (canSetState(state)) { if (force) { - perform(state, time, stateData); + perform(state, time); } else { enqueuedState = state; enqueuedTime = time; - enqueuedStateData = stateData; } } } @@ -140,64 +136,9 @@ void StateMachine::onUpdate (float dt) } if (enqueuedState != STATE_NONE) { - perform(enqueuedState, enqueuedTime, enqueuedStateData); + perform(enqueuedState, enqueuedTime); enqueuedState = STATE_NONE; enqueuedTime = -1; } } -void StateMachine::addCooldown(int state, float time) -{ - Cooldown c; - c.state = state; - c.timer.start(time); - cooldowns.push_back(c); -} - -bool StateMachine::isCooldown(int state) -{ - for (Cooldowns::iterator i = cooldowns.begin(); i != cooldowns.end(); i++) - { - if ((*i).state == state && (*i).timer.isActive()) - { - return true; - } - } - return false; -} - -void StateMachine::removeCooldown(int state) -{ - for (Cooldowns::iterator i = cooldowns.begin(); i != cooldowns.end(); i++) - { - if ((*i).state == state) - { - cooldowns.erase(i); - break; - } - } -} - -void StateMachine::updateCooldowns(float dt) -{ - std::queue coolqueue; - - for (Cooldowns::iterator i = cooldowns.begin(); i != cooldowns.end(); i++) - { - Cooldown *c = &((*i)); - if (c->timer.updateCheck(dt)) { - coolqueue.push(c->state); - } - } - - while (!coolqueue.empty()) - { - removeCooldown(coolqueue.back()); - coolqueue.pop(); - } -} - -void StateMachine::clearCooldowns() -{ - cooldowns.clear(); -} diff --git a/BBGE/StateMachine.h b/BBGE/StateMachine.h index 207846b..b86ba93 100644 --- a/BBGE/StateMachine.h +++ b/BBGE/StateMachine.h @@ -23,20 +23,13 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "Base.h" -struct Cooldown -{ - int state; - Timer timer; -}; -typedef std::list Cooldowns; - class StateMachine { public: StateMachine (); virtual ~StateMachine() {} - void setState(int state, float time = -1, bool force = false, void* stateData=0); + void setState(int state, float time = -1, bool force = false); void stopState(int state); bool isState(int state); int getState(); @@ -51,15 +44,8 @@ public: }; virtual bool canSetState(int state); - void addCooldown(int state, float time); - void removeCooldown(int state); - void updateCooldowns(float dt); - bool isCooldown(int state); - void clearCooldowns(); protected: - void *currentStateData; - void *enqueuedStateData; - void perform(int state, float time = -1, void *stateData=0); + void perform(int state, float time = -1); virtual void onEnterState(int state); virtual void onExitState(int state); @@ -71,7 +57,6 @@ protected: { stateCounter = 0; } private: - Cooldowns cooldowns; float stateCounter; }; diff --git a/BBGE/Texture.cpp b/BBGE/Texture.cpp index 9f04a4c..f9b898c 100644 --- a/BBGE/Texture.cpp +++ b/BBGE/Texture.cpp @@ -54,9 +54,8 @@ bool Texture::useMipMaps = true; #endif */ -TexErr Texture::textureError = TEXERR_OK; -Texture::Texture() : Resource() +Texture::Texture() { #ifdef BBGE_BUILD_OPENGL textures[0] = 0; @@ -69,7 +68,6 @@ Texture::Texture() : Resource() repeat = false; repeating = false; pngSetStandardOrientation(0); - ow = oh = -1; } @@ -151,7 +149,6 @@ void Texture::write(int tx, int ty, int w, int h, const unsigned char *pixels) void Texture::unload() { - Resource::unload(); #ifdef BBGE_BUILD_OPENGL if (textures[0]) { @@ -166,8 +163,6 @@ void Texture::unload() glDeleteTextures(1, &textures[0]); textures[0] = 0; - - //removeRef(); } #endif } @@ -185,10 +180,7 @@ void Texture::destroy() } #endif - if (!core->isShuttingDown()) - core->removeTexture(this->name); - -// Resource::destroy(); + core->removeTexture(this); } int Texture::getPixelWidth() @@ -255,8 +247,6 @@ int Texture::getPixelHeight() void Texture::reload() { - Resource::reload(); - debugLog("RELOADING TEXTURE: " + name + " with loadName " + loadName + "..."); unload(); @@ -270,15 +260,12 @@ void Texture::reload() debugLog("DONE"); } -void Texture::load(std::string file) +bool Texture::load(std::string file) { - Texture::textureError = TEXERR_OK; - if (file.size()<4) { errorLog("Texture Name is Empty or Too Short"); - Texture::textureError = TEXERR_FILENOTFOUND; - return; + return false; } stringToLowerUserData(file); @@ -332,7 +319,7 @@ void Texture::load(std::string file) { #ifdef BBGE_BUILD_OPENGL - loadPNG(file); + return loadPNG(file); #endif #ifdef BBGE_BUILD_DIRECTX @@ -353,18 +340,15 @@ void Texture::load(std::string file) } else if (post == "zga") { - loadZGA(file); + return loadZGA(file); } else if (post == "tga") { - loadTGA(file); + return loadTGA(file); } else { debugLog("unknown image file type: " + file); - Texture::textureError = TEXERR_FILENOTFOUND; - width = 64; - height = 64; } } else @@ -372,10 +356,8 @@ void Texture::load(std::string file) // load default image / leave white if (core->debugLogTextures) debugLog("***Could not find texture: " + file); - Texture::textureError = TEXERR_FILENOTFOUND; - width = 64; - height = 64; } + return false; } void Texture::apply(bool repeatOverride) @@ -411,18 +393,10 @@ void Texture::unbind() { } -#ifdef BBGE_BUILD_OPENGL - -void Texture::setID(int id) +bool Texture::loadPNG(const std::string &file) { - textures[0] = id; -} - -#endif - -void Texture::loadPNG(const std::string &file) -{ - if (file.empty()) return; + if (file.empty()) return false; + bool good = false; #ifdef BBGE_BUILD_OPENGL @@ -430,7 +404,7 @@ void Texture::loadPNG(const std::string &file) pngInfo info; int pngType = PNG_ALPHA; - + if (format != 0) { if (format == GL_LUMINANCE_ALPHA) @@ -455,30 +429,29 @@ void Texture::loadPNG(const std::string &file) { width = info.Width; height = info.Height; + good = true; } else { fail: debugLog("Can't load PNG file: " + file); - width = 64; - height = 64; - Texture::textureError = TEXERR_FILENOTFOUND; } if(memptr) delete [] memptr; #endif + return good; } // internal load functions -void Texture::loadTGA(const std::string &file) +bool Texture::loadTGA(const std::string &file) { - loadTGA(TGAload(file.c_str())); + return loadTGA(TGAload(file.c_str())); } -void Texture::loadZGA(const std::string &file) +bool Texture::loadZGA(const std::string &file) { unsigned long size = 0; char *buf = readCompressedFile(file, &size); @@ -486,15 +459,15 @@ void Texture::loadZGA(const std::string &file) if (!tga) { debugLog("Can't load ZGA File: " + file); - return; + return false; } - loadTGA(tga); + return loadTGA(tga); } -void Texture::loadTGA(ImageTGA *imageTGA) +bool Texture::loadTGA(ImageTGA *imageTGA) { if (!imageTGA) - return; + return false; glGenTextures(1, &textures[0]); glBindTexture(GL_TEXTURE_2D, textures[0]); @@ -512,6 +485,8 @@ void Texture::loadTGA(ImageTGA *imageTGA) if (imageTGA->data) delete[] (imageTGA->data); free (imageTGA); + + return true; } diff --git a/BBGE/Texture.h b/BBGE/Texture.h index 68b43fc..a32a5ee 100644 --- a/BBGE/Texture.h +++ b/BBGE/Texture.h @@ -21,7 +21,14 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef __texture__ #define __texture__ -#include "Resource.h" +#include "Base.h" + +enum TextureLoadResult +{ + TEX_FAILED = 0x00, + TEX_SUCCESS = 0x01, + TEX_LOADED = 0x02, +}; struct ImageTGA { @@ -31,24 +38,16 @@ struct ImageTGA unsigned char *data; // The image pixel data }; -enum TexErr -{ - TEXERR_OK = 0, - TEXERR_FILENOTFOUND = 1, - TEXERR_MAX -}; - -class Texture : public Resource +class Texture : public Refcounted { public: Texture(); ~Texture(); - void load(std::string file); + bool load(std::string file); void apply(bool repeatOverride=false); void unbind(); void unload(); - void setLayer(int layer); int getPixelWidth(); int getPixelHeight(); @@ -67,7 +66,6 @@ public: #ifdef BBGE_BUILD_OPENGL static GLint filter; static GLint format; - void setID (int id); GLuint textures[1]; #endif #ifdef BBGE_BUILD_DIRECTX @@ -76,26 +74,26 @@ public: void reload(); - static TexErr textureError; - void write(int tx, int ty, int w, int h, const unsigned char *pixels); void read(int tx, int ty, int w, int h, unsigned char *pixels); unsigned char *getBufferAndSize(int *w, int *h, unsigned int *size); // returned memory must be free()'d + std::string name; + protected: std::string loadName; // internal load functions - void loadPNG(const std::string &file); - void loadTGA(const std::string &file); - void loadZGA(const std::string &file); - void loadTGA(ImageTGA *tga); + bool loadPNG(const std::string &file); + bool loadTGA(const std::string &file); + bool loadZGA(const std::string &file); + bool loadTGA(ImageTGA *tga); int ow, oh; }; -#define UNREFTEX(x) if (x) {x->removeRef(); x=0;} +#define UNREFTEX(x) if (x) {x = NULL;} #endif diff --git a/CMakeLists.txt b/CMakeLists.txt index 7170fc0..07dca08 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,6 +31,7 @@ OPTION(AQUARIA_DEMO_BUILD "Demo Build?" FALSE) OPTION(AQUARIA_USE_VFS "Use Virtual File System? Required for some additional features." TRUE) OPTION(AQUARIA_USE_SDL2 "Use SDL2" FALSE) +OPTION(AQUARIA_USE_GLM "Use GLM for matrix math" TRUE) # No Steamworks SDK for Linux at the moment. Roll our own achievements. ADD_DEFINITIONS(-DBBGE_BUILD_ACHIEVEMENTS_INTERNAL=1) @@ -303,6 +304,10 @@ IF(AQUARIA_USE_SDL2) ADD_DEFINITIONS(-DBBGE_BUILD_SDL2=1) ENDIF(AQUARIA_USE_SDL2) +IF(AQUARIA_USE_GLM) + ADD_DEFINITIONS(-DBBGE_USE_GLM=1) +ENDIF(AQUARIA_USE_GLM) + IF(AQUARIA_DEMO_BUILD) message(STATUS "Demo build.") ADD_DEFINITIONS(-DAQUARIA_DEMO=1) @@ -482,7 +487,6 @@ SET(BBGE_SRCS ${BBGEDIR}/RenderObject.cpp ${BBGEDIR}/RenderObjectLayer.cpp ${BBGEDIR}/RenderRect.cpp - ${BBGEDIR}/Resource.cpp ${BBGEDIR}/RoundedRect.cpp ${BBGEDIR}/ScreenTransition.cpp ${BBGEDIR}/ScriptObject.cpp @@ -714,7 +718,7 @@ ENDIF(WIN32) IF(MACOSX) SET(OPTIONAL_LIBS ${OPTIONAL_LIBS} "-framework Carbon") SET(OPTIONAL_LIBS ${OPTIONAL_LIBS} "-framework Cocoa") - SET(OPTIONAL_LIBS ${OPTIONAL_LIBS} "-framework OpenAL") + #SET(OPTIONAL_LIBS ${OPTIONAL_LIBS} "-framework OpenAL") ENDIF(MACOSX) IF(HAIKU) diff --git a/ExternalLibs/SDL2/lib/win32/SDL2.lib b/ExternalLibs/SDL2/lib/win32/SDL2.lib index 83f0a5f..45e87d3 100644 Binary files a/ExternalLibs/SDL2/lib/win32/SDL2.lib and b/ExternalLibs/SDL2/lib/win32/SDL2.lib differ diff --git a/ExternalLibs/SDL2/lib/win32/SDL2main.lib b/ExternalLibs/SDL2/lib/win32/SDL2main.lib index 2019eea..f77c1dc 100644 Binary files a/ExternalLibs/SDL2/lib/win32/SDL2main.lib and b/ExternalLibs/SDL2/lib/win32/SDL2main.lib differ diff --git a/ExternalLibs/glm/CMakeLists.txt b/ExternalLibs/glm/CMakeLists.txt new file mode 100644 index 0000000..d5ba209 --- /dev/null +++ b/ExternalLibs/glm/CMakeLists.txt @@ -0,0 +1,43 @@ +set(NAME glm) + +file(GLOB ROOT_SOURCE *.cpp) +file(GLOB ROOT_INLINE *.inl) +file(GLOB ROOT_HEADER *.hpp) + +file(GLOB_RECURSE CORE_SOURCE ./core/*.cpp) +file(GLOB_RECURSE CORE_INLINE ./core/*.inl) +file(GLOB_RECURSE CORE_HEADER ./core/*.hpp) + +file(GLOB_RECURSE GTC_SOURCE ./gtc/*.cpp) +file(GLOB_RECURSE GTC_INLINE ./gtc/*.inl) +file(GLOB_RECURSE GTC_HEADER ./gtc/*.hpp) + +file(GLOB_RECURSE GTX_SOURCE ./gtx/*.cpp) +file(GLOB_RECURSE GTX_INLINE ./gtx/*.inl) +file(GLOB_RECURSE GTX_HEADER ./gtx/*.hpp) + +file(GLOB_RECURSE VIRTREV_SOURCE ./virtrev/*.cpp) +file(GLOB_RECURSE VIRTREV_INLINE ./virtrev/*.inl) +file(GLOB_RECURSE VIRTREV_HEADER ./virtrev/*.hpp) + +source_group("Core Files" FILES ${CORE_SOURCE}) +source_group("Core Files" FILES ${CORE_INLINE}) +source_group("Core Files" FILES ${CORE_HEADER}) +source_group("GTC Files" FILES ${GTC_SOURCE}) +source_group("GTC Files" FILES ${GTC_INLINE}) +source_group("GTC Files" FILES ${GTC_HEADER}) +source_group("GTX Files" FILES ${GTX_SOURCE}) +source_group("GTX Files" FILES ${GTX_INLINE}) +source_group("GTX Files" FILES ${GTX_HEADER}) +source_group("VIRTREV Files" FILES ${VIRTREV_SOURCE}) +source_group("VIRTREV Files" FILES ${VIRTREV_INLINE}) +source_group("VIRTREV Files" FILES ${VIRTREV_HEADER}) + +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/..) + +add_executable(${NAME} + ${ROOT_SOURCE} ${ROOT_INLINE} ${ROOT_HEADER} + ${CORE_SOURCE} ${CORE_INLINE} ${CORE_HEADER} + ${GTC_SOURCE} ${GTC_INLINE} ${GTC_HEADER} + ${GTX_SOURCE} ${GTX_INLINE} ${GTX_HEADER} + ${VIRTREV_SOURCE} ${VIRTREV_INLINE} ${VIRTREV_HEADER}) diff --git a/ExternalLibs/glm/core/_detail.hpp b/ExternalLibs/glm/core/_detail.hpp new file mode 100644 index 0000000..8f8a1c5 --- /dev/null +++ b/ExternalLibs/glm/core/_detail.hpp @@ -0,0 +1,356 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2008-07-24 +// Updated : 2008-08-31 +// Licence : This source is under MIT License +// File : glm/core/_detail.hpp +/////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_detail +#define glm_core_detail + +#include "setup.hpp" +#include + +namespace glm{ +namespace detail +{ + class thalf; + +#if(__STDC_VERSION__ >= 199901L) // C99 detected, 64 bit types available + typedef int64_t sint64; + typedef uint64_t uint64; +#elif(GLM_COMPILER & GLM_COMPILER_VC) + typedef signed __int64 sint64; + typedef unsigned __int64 uint64; +#elif(GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_LLVM_GCC | GLM_COMPILER_CLANG)) + __extension__ typedef signed long long sint64; + __extension__ typedef unsigned long long uint64; +#elif(GLM_COMPILER & GLM_COMPILER_BC) + typedef Int64 sint64; + typedef Uint64 uint64; +#else//unknown compiler + typedef signed long long sint64; + typedef unsigned long long uint64; +#endif//GLM_COMPILER + + template + struct If + { + template + static GLM_FUNC_QUALIFIER T apply(F functor, const T& val) + { + return functor(val); + } + }; + + template<> + struct If + { + template + static GLM_FUNC_QUALIFIER T apply(F, const T& val) + { + return val; + } + }; + + //template + //struct traits + //{ + // static const bool is_signed = false; + // static const bool is_float = false; + // static const bool is_vector = false; + // static const bool is_matrix = false; + // static const bool is_genType = false; + // static const bool is_genIType = false; + // static const bool is_genUType = false; + //}; + + //template <> + //struct traits + //{ + // static const bool is_float = true; + // static const bool is_genType = true; + //}; + + //template <> + //struct traits + //{ + // static const bool is_float = true; + // static const bool is_genType = true; + //}; + + //template <> + //struct traits + //{ + // static const bool is_float = true; + // static const bool is_genType = true; + //}; + + //template + //struct desc + //{ + // typedef genType type; + // typedef genType * pointer; + // typedef genType const* const_pointer; + // typedef genType const *const const_pointer_const; + // typedef genType *const pointer_const; + // typedef genType & reference; + // typedef genType const& const_reference; + // typedef genType const& param_type; + + // typedef typename genType::value_type value_type; + // typedef typename genType::size_type size_type; + // static const typename size_type value_size; + //}; + + //template + //const typename desc::size_type desc::value_size = genType::value_size(); + + union uif32 + { + GLM_FUNC_QUALIFIER uif32() : + i(0) + {} + + GLM_FUNC_QUALIFIER uif32(float f) : + f(f) + {} + + GLM_FUNC_QUALIFIER uif32(unsigned int i) : + i(i) + {} + + float f; + unsigned int i; + }; + + union uif64 + { + GLM_FUNC_QUALIFIER uif64() : + i(0) + {} + + GLM_FUNC_QUALIFIER uif64(double f) : + f(f) + {} + + GLM_FUNC_QUALIFIER uif64(uint64 i) : + i(i) + {} + + double f; + uint64 i; + }; + + typedef uif32 uif; + + ////////////////// + // int + + template + struct is_int + { + enum is_int_enum + { + _YES = 0, + _NO = 1 + }; + }; + +#define GLM_DETAIL_IS_INT(T) \ + template <> \ + struct is_int \ + { \ + enum is_int_enum \ + { \ + _YES = 1, \ + _NO = 0 \ + }; \ + } + + ////////////////// + // uint + + template + struct is_uint + { + enum is_uint_enum + { + _YES = 0, + _NO = 1 + }; + }; + +#define GLM_DETAIL_IS_UINT(T) \ + template <> \ + struct is_uint \ + { \ + enum is_uint_enum \ + { \ + _YES = 1, \ + _NO = 0 \ + }; \ + } + + //GLM_DETAIL_IS_UINT(unsigned long long) + + ////////////////// + // float + + template + struct is_float + { + enum is_float_enum + { + _YES = 0, + _NO = 1 + }; + }; + +#define GLM_DETAIL_IS_FLOAT(T) \ + template <> \ + struct is_float \ + { \ + enum is_float_enum \ + { \ + _YES = 1, \ + _NO = 0 \ + }; \ + } + + ////////////////// + // bool + + template + struct is_bool + { + enum is_bool_enum + { + _YES = 0, + _NO = 1 + }; + }; + + template <> + struct is_bool + { + enum is_bool_enum + { + _YES = 1, + _NO = 0 + }; + }; + + ////////////////// + // vector + + template + struct is_vector + { + enum is_vector_enum + { + _YES = 0, + _NO = 1 + }; + }; + +# define GLM_DETAIL_IS_VECTOR(TYPE) \ + template \ + struct is_vector > \ + { \ + enum is_vector_enum \ + { \ + _YES = 1, \ + _NO = 0 \ + }; \ + } + + ////////////////// + // matrix + + template + struct is_matrix + { + enum is_matrix_enum + { + _YES = 0, + _NO = 1 + }; + }; + +#define GLM_DETAIL_IS_MATRIX(T) \ + template <> \ + struct is_matrix \ + { \ + enum is_matrix_enum \ + { \ + _YES = 1, \ + _NO = 0 \ + }; \ + } + + ////////////////// + // type + + template + struct type + { + enum type_enum + { + is_float = is_float::_YES, + is_int = is_int::_YES, + is_uint = is_uint::_YES, + is_bool = is_bool::_YES + }; + }; + + ////////////////// + // type + + typedef signed char int8; + typedef signed short int16; + typedef signed int int32; + typedef detail::sint64 int64; + + typedef unsigned char uint8; + typedef unsigned short uint16; + typedef unsigned int uint32; + typedef detail::uint64 uint64; + + typedef detail::thalf float16; + typedef float float32; + typedef double float64; + +}//namespace detail +}//namespace glm + +#if((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2005)) +# define GLM_DEPRECATED __declspec(deprecated) +# define GLM_ALIGN(x) __declspec(align(x)) +# define GLM_ALIGNED_STRUCT(x) __declspec(align(x)) struct +# define GLM_RESTRICT __declspec(restrict) +# define GLM_RESTRICT_VAR __restrict +#elif((GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_LLVM_GCC)) && (GLM_COMPILER >= GLM_COMPILER_GCC31)) +# define GLM_DEPRECATED __attribute__((__deprecated__)) +# define GLM_ALIGN(x) __attribute__((aligned(x))) +# define GLM_ALIGNED_STRUCT(x) struct __attribute__((aligned(x))) +# if(GLM_COMPILER >= GLM_COMPILER_GCC33) +# define GLM_RESTRICT __restrict__ +# define GLM_RESTRICT_VAR __restrict__ +# else +# define GLM_RESTRICT +# define GLM_RESTRICT_VAR +# endif +# define GLM_RESTRICT __restrict__ +# define GLM_RESTRICT_VAR __restrict__ +#else +# define GLM_DEPRECATED +# define GLM_ALIGN +# define GLM_ALIGNED_STRUCT(x) +# define GLM_RESTRICT +# define GLM_RESTRICT_VAR +#endif//GLM_COMPILER + +#endif//glm_core_detail diff --git a/ExternalLibs/glm/core/_fixes.hpp b/ExternalLibs/glm/core/_fixes.hpp new file mode 100644 index 0000000..ba70800 --- /dev/null +++ b/ExternalLibs/glm/core/_fixes.hpp @@ -0,0 +1,18 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2011-02-21 +// Updated : 2011-02-21 +// Licence : This source is under MIT License +// File : glm/core/_fixes.hpp +/////////////////////////////////////////////////////////////////////////////////////////////////// + +//! Workaround for compatibility with other libraries +#ifdef max +#undef max +#endif + +//! Workaround for compatibility with other libraries +#ifdef min +#undef min +#endif diff --git a/ExternalLibs/glm/core/_swizzle.hpp b/ExternalLibs/glm/core/_swizzle.hpp new file mode 100644 index 0000000..34dabfa --- /dev/null +++ b/ExternalLibs/glm/core/_swizzle.hpp @@ -0,0 +1,1085 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2006-04-20 +// Updated : 2008-08-22 +// Licence : This source is under MIT License +// File : glm/core/_swizzle.hpp +/////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_swizzle +#define glm_core_swizzle + +namespace glm +{ + enum comp + { + X = 0, + R = 0, + S = 0, + Y = 1, + G = 1, + T = 1, + Z = 2, + B = 2, + P = 2, + W = 3, + A = 3, + Q = 3 + }; +}//namespace glm + +#if(defined(GLM_SWIZZLE_XYZW) || defined(GLM_SWIZZLE)) + +#define xx swizzle(glm::X, glm::X) +#define yx swizzle(glm::Y, glm::X) +#define zx swizzle(glm::Z, glm::X) +#define wx swizzle(glm::W, glm::X) +#define xy swizzle(glm::X, glm::Y) +#define yy swizzle(glm::Y, glm::Y) +#define zy swizzle(glm::Z, glm::Y) +#define wy swizzle(glm::W, glm::Y) +#define xz swizzle(glm::X, glm::Z) +#define yz swizzle(glm::Y, glm::Z) +#define zz swizzle(glm::Z, glm::Z) +#define wz swizzle(glm::W, glm::Z) +#define xw swizzle(glm::X, glm::W) +#define yw swizzle(glm::Y, glm::W) +#define zw swizzle(glm::Z, glm::W) +#define ww swizzle(glm::W, glm::W) + +#endif + +#if(defined(GLM_SWIZZLE_RGBA) || defined(GLM_SWIZZLE)) + +#define rr swizzle(glm::X, glm::X) +#define gr swizzle(glm::Y, glm::X) +#define br swizzle(glm::Z, glm::X) +#define ar swizzle(glm::W, glm::X) +#define rg swizzle(glm::X, glm::Y) +#define gg swizzle(glm::Y, glm::Y) +#define bg swizzle(glm::Z, glm::Y) +#define ag swizzle(glm::W, glm::Y) +#define rb swizzle(glm::X, glm::Z) +#define gb swizzle(glm::Y, glm::Z) +#define bb swizzle(glm::Z, glm::Z) +#define ab swizzle(glm::W, glm::Z) +#define ra swizzle(glm::X, glm::W) +#define ga swizzle(glm::Y, glm::W) +#define ba swizzle(glm::Z, glm::W) +#define aa swizzle(glm::W, glm::W) + +#endif + +#if(defined(GLM_FORCE_SWIZZLE_STPQ) || defined(GLM_SWIZZLE)) + +#define ss swizzle(glm::X, glm::X) +#define ts swizzle(glm::Y, glm::X) +#define ps swizzle(glm::Z, glm::X) +#define qs swizzle(glm::W, glm::X) +#define st swizzle(glm::X, glm::Y) +#define tt swizzle(glm::Y, glm::Y) +#define pt swizzle(glm::Z, glm::Y) +#define qt swizzle(glm::W, glm::Y) +#define sp swizzle(glm::X, glm::Z) +#define tp swizzle(glm::Y, glm::Z) +#define pp swizzle(glm::Z, glm::Z) +#define qp swizzle(glm::W, glm::Z) +#define sq swizzle(glm::X, glm::W) +#define tq swizzle(glm::Y, glm::W) +#define pq swizzle(glm::Z, glm::W) +#define qq swizzle(glm::W, glm::W) + +#endif + +#if(defined(GLM_SWIZZLE_XYZW) || defined(GLM_SWIZZLE)) + +#define xxx swizzle(glm::X, glm::X, glm::X) +#define yxx swizzle(glm::Y, glm::X, glm::X) +#define zxx swizzle(glm::Z, glm::X, glm::X) +#define wxx swizzle(glm::W, glm::X, glm::X) +#define xyx swizzle(glm::X, glm::Y, glm::X) +#define yyx swizzle(glm::Y, glm::Y, glm::X) +#define zyx swizzle(glm::Z, glm::Y, glm::X) +#define wyx swizzle(glm::W, glm::Y, glm::X) +#define xzx swizzle(glm::X, glm::Z, glm::X) +#define yzx swizzle(glm::Y, glm::Z, glm::X) +#define zzx swizzle(glm::Z, glm::Z, glm::X) +#define wzx swizzle(glm::W, glm::Z, glm::X) +#define xwx swizzle(glm::X, glm::W, glm::X) +#define ywx swizzle(glm::Y, glm::W, glm::X) +#define zwx swizzle(glm::Z, glm::W, glm::X) +#define wwx swizzle(glm::W, glm::W, glm::X) +#define xxy swizzle(glm::X, glm::X, glm::Y) +#define yxy swizzle(glm::Y, glm::X, glm::Y) +#define zxy swizzle(glm::Z, glm::X, glm::Y) +#define wxy swizzle(glm::W, glm::X, glm::Y) +#define xyy swizzle(glm::X, glm::Y, glm::Y) +#define yyy swizzle(glm::Y, glm::Y, glm::Y) +#define zyy swizzle(glm::Z, glm::Y, glm::Y) +#define wyy swizzle(glm::W, glm::Y, glm::Y) +#define xzy swizzle(glm::X, glm::Z, glm::Y) +#define yzy swizzle(glm::Y, glm::Z, glm::Y) +#define zzy swizzle(glm::Z, glm::Z, glm::Y) +#define wzy swizzle(glm::W, glm::Z, glm::Y) +#define xwy swizzle(glm::X, glm::W, glm::Y) +#define ywy swizzle(glm::Y, glm::W, glm::Y) +#define zwy swizzle(glm::Z, glm::W, glm::Y) +#define wwy swizzle(glm::W, glm::W, glm::Y) +#define xxz swizzle(glm::X, glm::X, glm::Z) +#define yxz swizzle(glm::Y, glm::X, glm::Z) +#define zxz swizzle(glm::Z, glm::X, glm::Z) +#define wxz swizzle(glm::W, glm::X, glm::Z) +#define xyz swizzle(glm::X, glm::Y, glm::Z) +#define yyz swizzle(glm::Y, glm::Y, glm::Z) +#define zyz swizzle(glm::Z, glm::Y, glm::Z) +#define wyz swizzle(glm::W, glm::Y, glm::Z) +#define xzz swizzle(glm::X, glm::Z, glm::Z) +#define yzz swizzle(glm::Y, glm::Z, glm::Z) +#define zzz swizzle(glm::Z, glm::Z, glm::Z) +#define wzz swizzle(glm::W, glm::Z, glm::Z) +#define xwz swizzle(glm::X, glm::W, glm::Z) +#define ywz swizzle(glm::Y, glm::W, glm::Z) +#define zwz swizzle(glm::Z, glm::W, glm::Z) +#define wwz swizzle(glm::W, glm::W, glm::Z) +#define xxw swizzle(glm::X, glm::X, glm::W) +#define yxw swizzle(glm::Y, glm::X, glm::W) +#define zxw swizzle(glm::Z, glm::X, glm::W) +#define wxw swizzle(glm::W, glm::X, glm::W) +#define xyw swizzle(glm::X, glm::Y, glm::W) +#define yyw swizzle(glm::Y, glm::Y, glm::W) +#define zyw swizzle(glm::Z, glm::Y, glm::W) +#define wyw swizzle(glm::W, glm::Y, glm::W) +#define xzw swizzle(glm::X, glm::Z, glm::W) +#define yzw swizzle(glm::Y, glm::Z, glm::W) +#define zzw swizzle(glm::Z, glm::Z, glm::W) +#define wzw swizzle(glm::W, glm::Z, glm::W) +#define xww swizzle(glm::X, glm::W, glm::W) +#define yww swizzle(glm::Y, glm::W, glm::W) +#define zww swizzle(glm::Z, glm::W, glm::W) +#define www swizzle(glm::W, glm::W, glm::W) + +#endif + +#if(defined(GLM_SWIZZLE_RGBA) || defined(GLM_SWIZZLE)) + +#define rrr swizzle(glm::X, glm::X, glm::X) +#define grr swizzle(glm::Y, glm::X, glm::X) +#define brr swizzle(glm::Z, glm::X, glm::X) +#define arr swizzle(glm::W, glm::X, glm::X) +#define rgr swizzle(glm::X, glm::Y, glm::X) +#define ggr swizzle(glm::Y, glm::Y, glm::X) +#define bgr swizzle(glm::Z, glm::Y, glm::X) +#define agr swizzle(glm::W, glm::Y, glm::X) +#define rbr swizzle(glm::X, glm::Z, glm::X) +#define gbr swizzle(glm::Y, glm::Z, glm::X) +#define bbr swizzle(glm::Z, glm::Z, glm::X) +#define abr swizzle(glm::W, glm::Z, glm::X) +#define rar swizzle(glm::X, glm::W, glm::X) +#define gar swizzle(glm::Y, glm::W, glm::X) +#define bar swizzle(glm::Z, glm::W, glm::X) +#define aar swizzle(glm::W, glm::W, glm::X) +#define rrg swizzle(glm::X, glm::X, glm::Y) +#define grg swizzle(glm::Y, glm::X, glm::Y) +#define brg swizzle(glm::Z, glm::X, glm::Y) +#define arg swizzle(glm::W, glm::X, glm::Y) +#define rgg swizzle(glm::X, glm::Y, glm::Y) +#define ggg swizzle(glm::Y, glm::Y, glm::Y) +#define bgg swizzle(glm::Z, glm::Y, glm::Y) +#define agg swizzle(glm::W, glm::Y, glm::Y) +#define rbg swizzle(glm::X, glm::Z, glm::Y) +#define gbg swizzle(glm::Y, glm::Z, glm::Y) +#define bbg swizzle(glm::Z, glm::Z, glm::Y) +#define abg swizzle(glm::W, glm::Z, glm::Y) +#define rag swizzle(glm::X, glm::W, glm::Y) +#define gag swizzle(glm::Y, glm::W, glm::Y) +#define bag swizzle(glm::Z, glm::W, glm::Y) +#define aag swizzle(glm::W, glm::W, glm::Y) +#define rrb swizzle(glm::X, glm::X, glm::Z) +#define grb swizzle(glm::Y, glm::X, glm::Z) +#define brb swizzle(glm::Z, glm::X, glm::Z) +#define arb swizzle(glm::W, glm::X, glm::Z) +#define rgb swizzle(glm::X, glm::Y, glm::Z) +#define ggb swizzle(glm::Y, glm::Y, glm::Z) +#define bgb swizzle(glm::Z, glm::Y, glm::Z) +#define agb swizzle(glm::W, glm::Y, glm::Z) +#define rbb swizzle(glm::X, glm::Z, glm::Z) +#define gbb swizzle(glm::Y, glm::Z, glm::Z) +#define bbb swizzle(glm::Z, glm::Z, glm::Z) +#define abb swizzle(glm::W, glm::Z, glm::Z) +#define rab swizzle(glm::X, glm::W, glm::Z) +#define gab swizzle(glm::Y, glm::W, glm::Z) +#define bab swizzle(glm::Z, glm::W, glm::Z) +#define aab swizzle(glm::W, glm::W, glm::Z) +#define rra swizzle(glm::X, glm::X, glm::W) +#define gra swizzle(glm::Y, glm::X, glm::W) +#define bra swizzle(glm::Z, glm::X, glm::W) +#define ara swizzle(glm::W, glm::X, glm::W) +#define rga swizzle(glm::X, glm::Y, glm::W) +#define gga swizzle(glm::Y, glm::Y, glm::W) +#define bga swizzle(glm::Z, glm::Y, glm::W) +#define aga swizzle(glm::W, glm::Y, glm::W) +#define rba swizzle(glm::X, glm::Z, glm::W) +#define gba swizzle(glm::Y, glm::Z, glm::W) +#define bba swizzle(glm::Z, glm::Z, glm::W) +#define aba swizzle(glm::W, glm::Z, glm::W) +#define raa swizzle(glm::X, glm::W, glm::W) +#define gaa swizzle(glm::Y, glm::W, glm::W) +#define baa swizzle(glm::Z, glm::W, glm::W) +#define aaa swizzle(glm::W, glm::W, glm::W) + +#endif + +#if(defined(GLM_FORCE_SWIZZLE_STPQ) || defined(GLM_SWIZZLE)) + +#define sss swizzle(glm::X, glm::X, glm::X) +#define tss swizzle(glm::Y, glm::X, glm::X) +#define pss swizzle(glm::Z, glm::X, glm::X) +#define qss swizzle(glm::W, glm::X, glm::X) +#define sts swizzle(glm::X, glm::Y, glm::X) +#define tts swizzle(glm::Y, glm::Y, glm::X) +#define pts swizzle(glm::Z, glm::Y, glm::X) +#define qts swizzle(glm::W, glm::Y, glm::X) +#define sps swizzle(glm::X, glm::Z, glm::X) +#define tps swizzle(glm::Y, glm::Z, glm::X) +#define pps swizzle(glm::Z, glm::Z, glm::X) +#define qps swizzle(glm::W, glm::Z, glm::X) +#define sqs swizzle(glm::X, glm::W, glm::X) +#define tqs swizzle(glm::Y, glm::W, glm::X) +#define pqs swizzle(glm::Z, glm::W, glm::X) +#define qqs swizzle(glm::W, glm::W, glm::X) +#define sst swizzle(glm::X, glm::X, glm::Y) +#define tst swizzle(glm::Y, glm::X, glm::Y) +#define pst swizzle(glm::Z, glm::X, glm::Y) +#define qst swizzle(glm::W, glm::X, glm::Y) +#define stt swizzle(glm::X, glm::Y, glm::Y) +#define ttt swizzle(glm::Y, glm::Y, glm::Y) +#define ptt swizzle(glm::Z, glm::Y, glm::Y) +#define qtt swizzle(glm::W, glm::Y, glm::Y) +#define spt swizzle(glm::X, glm::Z, glm::Y) +#define tpt swizzle(glm::Y, glm::Z, glm::Y) +#define ppt swizzle(glm::Z, glm::Z, glm::Y) +#define qpt swizzle(glm::W, glm::Z, glm::Y) +#define sqt swizzle(glm::X, glm::W, glm::Y) +#define tqt swizzle(glm::Y, glm::W, glm::Y) +#define pqt swizzle(glm::Z, glm::W, glm::Y) +#define qqt swizzle(glm::W, glm::W, glm::Y) +#define ssp swizzle(glm::X, glm::X, glm::Z) +#define tsp swizzle(glm::Y, glm::X, glm::Z) +#define psp swizzle(glm::Z, glm::X, glm::Z) +#define qsp swizzle(glm::W, glm::X, glm::Z) +#define stp swizzle(glm::X, glm::Y, glm::Z) +#define ttp swizzle(glm::Y, glm::Y, glm::Z) +#define ptp swizzle(glm::Z, glm::Y, glm::Z) +#define qtp swizzle(glm::W, glm::Y, glm::Z) +#define spp swizzle(glm::X, glm::Z, glm::Z) +#define tpp swizzle(glm::Y, glm::Z, glm::Z) +#define ppp swizzle(glm::Z, glm::Z, glm::Z) +#define qpp swizzle(glm::W, glm::Z, glm::Z) +#define sqp swizzle(glm::X, glm::W, glm::Z) +#define tqp swizzle(glm::Y, glm::W, glm::Z) +#define pqp swizzle(glm::Z, glm::W, glm::Z) +#define qqp swizzle(glm::W, glm::W, glm::Z) +#define ssq swizzle(glm::X, glm::X, glm::W) +#define tsq swizzle(glm::Y, glm::X, glm::W) +#define psq swizzle(glm::Z, glm::X, glm::W) +#define qsq swizzle(glm::W, glm::X, glm::W) +#define stq swizzle(glm::X, glm::Y, glm::W) +#define ttq swizzle(glm::Y, glm::Y, glm::W) +#define ptq swizzle(glm::Z, glm::Y, glm::W) +#define qtq swizzle(glm::W, glm::Y, glm::W) +#define spq swizzle(glm::X, glm::Z, glm::W) +#define tpq swizzle(glm::Y, glm::Z, glm::W) +#define ppq swizzle(glm::Z, glm::Z, glm::W) +#define qpq swizzle(glm::W, glm::Z, glm::W) +#define sqq swizzle(glm::X, glm::W, glm::W) +#define tqq swizzle(glm::Y, glm::W, glm::W) +#define pqq swizzle(glm::Z, glm::W, glm::W) +#define qqq swizzle(glm::W, glm::W, glm::W) + +#endif + +#if(defined(GLM_SWIZZLE_XYZW) || defined(GLM_SWIZZLE)) + +#define xxxx swizzle(glm::X, glm::X, glm::X, glm::X) +#define yxxx swizzle(glm::Y, glm::X, glm::X, glm::X) +#define zxxx swizzle(glm::Z, glm::X, glm::X, glm::X) +#define wxxx swizzle(glm::W, glm::X, glm::X, glm::X) +#define xyxx swizzle(glm::X, glm::Y, glm::X, glm::X) +#define yyxx swizzle(glm::Y, glm::Y, glm::X, glm::X) +#define zyxx swizzle(glm::Z, glm::Y, glm::X, glm::X) +#define wyxx swizzle(glm::W, glm::Y, glm::X, glm::X) +#define xzxx swizzle(glm::X, glm::Z, glm::X, glm::X) +#define yzxx swizzle(glm::Y, glm::Z, glm::X, glm::X) +#define zzxx swizzle(glm::Z, glm::Z, glm::X, glm::X) +#define wzxx swizzle(glm::W, glm::Z, glm::X, glm::X) +#define xwxx swizzle(glm::X, glm::W, glm::X, glm::X) +#define ywxx swizzle(glm::Y, glm::W, glm::X, glm::X) +#define zwxx swizzle(glm::Z, glm::W, glm::X, glm::X) +#define wwxx swizzle(glm::W, glm::W, glm::X, glm::X) +#define xxyx swizzle(glm::X, glm::X, glm::Y, glm::X) +#define yxyx swizzle(glm::Y, glm::X, glm::Y, glm::X) +#define zxyx swizzle(glm::Z, glm::X, glm::Y, glm::X) +#define wxyx swizzle(glm::W, glm::X, glm::Y, glm::X) +#define xyyx swizzle(glm::X, glm::Y, glm::Y, glm::X) +#define yyyx swizzle(glm::Y, glm::Y, glm::Y, glm::X) +#define zyyx swizzle(glm::Z, glm::Y, glm::Y, glm::X) +#define wyyx swizzle(glm::W, glm::Y, glm::Y, glm::X) +#define xzyx swizzle(glm::X, glm::Z, glm::Y, glm::X) +#define yzyx swizzle(glm::Y, glm::Z, glm::Y, glm::X) +#define zzyx swizzle(glm::Z, glm::Z, glm::Y, glm::X) +#define wzyx swizzle(glm::W, glm::Z, glm::Y, glm::X) +#define xwyx swizzle(glm::X, glm::W, glm::Y, glm::X) +#define ywyx swizzle(glm::Y, glm::W, glm::Y, glm::X) +#define zwyx swizzle(glm::Z, glm::W, glm::Y, glm::X) +#define wwyx swizzle(glm::W, glm::W, glm::Y, glm::X) +#define xxzx swizzle(glm::X, glm::X, glm::Z, glm::X) +#define yxzx swizzle(glm::Y, glm::X, glm::Z, glm::X) +#define zxzx swizzle(glm::Z, glm::X, glm::Z, glm::X) +#define wxzx swizzle(glm::W, glm::X, glm::Z, glm::X) +#define xyzx swizzle(glm::X, glm::Y, glm::Z, glm::X) +#define yyzx swizzle(glm::Y, glm::Y, glm::Z, glm::X) +#define zyzx swizzle(glm::Z, glm::Y, glm::Z, glm::X) +#define wyzx swizzle(glm::W, glm::Y, glm::Z, glm::X) +#define xzzx swizzle(glm::X, glm::Z, glm::Z, glm::X) +#define yzzx swizzle(glm::Y, glm::Z, glm::Z, glm::X) +#define zzzx swizzle(glm::Z, glm::Z, glm::Z, glm::X) +#define wzzx swizzle(glm::W, glm::Z, glm::Z, glm::X) +#define xwzx swizzle(glm::X, glm::W, glm::Z, glm::X) +#define ywzx swizzle(glm::Y, glm::W, glm::Z, glm::X) +#define zwzx swizzle(glm::Z, glm::W, glm::Z, glm::X) +#define wwzx swizzle(glm::W, glm::W, glm::Z, glm::X) +#define xxwx swizzle(glm::X, glm::X, glm::W, glm::X) +#define yxwx swizzle(glm::Y, glm::X, glm::W, glm::X) +#define zxwx swizzle(glm::Z, glm::X, glm::W, glm::X) +#define wxwx swizzle(glm::W, glm::X, glm::W, glm::X) +#define xywx swizzle(glm::X, glm::Y, glm::W, glm::X) +#define yywx swizzle(glm::Y, glm::Y, glm::W, glm::X) +#define zywx swizzle(glm::Z, glm::Y, glm::W, glm::X) +#define wywx swizzle(glm::W, glm::Y, glm::W, glm::X) +#define xzwx swizzle(glm::X, glm::Z, glm::W, glm::X) +#define yzwx swizzle(glm::Y, glm::Z, glm::W, glm::X) +#define zzwx swizzle(glm::Z, glm::Z, glm::W, glm::X) +#define wzwx swizzle(glm::W, glm::Z, glm::W, glm::X) +#define xwwx swizzle(glm::X, glm::W, glm::W, glm::X) +#define ywwx swizzle(glm::Y, glm::W, glm::W, glm::X) +#define zwwx swizzle(glm::Z, glm::W, glm::W, glm::X) +#define wwwx swizzle(glm::W, glm::W, glm::W, glm::X) +#define xxxy swizzle(glm::X, glm::X, glm::X, glm::Y) +#define yxxy swizzle(glm::Y, glm::X, glm::X, glm::Y) +#define zxxy swizzle(glm::Z, glm::X, glm::X, glm::Y) +#define wxxy swizzle(glm::W, glm::X, glm::X, glm::Y) +#define xyxy swizzle(glm::X, glm::Y, glm::X, glm::Y) +#define yyxy swizzle(glm::Y, glm::Y, glm::X, glm::Y) +#define zyxy swizzle(glm::Z, glm::Y, glm::X, glm::Y) +#define wyxy swizzle(glm::W, glm::Y, glm::X, glm::Y) +#define xzxy swizzle(glm::X, glm::Z, glm::X, glm::Y) +#define yzxy swizzle(glm::Y, glm::Z, glm::X, glm::Y) +#define zzxy swizzle(glm::Z, glm::Z, glm::X, glm::Y) +#define wzxy swizzle(glm::W, glm::Z, glm::X, glm::Y) +#define xwxy swizzle(glm::X, glm::W, glm::X, glm::Y) +#define ywxy swizzle(glm::Y, glm::W, glm::X, glm::Y) +#define zwxy swizzle(glm::Z, glm::W, glm::X, glm::Y) +#define wwxy swizzle(glm::W, glm::W, glm::X, glm::Y) +#define xxyy swizzle(glm::X, glm::X, glm::Y, glm::Y) +#define yxyy swizzle(glm::Y, glm::X, glm::Y, glm::Y) +#define zxyy swizzle(glm::Z, glm::X, glm::Y, glm::Y) +#define wxyy swizzle(glm::W, glm::X, glm::Y, glm::Y) +#define xyyy swizzle(glm::X, glm::Y, glm::Y, glm::Y) +#define yyyy swizzle(glm::Y, glm::Y, glm::Y, glm::Y) +#define zyyy swizzle(glm::Z, glm::Y, glm::Y, glm::Y) +#define wyyy swizzle(glm::W, glm::Y, glm::Y, glm::Y) +#define xzyy swizzle(glm::X, glm::Z, glm::Y, glm::Y) +#define yzyy swizzle(glm::Y, glm::Z, glm::Y, glm::Y) +#define zzyy swizzle(glm::Z, glm::Z, glm::Y, glm::Y) +#define wzyy swizzle(glm::W, glm::Z, glm::Y, glm::Y) +#define xwyy swizzle(glm::X, glm::W, glm::Y, glm::Y) +#define ywyy swizzle(glm::Y, glm::W, glm::Y, glm::Y) +#define zwyy swizzle(glm::Z, glm::W, glm::Y, glm::Y) +#define wwyy swizzle(glm::W, glm::W, glm::Y, glm::Y) +#define xxzy swizzle(glm::X, glm::X, glm::Z, glm::Y) +#define yxzy swizzle(glm::Y, glm::X, glm::Z, glm::Y) +#define zxzy swizzle(glm::Z, glm::X, glm::Z, glm::Y) +#define wxzy swizzle(glm::W, glm::X, glm::Z, glm::Y) +#define xyzy swizzle(glm::X, glm::Y, glm::Z, glm::Y) +#define yyzy swizzle(glm::Y, glm::Y, glm::Z, glm::Y) +#define zyzy swizzle(glm::Z, glm::Y, glm::Z, glm::Y) +#define wyzy swizzle(glm::W, glm::Y, glm::Z, glm::Y) +#define xzzy swizzle(glm::X, glm::Z, glm::Z, glm::Y) +#define yzzy swizzle(glm::Y, glm::Z, glm::Z, glm::Y) +#define zzzy swizzle(glm::Z, glm::Z, glm::Z, glm::Y) +#define wzzy swizzle(glm::W, glm::Z, glm::Z, glm::Y) +#define xwzy swizzle(glm::X, glm::W, glm::Z, glm::Y) +#define ywzy swizzle(glm::Y, glm::W, glm::Z, glm::Y) +#define zwzy swizzle(glm::Z, glm::W, glm::Z, glm::Y) +#define wwzy swizzle(glm::W, glm::W, glm::Z, glm::Y) +#define xxwy swizzle(glm::X, glm::X, glm::W, glm::Y) +#define yxwy swizzle(glm::Y, glm::X, glm::W, glm::Y) +#define zxwy swizzle(glm::Z, glm::X, glm::W, glm::Y) +#define wxwy swizzle(glm::W, glm::X, glm::W, glm::Y) +#define xywy swizzle(glm::X, glm::Y, glm::W, glm::Y) +#define yywy swizzle(glm::Y, glm::Y, glm::W, glm::Y) +#define zywy swizzle(glm::Z, glm::Y, glm::W, glm::Y) +#define wywy swizzle(glm::W, glm::Y, glm::W, glm::Y) +#define xzwy swizzle(glm::X, glm::Z, glm::W, glm::Y) +#define yzwy swizzle(glm::Y, glm::Z, glm::W, glm::Y) +#define zzwy swizzle(glm::Z, glm::Z, glm::W, glm::Y) +#define wzwy swizzle(glm::W, glm::Z, glm::W, glm::Y) +#define xwwy swizzle(glm::X, glm::W, glm::W, glm::Y) +#define ywwy swizzle(glm::Y, glm::W, glm::W, glm::Y) +#define zwwy swizzle(glm::Z, glm::W, glm::W, glm::Y) +#define wwwy swizzle(glm::W, glm::W, glm::W, glm::Y) +#define xxxz swizzle(glm::X, glm::X, glm::X, glm::Z) +#define yxxz swizzle(glm::Y, glm::X, glm::X, glm::Z) +#define zxxz swizzle(glm::Z, glm::X, glm::X, glm::Z) +#define wxxz swizzle(glm::W, glm::X, glm::X, glm::Z) +#define xyxz swizzle(glm::X, glm::Y, glm::X, glm::Z) +#define yyxz swizzle(glm::Y, glm::Y, glm::X, glm::Z) +#define zyxz swizzle(glm::Z, glm::Y, glm::X, glm::Z) +#define wyxz swizzle(glm::W, glm::Y, glm::X, glm::Z) +#define xzxz swizzle(glm::X, glm::Z, glm::X, glm::Z) +#define yzxz swizzle(glm::Y, glm::Z, glm::X, glm::Z) +#define zzxz swizzle(glm::Z, glm::Z, glm::X, glm::Z) +#define wzxz swizzle(glm::W, glm::Z, glm::X, glm::Z) +#define xwxz swizzle(glm::X, glm::W, glm::X, glm::Z) +#define ywxz swizzle(glm::Y, glm::W, glm::X, glm::Z) +#define zwxz swizzle(glm::Z, glm::W, glm::X, glm::Z) +#define wwxz swizzle(glm::W, glm::W, glm::X, glm::Z) +#define xxyz swizzle(glm::X, glm::X, glm::Y, glm::Z) +#define yxyz swizzle(glm::Y, glm::X, glm::Y, glm::Z) +#define zxyz swizzle(glm::Z, glm::X, glm::Y, glm::Z) +#define wxyz swizzle(glm::W, glm::X, glm::Y, glm::Z) +#define xyyz swizzle(glm::X, glm::Y, glm::Y, glm::Z) +#define yyyz swizzle(glm::Y, glm::Y, glm::Y, glm::Z) +#define zyyz swizzle(glm::Z, glm::Y, glm::Y, glm::Z) +#define wyyz swizzle(glm::W, glm::Y, glm::Y, glm::Z) +#define xzyz swizzle(glm::X, glm::Z, glm::Y, glm::Z) +#define yzyz swizzle(glm::Y, glm::Z, glm::Y, glm::Z) +#define zzyz swizzle(glm::Z, glm::Z, glm::Y, glm::Z) +#define wzyz swizzle(glm::W, glm::Z, glm::Y, glm::Z) +#define xwyz swizzle(glm::X, glm::W, glm::Y, glm::Z) +#define ywyz swizzle(glm::Y, glm::W, glm::Y, glm::Z) +#define zwyz swizzle(glm::Z, glm::W, glm::Y, glm::Z) +#define wwyz swizzle(glm::W, glm::W, glm::Y, glm::Z) +#define xxzz swizzle(glm::X, glm::X, glm::Z, glm::Z) +#define yxzz swizzle(glm::Y, glm::X, glm::Z, glm::Z) +#define zxzz swizzle(glm::Z, glm::X, glm::Z, glm::Z) +#define wxzz swizzle(glm::W, glm::X, glm::Z, glm::Z) +#define xyzz swizzle(glm::X, glm::Y, glm::Z, glm::Z) +#define yyzz swizzle(glm::Y, glm::Y, glm::Z, glm::Z) +#define zyzz swizzle(glm::Z, glm::Y, glm::Z, glm::Z) +#define wyzz swizzle(glm::W, glm::Y, glm::Z, glm::Z) +#define xzzz swizzle(glm::X, glm::Z, glm::Z, glm::Z) +#define yzzz swizzle(glm::Y, glm::Z, glm::Z, glm::Z) +#define zzzz swizzle(glm::Z, glm::Z, glm::Z, glm::Z) +#define wzzz swizzle(glm::W, glm::Z, glm::Z, glm::Z) +#define xwzz swizzle(glm::X, glm::W, glm::Z, glm::Z) +#define ywzz swizzle(glm::Y, glm::W, glm::Z, glm::Z) +#define zwzz swizzle(glm::Z, glm::W, glm::Z, glm::Z) +#define wwzz swizzle(glm::W, glm::W, glm::Z, glm::Z) +#define xxwz swizzle(glm::X, glm::X, glm::W, glm::Z) +#define yxwz swizzle(glm::Y, glm::X, glm::W, glm::Z) +#define zxwz swizzle(glm::Z, glm::X, glm::W, glm::Z) +#define wxwz swizzle(glm::W, glm::X, glm::W, glm::Z) +#define xywz swizzle(glm::X, glm::Y, glm::W, glm::Z) +#define yywz swizzle(glm::Y, glm::Y, glm::W, glm::Z) +#define zywz swizzle(glm::Z, glm::Y, glm::W, glm::Z) +#define wywz swizzle(glm::W, glm::Y, glm::W, glm::Z) +#define xzwz swizzle(glm::X, glm::Z, glm::W, glm::Z) +#define yzwz swizzle(glm::Y, glm::Z, glm::W, glm::Z) +#define zzwz swizzle(glm::Z, glm::Z, glm::W, glm::Z) +#define wzwz swizzle(glm::W, glm::Z, glm::W, glm::Z) +#define xwwz swizzle(glm::X, glm::W, glm::W, glm::Z) +#define ywwz swizzle(glm::Y, glm::W, glm::W, glm::Z) +#define zwwz swizzle(glm::Z, glm::W, glm::W, glm::Z) +#define wwwz swizzle(glm::W, glm::W, glm::W, glm::Z) +#define xxxw swizzle(glm::X, glm::X, glm::X, glm::W) +#define yxxw swizzle(glm::Y, glm::X, glm::X, glm::W) +#define zxxw swizzle(glm::Z, glm::X, glm::X, glm::W) +#define wxxw swizzle(glm::W, glm::X, glm::X, glm::W) +#define xyxw swizzle(glm::X, glm::Y, glm::X, glm::W) +#define yyxw swizzle(glm::Y, glm::Y, glm::X, glm::W) +#define zyxw swizzle(glm::Z, glm::Y, glm::X, glm::W) +#define wyxw swizzle(glm::W, glm::Y, glm::X, glm::W) +#define xzxw swizzle(glm::X, glm::Z, glm::X, glm::W) +#define yzxw swizzle(glm::Y, glm::Z, glm::X, glm::W) +#define zzxw swizzle(glm::Z, glm::Z, glm::X, glm::W) +#define wzxw swizzle(glm::W, glm::Z, glm::X, glm::W) +#define xwxw swizzle(glm::X, glm::W, glm::X, glm::W) +#define ywxw swizzle(glm::Y, glm::W, glm::X, glm::W) +#define zwxw swizzle(glm::Z, glm::W, glm::X, glm::W) +#define wwxw swizzle(glm::W, glm::W, glm::X, glm::W) +#define xxyw swizzle(glm::X, glm::X, glm::Y, glm::W) +#define yxyw swizzle(glm::Y, glm::X, glm::Y, glm::W) +#define zxyw swizzle(glm::Z, glm::X, glm::Y, glm::W) +#define wxyw swizzle(glm::W, glm::X, glm::Y, glm::W) +#define xyyw swizzle(glm::X, glm::Y, glm::Y, glm::W) +#define yyyw swizzle(glm::Y, glm::Y, glm::Y, glm::W) +#define zyyw swizzle(glm::Z, glm::Y, glm::Y, glm::W) +#define wyyw swizzle(glm::W, glm::Y, glm::Y, glm::W) +#define xzyw swizzle(glm::X, glm::Z, glm::Y, glm::W) +#define yzyw swizzle(glm::Y, glm::Z, glm::Y, glm::W) +#define zzyw swizzle(glm::Z, glm::Z, glm::Y, glm::W) +#define wzyw swizzle(glm::W, glm::Z, glm::Y, glm::W) +#define xwyw swizzle(glm::X, glm::W, glm::Y, glm::W) +#define ywyw swizzle(glm::Y, glm::W, glm::Y, glm::W) +#define zwyw swizzle(glm::Z, glm::W, glm::Y, glm::W) +#define wwyw swizzle(glm::W, glm::W, glm::Y, glm::W) +#define xxzw swizzle(glm::X, glm::X, glm::Z, glm::W) +#define yxzw swizzle(glm::Y, glm::X, glm::Z, glm::W) +#define zxzw swizzle(glm::Z, glm::X, glm::Z, glm::W) +#define wxzw swizzle(glm::W, glm::X, glm::Z, glm::W) +#define xyzw swizzle(glm::X, glm::Y, glm::Z, glm::W) +#define yyzw swizzle(glm::Y, glm::Y, glm::Z, glm::W) +#define zyzw swizzle(glm::Z, glm::Y, glm::Z, glm::W) +#define wyzw swizzle(glm::W, glm::Y, glm::Z, glm::W) +#define xzzw swizzle(glm::X, glm::Z, glm::Z, glm::W) +#define yzzw swizzle(glm::Y, glm::Z, glm::Z, glm::W) +#define zzzw swizzle(glm::Z, glm::Z, glm::Z, glm::W) +#define wzzw swizzle(glm::W, glm::Z, glm::Z, glm::W) +#define xwzw swizzle(glm::X, glm::W, glm::Z, glm::W) +#define ywzw swizzle(glm::Y, glm::W, glm::Z, glm::W) +#define zwzw swizzle(glm::Z, glm::W, glm::Z, glm::W) +#define wwzw swizzle(glm::W, glm::W, glm::Z, glm::W) +#define xxww swizzle(glm::X, glm::X, glm::W, glm::W) +#define yxww swizzle(glm::Y, glm::X, glm::W, glm::W) +#define zxww swizzle(glm::Z, glm::X, glm::W, glm::W) +#define wxww swizzle(glm::W, glm::X, glm::W, glm::W) +#define xyww swizzle(glm::X, glm::Y, glm::W, glm::W) +#define yyww swizzle(glm::Y, glm::Y, glm::W, glm::W) +#define zyww swizzle(glm::Z, glm::Y, glm::W, glm::W) +#define wyww swizzle(glm::W, glm::Y, glm::W, glm::W) +#define xzww swizzle(glm::X, glm::Z, glm::W, glm::W) +#define yzww swizzle(glm::Y, glm::Z, glm::W, glm::W) +#define zzww swizzle(glm::Z, glm::Z, glm::W, glm::W) +#define wzww swizzle(glm::W, glm::Z, glm::W, glm::W) +#define xwww swizzle(glm::X, glm::W, glm::W, glm::W) +#define ywww swizzle(glm::Y, glm::W, glm::W, glm::W) +#define zwww swizzle(glm::Z, glm::W, glm::W, glm::W) +#define wwww swizzle(glm::W, glm::W, glm::W, glm::W) + +#endif + +#if(defined(GLM_SWIZZLE_RGBA) || defined(GLM_SWIZZLE)) + +#define rrrr swizzle(glm::X, glm::X, glm::X, glm::X) +#define grrr swizzle(glm::Y, glm::X, glm::X, glm::X) +#define brrr swizzle(glm::Z, glm::X, glm::X, glm::X) +#define arrr swizzle(glm::W, glm::X, glm::X, glm::X) +#define rgrr swizzle(glm::X, glm::Y, glm::X, glm::X) +#define ggrr swizzle(glm::Y, glm::Y, glm::X, glm::X) +#define bgrr swizzle(glm::Z, glm::Y, glm::X, glm::X) +#define agrr swizzle(glm::W, glm::Y, glm::X, glm::X) +#define rbrr swizzle(glm::X, glm::Z, glm::X, glm::X) +#define gbrr swizzle(glm::Y, glm::Z, glm::X, glm::X) +#define bbrr swizzle(glm::Z, glm::Z, glm::X, glm::X) +#define abrr swizzle(glm::W, glm::Z, glm::X, glm::X) +#define rarr swizzle(glm::X, glm::W, glm::X, glm::X) +#define garr swizzle(glm::Y, glm::W, glm::X, glm::X) +#define barr swizzle(glm::Z, glm::W, glm::X, glm::X) +#define aarr swizzle(glm::W, glm::W, glm::X, glm::X) +#define rrgr swizzle(glm::X, glm::X, glm::Y, glm::X) +#define grgr swizzle(glm::Y, glm::X, glm::Y, glm::X) +#define brgr swizzle(glm::Z, glm::X, glm::Y, glm::X) +#define argr swizzle(glm::W, glm::X, glm::Y, glm::X) +#define rggr swizzle(glm::X, glm::Y, glm::Y, glm::X) +#define gggr swizzle(glm::Y, glm::Y, glm::Y, glm::X) +#define bggr swizzle(glm::Z, glm::Y, glm::Y, glm::X) +#define aggr swizzle(glm::W, glm::Y, glm::Y, glm::X) +#define rbgr swizzle(glm::X, glm::Z, glm::Y, glm::X) +#define gbgr swizzle(glm::Y, glm::Z, glm::Y, glm::X) +#define bbgr swizzle(glm::Z, glm::Z, glm::Y, glm::X) +#define abgr swizzle(glm::W, glm::Z, glm::Y, glm::X) +#define ragr swizzle(glm::X, glm::W, glm::Y, glm::X) +#define gagr swizzle(glm::Y, glm::W, glm::Y, glm::X) +#define bagr swizzle(glm::Z, glm::W, glm::Y, glm::X) +#define aagr swizzle(glm::W, glm::W, glm::Y, glm::X) +#define rrbr swizzle(glm::X, glm::X, glm::Z, glm::X) +#define grbr swizzle(glm::Y, glm::X, glm::Z, glm::X) +#define brbr swizzle(glm::Z, glm::X, glm::Z, glm::X) +#define arbr swizzle(glm::W, glm::X, glm::Z, glm::X) +#define rgbr swizzle(glm::X, glm::Y, glm::Z, glm::X) +#define ggbr swizzle(glm::Y, glm::Y, glm::Z, glm::X) +#define bgbr swizzle(glm::Z, glm::Y, glm::Z, glm::X) +#define agbr swizzle(glm::W, glm::Y, glm::Z, glm::X) +#define rbbr swizzle(glm::X, glm::Z, glm::Z, glm::X) +#define gbbr swizzle(glm::Y, glm::Z, glm::Z, glm::X) +#define bbbr swizzle(glm::Z, glm::Z, glm::Z, glm::X) +#define abbr swizzle(glm::W, glm::Z, glm::Z, glm::X) +#define rabr swizzle(glm::X, glm::W, glm::Z, glm::X) +#define gabr swizzle(glm::Y, glm::W, glm::Z, glm::X) +#define babr swizzle(glm::Z, glm::W, glm::Z, glm::X) +#define aabr swizzle(glm::W, glm::W, glm::Z, glm::X) +#define rrar swizzle(glm::X, glm::X, glm::W, glm::X) +#define grar swizzle(glm::Y, glm::X, glm::W, glm::X) +#define brar swizzle(glm::Z, glm::X, glm::W, glm::X) +#define arar swizzle(glm::W, glm::X, glm::W, glm::X) +#define rgar swizzle(glm::X, glm::Y, glm::W, glm::X) +#define ggar swizzle(glm::Y, glm::Y, glm::W, glm::X) +#define bgar swizzle(glm::Z, glm::Y, glm::W, glm::X) +#define agar swizzle(glm::W, glm::Y, glm::W, glm::X) +#define rbar swizzle(glm::X, glm::Z, glm::W, glm::X) +#define gbar swizzle(glm::Y, glm::Z, glm::W, glm::X) +#define bbar swizzle(glm::Z, glm::Z, glm::W, glm::X) +#define abar swizzle(glm::W, glm::Z, glm::W, glm::X) +#define raar swizzle(glm::X, glm::W, glm::W, glm::X) +#define gaar swizzle(glm::Y, glm::W, glm::W, glm::X) +#define baar swizzle(glm::Z, glm::W, glm::W, glm::X) +#define aaar swizzle(glm::W, glm::W, glm::W, glm::X) +#define rrrg swizzle(glm::X, glm::X, glm::X, glm::Y) +#define grrg swizzle(glm::Y, glm::X, glm::X, glm::Y) +#define brrg swizzle(glm::Z, glm::X, glm::X, glm::Y) +#define arrg swizzle(glm::W, glm::X, glm::X, glm::Y) +#define rgrg swizzle(glm::X, glm::Y, glm::X, glm::Y) +#define ggrg swizzle(glm::Y, glm::Y, glm::X, glm::Y) +#define bgrg swizzle(glm::Z, glm::Y, glm::X, glm::Y) +#define agrg swizzle(glm::W, glm::Y, glm::X, glm::Y) +#define rbrg swizzle(glm::X, glm::Z, glm::X, glm::Y) +#define gbrg swizzle(glm::Y, glm::Z, glm::X, glm::Y) +#define bbrg swizzle(glm::Z, glm::Z, glm::X, glm::Y) +#define abrg swizzle(glm::W, glm::Z, glm::X, glm::Y) +#define rarg swizzle(glm::X, glm::W, glm::X, glm::Y) +#define garg swizzle(glm::Y, glm::W, glm::X, glm::Y) +#define barg swizzle(glm::Z, glm::W, glm::X, glm::Y) +#define aarg swizzle(glm::W, glm::W, glm::X, glm::Y) +#define rrgg swizzle(glm::X, glm::X, glm::Y, glm::Y) +#define grgg swizzle(glm::Y, glm::X, glm::Y, glm::Y) +#define brgg swizzle(glm::Z, glm::X, glm::Y, glm::Y) +#define argg swizzle(glm::W, glm::X, glm::Y, glm::Y) +#define rggg swizzle(glm::X, glm::Y, glm::Y, glm::Y) +#define gggg swizzle(glm::Y, glm::Y, glm::Y, glm::Y) +#define bggg swizzle(glm::Z, glm::Y, glm::Y, glm::Y) +#define aggg swizzle(glm::W, glm::Y, glm::Y, glm::Y) +#define rbgg swizzle(glm::X, glm::Z, glm::Y, glm::Y) +#define gbgg swizzle(glm::Y, glm::Z, glm::Y, glm::Y) +#define bbgg swizzle(glm::Z, glm::Z, glm::Y, glm::Y) +#define abgg swizzle(glm::W, glm::Z, glm::Y, glm::Y) +#define ragg swizzle(glm::X, glm::W, glm::Y, glm::Y) +#define gagg swizzle(glm::Y, glm::W, glm::Y, glm::Y) +#define bagg swizzle(glm::Z, glm::W, glm::Y, glm::Y) +#define aagg swizzle(glm::W, glm::W, glm::Y, glm::Y) +#define rrbg swizzle(glm::X, glm::X, glm::Z, glm::Y) +#define grbg swizzle(glm::Y, glm::X, glm::Z, glm::Y) +#define brbg swizzle(glm::Z, glm::X, glm::Z, glm::Y) +#define arbg swizzle(glm::W, glm::X, glm::Z, glm::Y) +#define rgbg swizzle(glm::X, glm::Y, glm::Z, glm::Y) +#define ggbg swizzle(glm::Y, glm::Y, glm::Z, glm::Y) +#define bgbg swizzle(glm::Z, glm::Y, glm::Z, glm::Y) +#define agbg swizzle(glm::W, glm::Y, glm::Z, glm::Y) +#define rbbg swizzle(glm::X, glm::Z, glm::Z, glm::Y) +#define gbbg swizzle(glm::Y, glm::Z, glm::Z, glm::Y) +#define bbbg swizzle(glm::Z, glm::Z, glm::Z, glm::Y) +#define abbg swizzle(glm::W, glm::Z, glm::Z, glm::Y) +#define rabg swizzle(glm::X, glm::W, glm::Z, glm::Y) +#define gabg swizzle(glm::Y, glm::W, glm::Z, glm::Y) +#define babg swizzle(glm::Z, glm::W, glm::Z, glm::Y) +#define aabg swizzle(glm::W, glm::W, glm::Z, glm::Y) +#define rrag swizzle(glm::X, glm::X, glm::W, glm::Y) +#define grag swizzle(glm::Y, glm::X, glm::W, glm::Y) +#define brag swizzle(glm::Z, glm::X, glm::W, glm::Y) +#define arag swizzle(glm::W, glm::X, glm::W, glm::Y) +#define rgag swizzle(glm::X, glm::Y, glm::W, glm::Y) +#define ggag swizzle(glm::Y, glm::Y, glm::W, glm::Y) +#define bgag swizzle(glm::Z, glm::Y, glm::W, glm::Y) +#define agag swizzle(glm::W, glm::Y, glm::W, glm::Y) +#define rbag swizzle(glm::X, glm::Z, glm::W, glm::Y) +#define gbag swizzle(glm::Y, glm::Z, glm::W, glm::Y) +#define bbag swizzle(glm::Z, glm::Z, glm::W, glm::Y) +#define abag swizzle(glm::W, glm::Z, glm::W, glm::Y) +#define raag swizzle(glm::X, glm::W, glm::W, glm::Y) +#define gaag swizzle(glm::Y, glm::W, glm::W, glm::Y) +#define baag swizzle(glm::Z, glm::W, glm::W, glm::Y) +#define aaag swizzle(glm::W, glm::W, glm::W, glm::Y) +#define rrrb swizzle(glm::X, glm::X, glm::X, glm::Z) +#define grrb swizzle(glm::Y, glm::X, glm::X, glm::Z) +#define brrb swizzle(glm::Z, glm::X, glm::X, glm::Z) +#define arrb swizzle(glm::W, glm::X, glm::X, glm::Z) +#define rgrb swizzle(glm::X, glm::Y, glm::X, glm::Z) +#define ggrb swizzle(glm::Y, glm::Y, glm::X, glm::Z) +#define bgrb swizzle(glm::Z, glm::Y, glm::X, glm::Z) +#define agrb swizzle(glm::W, glm::Y, glm::X, glm::Z) +#define rbrb swizzle(glm::X, glm::Z, glm::X, glm::Z) +#define gbrb swizzle(glm::Y, glm::Z, glm::X, glm::Z) +#define bbrb swizzle(glm::Z, glm::Z, glm::X, glm::Z) +#define abrb swizzle(glm::W, glm::Z, glm::X, glm::Z) +#define rarb swizzle(glm::X, glm::W, glm::X, glm::Z) +#define garb swizzle(glm::Y, glm::W, glm::X, glm::Z) +#define barb swizzle(glm::Z, glm::W, glm::X, glm::Z) +#define aarb swizzle(glm::W, glm::W, glm::X, glm::Z) +#define rrgb swizzle(glm::X, glm::X, glm::Y, glm::Z) +#define grgb swizzle(glm::Y, glm::X, glm::Y, glm::Z) +#define brgb swizzle(glm::Z, glm::X, glm::Y, glm::Z) +#define argb swizzle(glm::W, glm::X, glm::Y, glm::Z) +#define rggb swizzle(glm::X, glm::Y, glm::Y, glm::Z) +#define gggb swizzle(glm::Y, glm::Y, glm::Y, glm::Z) +#define bggb swizzle(glm::Z, glm::Y, glm::Y, glm::Z) +#define aggb swizzle(glm::W, glm::Y, glm::Y, glm::Z) +#define rbgb swizzle(glm::X, glm::Z, glm::Y, glm::Z) +#define gbgb swizzle(glm::Y, glm::Z, glm::Y, glm::Z) +#define bbgb swizzle(glm::Z, glm::Z, glm::Y, glm::Z) +#define abgb swizzle(glm::W, glm::Z, glm::Y, glm::Z) +#define ragb swizzle(glm::X, glm::W, glm::Y, glm::Z) +#define gagb swizzle(glm::Y, glm::W, glm::Y, glm::Z) +#define bagb swizzle(glm::Z, glm::W, glm::Y, glm::Z) +#define aagb swizzle(glm::W, glm::W, glm::Y, glm::Z) +#define rrbb swizzle(glm::X, glm::X, glm::Z, glm::Z) +#define grbb swizzle(glm::Y, glm::X, glm::Z, glm::Z) +#define brbb swizzle(glm::Z, glm::X, glm::Z, glm::Z) +#define arbb swizzle(glm::W, glm::X, glm::Z, glm::Z) +#define rgbb swizzle(glm::X, glm::Y, glm::Z, glm::Z) +#define ggbb swizzle(glm::Y, glm::Y, glm::Z, glm::Z) +#define bgbb swizzle(glm::Z, glm::Y, glm::Z, glm::Z) +#define agbb swizzle(glm::W, glm::Y, glm::Z, glm::Z) +#define rbbb swizzle(glm::X, glm::Z, glm::Z, glm::Z) +#define gbbb swizzle(glm::Y, glm::Z, glm::Z, glm::Z) +#define bbbb swizzle(glm::Z, glm::Z, glm::Z, glm::Z) +#define abbb swizzle(glm::W, glm::Z, glm::Z, glm::Z) +#define rabb swizzle(glm::X, glm::W, glm::Z, glm::Z) +#define gabb swizzle(glm::Y, glm::W, glm::Z, glm::Z) +#define babb swizzle(glm::Z, glm::W, glm::Z, glm::Z) +#define aabb swizzle(glm::W, glm::W, glm::Z, glm::Z) +#define rrab swizzle(glm::X, glm::X, glm::W, glm::Z) +#define grab swizzle(glm::Y, glm::X, glm::W, glm::Z) +#define brab swizzle(glm::Z, glm::X, glm::W, glm::Z) +#define arab swizzle(glm::W, glm::X, glm::W, glm::Z) +#define rgab swizzle(glm::X, glm::Y, glm::W, glm::Z) +#define ggab swizzle(glm::Y, glm::Y, glm::W, glm::Z) +#define bgab swizzle(glm::Z, glm::Y, glm::W, glm::Z) +#define agab swizzle(glm::W, glm::Y, glm::W, glm::Z) +#define rbab swizzle(glm::X, glm::Z, glm::W, glm::Z) +#define gbab swizzle(glm::Y, glm::Z, glm::W, glm::Z) +#define bbab swizzle(glm::Z, glm::Z, glm::W, glm::Z) +#define abab swizzle(glm::W, glm::Z, glm::W, glm::Z) +#define raab swizzle(glm::X, glm::W, glm::W, glm::Z) +#define gaab swizzle(glm::Y, glm::W, glm::W, glm::Z) +#define baab swizzle(glm::Z, glm::W, glm::W, glm::Z) +#define aaab swizzle(glm::W, glm::W, glm::W, glm::Z) +#define rrra swizzle(glm::X, glm::X, glm::X, glm::W) +#define grra swizzle(glm::Y, glm::X, glm::X, glm::W) +#define brra swizzle(glm::Z, glm::X, glm::X, glm::W) +#define arra swizzle(glm::W, glm::X, glm::X, glm::W) +#define rgra swizzle(glm::X, glm::Y, glm::X, glm::W) +#define ggra swizzle(glm::Y, glm::Y, glm::X, glm::W) +#define bgra swizzle(glm::Z, glm::Y, glm::X, glm::W) +#define agra swizzle(glm::W, glm::Y, glm::X, glm::W) +#define rbra swizzle(glm::X, glm::Z, glm::X, glm::W) +#define gbra swizzle(glm::Y, glm::Z, glm::X, glm::W) +#define bbra swizzle(glm::Z, glm::Z, glm::X, glm::W) +#define abra swizzle(glm::W, glm::Z, glm::X, glm::W) +#define rara swizzle(glm::X, glm::W, glm::X, glm::W) +#define gara swizzle(glm::Y, glm::W, glm::X, glm::W) +#define bara swizzle(glm::Z, glm::W, glm::X, glm::W) +#define aara swizzle(glm::W, glm::W, glm::X, glm::W) +#define rrga swizzle(glm::X, glm::X, glm::Y, glm::W) +#define grga swizzle(glm::Y, glm::X, glm::Y, glm::W) +#define brga swizzle(glm::Z, glm::X, glm::Y, glm::W) +#define arga swizzle(glm::W, glm::X, glm::Y, glm::W) +#define rgga swizzle(glm::X, glm::Y, glm::Y, glm::W) +#define ggga swizzle(glm::Y, glm::Y, glm::Y, glm::W) +#define bgga swizzle(glm::Z, glm::Y, glm::Y, glm::W) +#define agga swizzle(glm::W, glm::Y, glm::Y, glm::W) +#define rbga swizzle(glm::X, glm::Z, glm::Y, glm::W) +#define gbga swizzle(glm::Y, glm::Z, glm::Y, glm::W) +#define bbga swizzle(glm::Z, glm::Z, glm::Y, glm::W) +#define abga swizzle(glm::W, glm::Z, glm::Y, glm::W) +#define raga swizzle(glm::X, glm::W, glm::Y, glm::W) +#define gaga swizzle(glm::Y, glm::W, glm::Y, glm::W) +#define baga swizzle(glm::Z, glm::W, glm::Y, glm::W) +#define aaga swizzle(glm::W, glm::W, glm::Y, glm::W) +#define rrba swizzle(glm::X, glm::X, glm::Z, glm::W) +#define grba swizzle(glm::Y, glm::X, glm::Z, glm::W) +#define brba swizzle(glm::Z, glm::X, glm::Z, glm::W) +#define arba swizzle(glm::W, glm::X, glm::Z, glm::W) +#define rgba swizzle(glm::X, glm::Y, glm::Z, glm::W) +#define ggba swizzle(glm::Y, glm::Y, glm::Z, glm::W) +#define bgba swizzle(glm::Z, glm::Y, glm::Z, glm::W) +#define agba swizzle(glm::W, glm::Y, glm::Z, glm::W) +#define rbba swizzle(glm::X, glm::Z, glm::Z, glm::W) +#define gbba swizzle(glm::Y, glm::Z, glm::Z, glm::W) +#define bbba swizzle(glm::Z, glm::Z, glm::Z, glm::W) +#define abba swizzle(glm::W, glm::Z, glm::Z, glm::W) +#define raba swizzle(glm::X, glm::W, glm::Z, glm::W) +#define gaba swizzle(glm::Y, glm::W, glm::Z, glm::W) +#define baba swizzle(glm::Z, glm::W, glm::Z, glm::W) +#define aaba swizzle(glm::W, glm::W, glm::Z, glm::W) +#define rraa swizzle(glm::X, glm::X, glm::W, glm::W) +#define graa swizzle(glm::Y, glm::X, glm::W, glm::W) +#define braa swizzle(glm::Z, glm::X, glm::W, glm::W) +#define araa swizzle(glm::W, glm::X, glm::W, glm::W) +#define rgaa swizzle(glm::X, glm::Y, glm::W, glm::W) +#define ggaa swizzle(glm::Y, glm::Y, glm::W, glm::W) +#define bgaa swizzle(glm::Z, glm::Y, glm::W, glm::W) +#define agaa swizzle(glm::W, glm::Y, glm::W, glm::W) +#define rbaa swizzle(glm::X, glm::Z, glm::W, glm::W) +#define gbaa swizzle(glm::Y, glm::Z, glm::W, glm::W) +#define bbaa swizzle(glm::Z, glm::Z, glm::W, glm::W) +#define abaa swizzle(glm::W, glm::Z, glm::W, glm::W) +#define raaa swizzle(glm::X, glm::W, glm::W, glm::W) +#define gaaa swizzle(glm::Y, glm::W, glm::W, glm::W) +#define baaa swizzle(glm::Z, glm::W, glm::W, glm::W) +#define aaaa swizzle(glm::W, glm::W, glm::W, glm::W) + +#endif + +#if(defined(GLM_FORCE_SWIZZLE_STPQ) || defined(GLM_SWIZZLE)) + +#define ssss swizzle(glm::X, glm::X, glm::X, glm::X) +#define tsss swizzle(glm::Y, glm::X, glm::X, glm::X) +#define psss swizzle(glm::Z, glm::X, glm::X, glm::X) +#define qsss swizzle(glm::W, glm::X, glm::X, glm::X) +#define stss swizzle(glm::X, glm::Y, glm::X, glm::X) +#define ttss swizzle(glm::Y, glm::Y, glm::X, glm::X) +#define ptss swizzle(glm::Z, glm::Y, glm::X, glm::X) +#define qtss swizzle(glm::W, glm::Y, glm::X, glm::X) +#define spss swizzle(glm::X, glm::Z, glm::X, glm::X) +#define tpss swizzle(glm::Y, glm::Z, glm::X, glm::X) +#define ppss swizzle(glm::Z, glm::Z, glm::X, glm::X) +#define qpss swizzle(glm::W, glm::Z, glm::X, glm::X) +#define sqss swizzle(glm::X, glm::W, glm::X, glm::X) +#define tqss swizzle(glm::Y, glm::W, glm::X, glm::X) +#define pqss swizzle(glm::Z, glm::W, glm::X, glm::X) +#define qqss swizzle(glm::W, glm::W, glm::X, glm::X) +#define ssts swizzle(glm::X, glm::X, glm::Y, glm::X) +#define tsts swizzle(glm::Y, glm::X, glm::Y, glm::X) +#define psts swizzle(glm::Z, glm::X, glm::Y, glm::X) +#define qsts swizzle(glm::W, glm::X, glm::Y, glm::X) +#define stts swizzle(glm::X, glm::Y, glm::Y, glm::X) +#define ttts swizzle(glm::Y, glm::Y, glm::Y, glm::X) +#define ptts swizzle(glm::Z, glm::Y, glm::Y, glm::X) +#define qtts swizzle(glm::W, glm::Y, glm::Y, glm::X) +#define spts swizzle(glm::X, glm::Z, glm::Y, glm::X) +#define tpts swizzle(glm::Y, glm::Z, glm::Y, glm::X) +#define ppts swizzle(glm::Z, glm::Z, glm::Y, glm::X) +#define qpts swizzle(glm::W, glm::Z, glm::Y, glm::X) +#define sqts swizzle(glm::X, glm::W, glm::Y, glm::X) +#define tqts swizzle(glm::Y, glm::W, glm::Y, glm::X) +#define pqts swizzle(glm::Z, glm::W, glm::Y, glm::X) +#define qqts swizzle(glm::W, glm::W, glm::Y, glm::X) +#define ssps swizzle(glm::X, glm::X, glm::Z, glm::X) +#define tsps swizzle(glm::Y, glm::X, glm::Z, glm::X) +#define psps swizzle(glm::Z, glm::X, glm::Z, glm::X) +#define qsps swizzle(glm::W, glm::X, glm::Z, glm::X) +#define stps swizzle(glm::X, glm::Y, glm::Z, glm::X) +#define ttps swizzle(glm::Y, glm::Y, glm::Z, glm::X) +#define ptps swizzle(glm::Z, glm::Y, glm::Z, glm::X) +#define qtps swizzle(glm::W, glm::Y, glm::Z, glm::X) +#define spps swizzle(glm::X, glm::Z, glm::Z, glm::X) +#define tpps swizzle(glm::Y, glm::Z, glm::Z, glm::X) +#define ppps swizzle(glm::Z, glm::Z, glm::Z, glm::X) +#define qpps swizzle(glm::W, glm::Z, glm::Z, glm::X) +#define sqps swizzle(glm::X, glm::W, glm::Z, glm::X) +#define tqps swizzle(glm::Y, glm::W, glm::Z, glm::X) +#define pqps swizzle(glm::Z, glm::W, glm::Z, glm::X) +#define qqps swizzle(glm::W, glm::W, glm::Z, glm::X) +#define ssqs swizzle(glm::X, glm::X, glm::W, glm::X) +#define tsqs swizzle(glm::Y, glm::X, glm::W, glm::X) +#define psqs swizzle(glm::Z, glm::X, glm::W, glm::X) +#define qsqs swizzle(glm::W, glm::X, glm::W, glm::X) +#define stqs swizzle(glm::X, glm::Y, glm::W, glm::X) +#define ttqs swizzle(glm::Y, glm::Y, glm::W, glm::X) +#define ptqs swizzle(glm::Z, glm::Y, glm::W, glm::X) +#define qtqs swizzle(glm::W, glm::Y, glm::W, glm::X) +#define spqs swizzle(glm::X, glm::Z, glm::W, glm::X) +#define tpqs swizzle(glm::Y, glm::Z, glm::W, glm::X) +#define ppqs swizzle(glm::Z, glm::Z, glm::W, glm::X) +#define qpqs swizzle(glm::W, glm::Z, glm::W, glm::X) +#define sqqs swizzle(glm::X, glm::W, glm::W, glm::X) +#define tqqs swizzle(glm::Y, glm::W, glm::W, glm::X) +#define pqqs swizzle(glm::Z, glm::W, glm::W, glm::X) +#define qqqs swizzle(glm::W, glm::W, glm::W, glm::X) +#define ssst swizzle(glm::X, glm::X, glm::X, glm::Y) +#define tsst swizzle(glm::Y, glm::X, glm::X, glm::Y) +#define psst swizzle(glm::Z, glm::X, glm::X, glm::Y) +#define qsst swizzle(glm::W, glm::X, glm::X, glm::Y) +#define stst swizzle(glm::X, glm::Y, glm::X, glm::Y) +#define ttst swizzle(glm::Y, glm::Y, glm::X, glm::Y) +#define ptst swizzle(glm::Z, glm::Y, glm::X, glm::Y) +#define qtst swizzle(glm::W, glm::Y, glm::X, glm::Y) +#define spst swizzle(glm::X, glm::Z, glm::X, glm::Y) +#define tpst swizzle(glm::Y, glm::Z, glm::X, glm::Y) +#define ppst swizzle(glm::Z, glm::Z, glm::X, glm::Y) +#define qpst swizzle(glm::W, glm::Z, glm::X, glm::Y) +#define sqst swizzle(glm::X, glm::W, glm::X, glm::Y) +#define tqst swizzle(glm::Y, glm::W, glm::X, glm::Y) +#define pqst swizzle(glm::Z, glm::W, glm::X, glm::Y) +#define qqst swizzle(glm::W, glm::W, glm::X, glm::Y) +#define sstt swizzle(glm::X, glm::X, glm::Y, glm::Y) +#define tstt swizzle(glm::Y, glm::X, glm::Y, glm::Y) +#define pstt swizzle(glm::Z, glm::X, glm::Y, glm::Y) +#define qstt swizzle(glm::W, glm::X, glm::Y, glm::Y) +#define sttt swizzle(glm::X, glm::Y, glm::Y, glm::Y) +#define tttt swizzle(glm::Y, glm::Y, glm::Y, glm::Y) +#define pttt swizzle(glm::Z, glm::Y, glm::Y, glm::Y) +#define qttt swizzle(glm::W, glm::Y, glm::Y, glm::Y) +#define sptt swizzle(glm::X, glm::Z, glm::Y, glm::Y) +#define tptt swizzle(glm::Y, glm::Z, glm::Y, glm::Y) +#define pptt swizzle(glm::Z, glm::Z, glm::Y, glm::Y) +#define qptt swizzle(glm::W, glm::Z, glm::Y, glm::Y) +#define sqtt swizzle(glm::X, glm::W, glm::Y, glm::Y) +#define tqtt swizzle(glm::Y, glm::W, glm::Y, glm::Y) +#define pqtt swizzle(glm::Z, glm::W, glm::Y, glm::Y) +#define qqtt swizzle(glm::W, glm::W, glm::Y, glm::Y) +#define sspt swizzle(glm::X, glm::X, glm::Z, glm::Y) +#define tspt swizzle(glm::Y, glm::X, glm::Z, glm::Y) +#define pspt swizzle(glm::Z, glm::X, glm::Z, glm::Y) +#define qspt swizzle(glm::W, glm::X, glm::Z, glm::Y) +#define stpt swizzle(glm::X, glm::Y, glm::Z, glm::Y) +#define ttpt swizzle(glm::Y, glm::Y, glm::Z, glm::Y) +#define ptpt swizzle(glm::Z, glm::Y, glm::Z, glm::Y) +#define qtpt swizzle(glm::W, glm::Y, glm::Z, glm::Y) +#define sppt swizzle(glm::X, glm::Z, glm::Z, glm::Y) +#define tppt swizzle(glm::Y, glm::Z, glm::Z, glm::Y) +#define pppt swizzle(glm::Z, glm::Z, glm::Z, glm::Y) +#define qppt swizzle(glm::W, glm::Z, glm::Z, glm::Y) +#define sqpt swizzle(glm::X, glm::W, glm::Z, glm::Y) +#define tqpt swizzle(glm::Y, glm::W, glm::Z, glm::Y) +#define pqpt swizzle(glm::Z, glm::W, glm::Z, glm::Y) +#define qqpt swizzle(glm::W, glm::W, glm::Z, glm::Y) +#define ssqt swizzle(glm::X, glm::X, glm::W, glm::Y) +#define tsqt swizzle(glm::Y, glm::X, glm::W, glm::Y) +#define psqt swizzle(glm::Z, glm::X, glm::W, glm::Y) +#define qsqt swizzle(glm::W, glm::X, glm::W, glm::Y) +#define stqt swizzle(glm::X, glm::Y, glm::W, glm::Y) +#define ttqt swizzle(glm::Y, glm::Y, glm::W, glm::Y) +#define ptqt swizzle(glm::Z, glm::Y, glm::W, glm::Y) +#define qtqt swizzle(glm::W, glm::Y, glm::W, glm::Y) +#define spqt swizzle(glm::X, glm::Z, glm::W, glm::Y) +#define tpqt swizzle(glm::Y, glm::Z, glm::W, glm::Y) +#define ppqt swizzle(glm::Z, glm::Z, glm::W, glm::Y) +#define qpqt swizzle(glm::W, glm::Z, glm::W, glm::Y) +#define sqqt swizzle(glm::X, glm::W, glm::W, glm::Y) +#define tqqt swizzle(glm::Y, glm::W, glm::W, glm::Y) +#define pqqt swizzle(glm::Z, glm::W, glm::W, glm::Y) +#define qqqt swizzle(glm::W, glm::W, glm::W, glm::Y) +#define sssp swizzle(glm::X, glm::X, glm::X, glm::Z) +#define tssp swizzle(glm::Y, glm::X, glm::X, glm::Z) +#define pssp swizzle(glm::Z, glm::X, glm::X, glm::Z) +#define qssp swizzle(glm::W, glm::X, glm::X, glm::Z) +#define stsp swizzle(glm::X, glm::Y, glm::X, glm::Z) +#define ttsp swizzle(glm::Y, glm::Y, glm::X, glm::Z) +#define ptsp swizzle(glm::Z, glm::Y, glm::X, glm::Z) +#define qtsp swizzle(glm::W, glm::Y, glm::X, glm::Z) +#define spsp swizzle(glm::X, glm::Z, glm::X, glm::Z) +#define tpsp swizzle(glm::Y, glm::Z, glm::X, glm::Z) +#define ppsp swizzle(glm::Z, glm::Z, glm::X, glm::Z) +#define qpsp swizzle(glm::W, glm::Z, glm::X, glm::Z) +#define sqsp swizzle(glm::X, glm::W, glm::X, glm::Z) +#define tqsp swizzle(glm::Y, glm::W, glm::X, glm::Z) +#define pqsp swizzle(glm::Z, glm::W, glm::X, glm::Z) +#define qqsp swizzle(glm::W, glm::W, glm::X, glm::Z) +#define sstp swizzle(glm::X, glm::X, glm::Y, glm::Z) +#define tstp swizzle(glm::Y, glm::X, glm::Y, glm::Z) +#define pstp swizzle(glm::Z, glm::X, glm::Y, glm::Z) +#define qstp swizzle(glm::W, glm::X, glm::Y, glm::Z) +#define sttp swizzle(glm::X, glm::Y, glm::Y, glm::Z) +#define tttp swizzle(glm::Y, glm::Y, glm::Y, glm::Z) +#define pttp swizzle(glm::Z, glm::Y, glm::Y, glm::Z) +#define qttp swizzle(glm::W, glm::Y, glm::Y, glm::Z) +#define sptp swizzle(glm::X, glm::Z, glm::Y, glm::Z) +#define tptp swizzle(glm::Y, glm::Z, glm::Y, glm::Z) +#define pptp swizzle(glm::Z, glm::Z, glm::Y, glm::Z) +#define qptp swizzle(glm::W, glm::Z, glm::Y, glm::Z) +#define sqtp swizzle(glm::X, glm::W, glm::Y, glm::Z) +#define tqtp swizzle(glm::Y, glm::W, glm::Y, glm::Z) +#define pqtp swizzle(glm::Z, glm::W, glm::Y, glm::Z) +#define qqtp swizzle(glm::W, glm::W, glm::Y, glm::Z) +#define sspp swizzle(glm::X, glm::X, glm::Z, glm::Z) +#define tspp swizzle(glm::Y, glm::X, glm::Z, glm::Z) +#define pspp swizzle(glm::Z, glm::X, glm::Z, glm::Z) +#define qspp swizzle(glm::W, glm::X, glm::Z, glm::Z) +#define stpp swizzle(glm::X, glm::Y, glm::Z, glm::Z) +#define ttpp swizzle(glm::Y, glm::Y, glm::Z, glm::Z) +#define ptpp swizzle(glm::Z, glm::Y, glm::Z, glm::Z) +#define qtpp swizzle(glm::W, glm::Y, glm::Z, glm::Z) +#define sppp swizzle(glm::X, glm::Z, glm::Z, glm::Z) +#define tppp swizzle(glm::Y, glm::Z, glm::Z, glm::Z) +#define pppp swizzle(glm::Z, glm::Z, glm::Z, glm::Z) +#define qppp swizzle(glm::W, glm::Z, glm::Z, glm::Z) +#define sqpp swizzle(glm::X, glm::W, glm::Z, glm::Z) +#define tqpp swizzle(glm::Y, glm::W, glm::Z, glm::Z) +#define pqpp swizzle(glm::Z, glm::W, glm::Z, glm::Z) +#define qqpp swizzle(glm::W, glm::W, glm::Z, glm::Z) +#define ssqp swizzle(glm::X, glm::X, glm::W, glm::Z) +#define tsqp swizzle(glm::Y, glm::X, glm::W, glm::Z) +#define psqp swizzle(glm::Z, glm::X, glm::W, glm::Z) +#define qsqp swizzle(glm::W, glm::X, glm::W, glm::Z) +#define stqp swizzle(glm::X, glm::Y, glm::W, glm::Z) +#define ttqp swizzle(glm::Y, glm::Y, glm::W, glm::Z) +#define ptqp swizzle(glm::Z, glm::Y, glm::W, glm::Z) +#define qtqp swizzle(glm::W, glm::Y, glm::W, glm::Z) +#define spqp swizzle(glm::X, glm::Z, glm::W, glm::Z) +#define tpqp swizzle(glm::Y, glm::Z, glm::W, glm::Z) +#define ppqp swizzle(glm::Z, glm::Z, glm::W, glm::Z) +#define qpqp swizzle(glm::W, glm::Z, glm::W, glm::Z) +#define sqqp swizzle(glm::X, glm::W, glm::W, glm::Z) +#define tqqp swizzle(glm::Y, glm::W, glm::W, glm::Z) +#define pqqp swizzle(glm::Z, glm::W, glm::W, glm::Z) +#define qqqp swizzle(glm::W, glm::W, glm::W, glm::Z) +#define sssq swizzle(glm::X, glm::X, glm::X, glm::W) +#define tssq swizzle(glm::Y, glm::X, glm::X, glm::W) +#define pssq swizzle(glm::Z, glm::X, glm::X, glm::W) +#define qssq swizzle(glm::W, glm::X, glm::X, glm::W) +#define stsq swizzle(glm::X, glm::Y, glm::X, glm::W) +#define ttsq swizzle(glm::Y, glm::Y, glm::X, glm::W) +#define ptsq swizzle(glm::Z, glm::Y, glm::X, glm::W) +#define qtsq swizzle(glm::W, glm::Y, glm::X, glm::W) +#define spsq swizzle(glm::X, glm::Z, glm::X, glm::W) +#define tpsq swizzle(glm::Y, glm::Z, glm::X, glm::W) +#define ppsq swizzle(glm::Z, glm::Z, glm::X, glm::W) +#define qpsq swizzle(glm::W, glm::Z, glm::X, glm::W) +#define sqsq swizzle(glm::X, glm::W, glm::X, glm::W) +#define tqsq swizzle(glm::Y, glm::W, glm::X, glm::W) +#define pqsq swizzle(glm::Z, glm::W, glm::X, glm::W) +#define qqsq swizzle(glm::W, glm::W, glm::X, glm::W) +#define sstq swizzle(glm::X, glm::X, glm::Y, glm::W) +#define tstq swizzle(glm::Y, glm::X, glm::Y, glm::W) +#define pstq swizzle(glm::Z, glm::X, glm::Y, glm::W) +#define qstq swizzle(glm::W, glm::X, glm::Y, glm::W) +#define sttq swizzle(glm::X, glm::Y, glm::Y, glm::W) +#define tttq swizzle(glm::Y, glm::Y, glm::Y, glm::W) +#define pttq swizzle(glm::Z, glm::Y, glm::Y, glm::W) +#define qttq swizzle(glm::W, glm::Y, glm::Y, glm::W) +#define sptq swizzle(glm::X, glm::Z, glm::Y, glm::W) +#define tptq swizzle(glm::Y, glm::Z, glm::Y, glm::W) +#define pptq swizzle(glm::Z, glm::Z, glm::Y, glm::W) +#define qptq swizzle(glm::W, glm::Z, glm::Y, glm::W) +#define sqtq swizzle(glm::X, glm::W, glm::Y, glm::W) +#define tqtq swizzle(glm::Y, glm::W, glm::Y, glm::W) +#define pqtq swizzle(glm::Z, glm::W, glm::Y, glm::W) +#define qqtq swizzle(glm::W, glm::W, glm::Y, glm::W) +#define sspq swizzle(glm::X, glm::X, glm::Z, glm::W) +#define tspq swizzle(glm::Y, glm::X, glm::Z, glm::W) +#define pspq swizzle(glm::Z, glm::X, glm::Z, glm::W) +#define qspq swizzle(glm::W, glm::X, glm::Z, glm::W) +#define stpq swizzle(glm::X, glm::Y, glm::Z, glm::W) +#define ttpq swizzle(glm::Y, glm::Y, glm::Z, glm::W) +#define ptpq swizzle(glm::Z, glm::Y, glm::Z, glm::W) +#define qtpq swizzle(glm::W, glm::Y, glm::Z, glm::W) +#define sppq swizzle(glm::X, glm::Z, glm::Z, glm::W) +#define tppq swizzle(glm::Y, glm::Z, glm::Z, glm::W) +#define pppq swizzle(glm::Z, glm::Z, glm::Z, glm::W) +#define qppq swizzle(glm::W, glm::Z, glm::Z, glm::W) +#define sqpq swizzle(glm::X, glm::W, glm::Z, glm::W) +#define tqpq swizzle(glm::Y, glm::W, glm::Z, glm::W) +#define pqpq swizzle(glm::Z, glm::W, glm::Z, glm::W) +#define qqpq swizzle(glm::W, glm::W, glm::Z, glm::W) +#define ssqq swizzle(glm::X, glm::X, glm::W, glm::W) +#define tsqq swizzle(glm::Y, glm::X, glm::W, glm::W) +#define psqq swizzle(glm::Z, glm::X, glm::W, glm::W) +#define qsqq swizzle(glm::W, glm::X, glm::W, glm::W) +#define stqq swizzle(glm::X, glm::Y, glm::W, glm::W) +#define ttqq swizzle(glm::Y, glm::Y, glm::W, glm::W) +#define ptqq swizzle(glm::Z, glm::Y, glm::W, glm::W) +#define qtqq swizzle(glm::W, glm::Y, glm::W, glm::W) +#define spqq swizzle(glm::X, glm::Z, glm::W, glm::W) +#define tpqq swizzle(glm::Y, glm::Z, glm::W, glm::W) +#define ppqq swizzle(glm::Z, glm::Z, glm::W, glm::W) +#define qpqq swizzle(glm::W, glm::Z, glm::W, glm::W) +#define sqqq swizzle(glm::X, glm::W, glm::W, glm::W) +#define tqqq swizzle(glm::Y, glm::W, glm::W, glm::W) +#define pqqq swizzle(glm::Z, glm::W, glm::W, glm::W) +#define qqqq swizzle(glm::W, glm::W, glm::W, glm::W) + +#endif + +#endif//glm_core_swizzle diff --git a/ExternalLibs/glm/core/_swizzle.inl b/ExternalLibs/glm/core/_swizzle.inl new file mode 100644 index 0000000..8502d9e --- /dev/null +++ b/ExternalLibs/glm/core/_swizzle.inl @@ -0,0 +1,20 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2006-04-27 +// Updated : 2006-04-27 +// Licence : This source is under MIT License +// File : _swizzle.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef __swizzle_inl__ +#define __swizzle_inl__ + +#include "./_swizzle.h" + +namespace glm +{ + +} + +#endif//__swizzle_inl__ diff --git a/ExternalLibs/glm/core/dummy.cpp b/ExternalLibs/glm/core/dummy.cpp new file mode 100644 index 0000000..3c603ff --- /dev/null +++ b/ExternalLibs/glm/core/dummy.cpp @@ -0,0 +1,20 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2011-01-19 +// Updated : 2011-01-19 +// Licence : This source is under MIT License +// File : glm/setup.hpp +/////////////////////////////////////////////////////////////////////////////////////////////////// +// GLM is a header only library. There is nothing to compile. +// dummy.cpp exist only a wordaround for CMake file. + +#include "../glm.hpp" +#include "../ext.hpp" + +//#error "GLM is a header only library" + +int main() +{ + +} diff --git a/ExternalLibs/glm/core/func_common.hpp b/ExternalLibs/glm/core/func_common.hpp new file mode 100644 index 0000000..ec564bf --- /dev/null +++ b/ExternalLibs/glm/core/func_common.hpp @@ -0,0 +1,343 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2008-03-08 +// Updated : 2010-01-26 +// Licence : This source is under MIT License +// File : glm/core/func_common.hpp +/////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_func_common +#define glm_core_func_common + +#include "_fixes.hpp" + +namespace glm +{ + namespace test{ + void main_core_func_common(); + }//namespace test + + namespace core{ + namespace function{ + //! Define common functions from Section 8.3 of GLSL 1.30.8 specification. Included in glm namespace. + namespace common{ + + /// \addtogroup core_funcs + ///@{ + + //! Returns x if x >= 0; otherwise, it returns -x. + //! + //! \li GLSL abs man page + //! \li GLSL 1.30.08 specification, section 8.3 + template + genFIType abs(genFIType const & x); + + //! Returns 1.0 if x > 0, 0.0 if x == 0, or -1.0 if x < 0. + //! + //! \li GLSL sign man page + //! \li GLSL 1.30.08 specification, section 8.3 + template + genFIType sign(genFIType const & x); + + //! Returns a value equal to the nearest integer that is less then or equal to x. + //! + //! \li GLSL floor man page + //! \li GLSL 1.30.08 specification, section 8.3 + template + genType floor(genType const & x); + + //! Returns a value equal to the nearest integer to x + //! whose absolute value is not larger than the absolute value of x. + //! + //! \li GLSL trunc man page + //! \li GLSL 1.30.08 specification, section 8.3 + template + genType trunc(genType const & x); + + //! Returns a value equal to the nearest integer to x. + //! The fraction 0.5 will round in a direction chosen by the + //! implementation, presumably the direction that is fastest. + //! This includes the possibility that round(x) returns the + //! same value as roundEven(x) for all values of x. + //! + //! \li GLSL round man page + //! \li GLSL 1.30.08 specification, section 8.3 + template + genType round(genType const & x); + + //! Returns a value equal to the nearest integer to x. + //! A fractional part of 0.5 will round toward the nearest even + //! integer. (Both 3.5 and 4.5 for x will return 4.0.) + //! + //! \li GLSL roundEven man page + //! \li GLSL 1.30.08 specification, section 8.3 + template + genType roundEven(genType const & x); + + //! Returns a value equal to the nearest integer + //! that is greater than or equal to x. + //! + //! \li GLSL ceil man page + //! \li GLSL 1.30.08 specification, section 8.3 + template + genType ceil(genType const & x); + + //! Return x - floor(x). + //! + //! \li GLSL fract man page + //! \li GLSL 1.30.08 specification, section 8.3 + template + genType fract(genType const & x); + + //! Modulus. Returns x - y * floor(x / y) + //! for each component in x using the floating point value y. + //! + //! \li GLSL mod man page + //! \li GLSL 1.30.08 specification, section 8.3 + template + genType mod( + genType const & x, + genType const & y); + + //! Modulus. Returns x - y * floor(x / y) + //! for each component in x using the floating point value y. + //! + //! \li GLSL mod man page + //! \li GLSL 1.30.08 specification, section 8.3 + template + genType mod( + genType const & x, + typename genType::value_type const & y); + + //! Returns the fractional part of x and sets i to the integer + //! part (as a whole number floating point value). Both the + //! return value and the output parameter will have the same + //! sign as x. + //! + //! \li GLSL modf man page + //! \li GLSL 1.30.08 specification, section 8.3 + template + genType modf( + genType const & x, + genType & i); + + //! Returns y if y < x; otherwise, it returns x. + //! + //! \li GLSL min man page + //! \li GLSL 1.30.08 specification, section 8.3 + template + genType min( + genType const & x, + genType const & y); + + template + genType min( + genType const & x, + typename genType::value_type const & y); + + //! Returns y if x < y; otherwise, it returns x. + //! + //! \li GLSL max man page + //! \li GLSL 1.30.08 specification, section 8.3 + template + genType max( + genType const & x, + genType const & y); + + template + genType max( + genType const & x, + typename genType::value_type const & y); + + //! Returns min(max(x, minVal), maxVal) for each component in x + //! using the floating-point values minVal and maxVal. + //! + //! \li GLSL clamp man page + //! \li GLSL 1.30.08 specification, section 8.3 + template + genType clamp( + genType const & x, + genType const & minVal, + genType const & maxVal); + + template + genType clamp( + genType const & x, + typename genType::value_type const & minVal, + typename genType::value_type const & maxVal); + + //! \return If genTypeU is a floating scalar or vector: + //! Returns x * (1.0 - a) + y * a, i.e., the linear blend of + //! x and y using the floating-point value a. + //! The value for a is not restricted to the range [0, 1]. + //! + //! \return If genTypeU is a boolean scalar or vector: + //! Selects which vector each returned component comes + //! from. For a component of a that is false, the + //! corresponding component of x is returned. For a + //! component of a that is true, the corresponding + //! component of y is returned. Components of x and y that + //! are not selected are allowed to be invalid floating point + //! values and will have no effect on the results. Thus, this + //! provides different functionality than + //! genType mix(genType x, genType y, genType(a)) + //! where a is a Boolean vector. + //! + //! \li GLSL mix man page + //! \li GLSL 1.30.08 specification, section 8.3 + //! + //! \param[in] x Floating point scalar or vector. + //! \param[in] y Floating point scalar or vector. + //! \param[in] a Floating point or boolean scalar or vector. + //! + // \todo Test when 'a' is a boolean. + template + genTypeT mix(genTypeT const & x, genTypeT const & y, genTypeU const & a); + + //! Returns 0.0 if x < edge, otherwise it returns 1.0. + //! + //! \li GLSL step man page + //! \li GLSL 1.30.08 specification, section 8.3 + template + genType step( + genType const & edge, + genType const & x); + + template + genType step( + typename genType::value_type const & edge, + genType const & x); + + //! Returns 0.0 if x <= edge0 and 1.0 if x >= edge1 and + //! performs smooth Hermite interpolation between 0 and 1 + //! when edge0 < x < edge1. This is useful in cases where + //! you would want a threshold function with a smooth + //! transition. This is equivalent to: + //! genType t; + //! t = clamp ((x – edge0) / (edge1 – edge0), 0, 1); + //! return t * t * (3 – 2 * t); + //! Results are undefined if edge0 >= edge1. + //! + //! \li GLSL smoothstep man page + //! \li GLSL 1.30.08 specification, section 8.3 + template + genType smoothstep( + genType const & edge0, + genType const & edge1, + genType const & x); + + template + genType smoothstep( + typename genType::value_type const & edge0, + typename genType::value_type const & edge1, + genType const & x); + + //! Returns true if x holds a NaN (not a number) + //! representation in the underlying implementation's set of + //! floating point representations. Returns false otherwise, + //! including for implementations with no NaN + //! representations. + //! + //! \li GLSL isnan man page + //! \li GLSL 1.30.08 specification, section 8.3 + template + typename genType::bool_type isnan(genType const & x); + + //! Returns true if x holds a positive infinity or negative + //! infinity representation in the underlying implementation's + //! set of floating point representations. Returns false + //! otherwise, including for implementations with no infinity + //! representations. + //! + //! \li GLSL isinf man page + //! \li GLSL 1.30.08 specification, section 8.3 + template + typename genType::bool_type isinf(genType const & x); + + //! Returns a signed integer value representing + //! the encoding of a floating-point value. The floatingpoint + //! value's bit-level representation is preserved. + //! + //! \li GLSL floatBitsToInt man page + //! \li GLSL 4.00.08 specification, section 8.3 + template + genIType floatBitsToInt(genType const & value); + + //! Returns a unsigned integer value representing + //! the encoding of a floating-point value. The floatingpoint + //! value's bit-level representation is preserved. + //! + //! \li GLSL floatBitsToUint man page + //! \li GLSL 4.00.08 specification, section 8.3 + template + genUType floatBitsToUint(genType const & value); + + //! Returns a floating-point value corresponding to a signed + //! integer encoding of a floating-point value. + //! If an inf or NaN is passed in, it will not signal, and the + //! resulting floating point value is unspecified. Otherwise, + //! the bit-level representation is preserved. + //! + //! \li GLSL intBitsToFloat man page + //! \li GLSL 4.00.08 specification, section 8.3 + template + genType intBitsToFloat(genIType const & value); + + //! Returns a floating-point value corresponding to a + //! unsigned integer encoding of a floating-point value. + //! If an inf or NaN is passed in, it will not signal, and the + //! resulting floating point value is unspecified. Otherwise, + //! the bit-level representation is preserved. + //! + //! \li GLSL uintBitsToFloat man page + //! \li GLSL 4.00.08 specification, section 8.3 + template + genType uintBitsToFloat(genUType const & value); + + //! Computes and returns a * b + c. + //! + //! \li GLSL fma man page + //! \li GLSL 4.00.08 specification, section 8.3 + template + genType fma(genType const & a, genType const & b, genType const & c); + + //! Splits x into a floating-point significand in the range + //! [0.5, 1.0) and an integral exponent of two, such that: + //! x = significand * exp(2, exponent) + //! + //! The significand is returned by the function and the + //! exponent is returned in the parameter exp. For a + //! floating-point value of zero, the significant and exponent + //! are both zero. For a floating-point value that is an + //! infinity or is not a number, the results are undefined. + //! + //! \li GLSL frexp man page + //! \li GLSL 4.00.08 specification, section 8.3 + template + genType frexp(genType const & x, genIType & exp); + + //! Builds a floating-point number from x and the + //! corresponding integral exponent of two in exp, returning: + //! significand * exp(2, exponent) + //! + //! If this product is too large to be represented in the + //! floating-point type, the result is undefined. + //! + //! \li GLSL ldexp man page; + //! \li GLSL 4.00.08 specification, section 8.3 + template + genType ldexp(genType const & x, genIType const & exp); + + ///@} + + }//namespace common + }//namespace function + }//namespace core + + using namespace core::function::common; +}//namespace glm + +#include "func_common.inl" + +#endif//glm_core_func_common diff --git a/ExternalLibs/glm/core/func_common.inl b/ExternalLibs/glm/core/func_common.inl new file mode 100644 index 0000000..df572cf --- /dev/null +++ b/ExternalLibs/glm/core/func_common.inl @@ -0,0 +1,1577 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2008-08-03 +// Updated : 2010-01-26 +// Licence : This source is under MIT License +// File : glm/core/func_common.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + namespace detail + { + template + struct Abs_ + { + }; + + template + struct Abs_ + { + static genFIType get(genFIType const & x) + { + GLM_STATIC_ASSERT( + detail::type::is_float || + detail::type::is_int, "'abs' only accept floating-point and integer inputs"); + return x >= genFIType(0) ? x : -x; + } + }; + + template + struct Abs_ + { + static genFIType get(genFIType const & x) + { + GLM_STATIC_ASSERT( + detail::type::is_uint, "'abs' only accept floating-point and integer inputs"); + + return x; + } + }; + }//namespace detail + + namespace core{ + namespace function{ + namespace common{ + + // abs + template + GLM_FUNC_QUALIFIER genFIType abs( + genFIType const & x) + { + return detail::Abs_::is_signed>::get(x); + } + + //template + //GLM_FUNC_QUALIFIER detail::tvec1 abs( + // detail::tvec1 const & v) + //{ + // return detail::tvec1( + // abs(v.x)); + //} + + template + GLM_FUNC_QUALIFIER detail::tvec2 abs( + detail::tvec2 const & v) + { + return detail::tvec2( + abs(v.x), + abs(v.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 abs( + detail::tvec3 const & v) + { + return detail::tvec3( + abs(v.x), + abs(v.y), + abs(v.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 abs( + detail::tvec4 const & v) + { + return detail::tvec4( + abs(v.x), + abs(v.y), + abs(v.z), + abs(v.w)); + } + + // sign + + //Try something like based on x >> 31 to get the sign bit + template + GLM_FUNC_QUALIFIER genFIType sign( + genFIType const & x) + { + GLM_STATIC_ASSERT( + detail::type::is_float || + detail::type::is_int, "'sign' only accept signed inputs"); + + genFIType result; + if(x > genFIType(0)) + result = genFIType(1); + else if(x < genFIType(0)) + result = genFIType(-1); + else + result = genFIType(0); + return result; + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 sign( + detail::tvec2 const & x) + { + return detail::tvec2( + sign(x.x), + sign(x.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 sign( + detail::tvec3 const & x) + { + return detail::tvec3( + sign(x.x), + sign(x.y), + sign(x.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 sign( + detail::tvec4 const & x) + { + return detail::tvec4( + sign(x.x), + sign(x.y), + sign(x.z), + sign(x.w)); + } + + // floor + template <> + GLM_FUNC_QUALIFIER detail::thalf floor(detail::thalf const& x) + { + return detail::thalf(::std::floor(float(x))); + } + + template + GLM_FUNC_QUALIFIER genType floor(genType const& x) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'floor' only accept floating-point inputs"); + + return ::std::floor(x); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 floor(detail::tvec2 const& x) + { + return detail::tvec2( + floor(x.x), + floor(x.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 floor(detail::tvec3 const& x) + { + return detail::tvec3( + floor(x.x), + floor(x.y), + floor(x.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 floor(detail::tvec4 const& x) + { + return detail::tvec4( + floor(x.x), + floor(x.y), + floor(x.z), + floor(x.w)); + } + + // trunc + template + GLM_FUNC_QUALIFIER genType trunc(genType const & x) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'trunc' only accept floating-point inputs"); + return x < 0 ? -floor(-x) : floor(x); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 trunc(detail::tvec2 const & x) + { + return detail::tvec2( + trunc(x.x), + trunc(x.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 trunc(detail::tvec3 const & x) + { + return detail::tvec3( + trunc(x.x), + trunc(x.y), + trunc(x.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 trunc(detail::tvec4 const & x) + { + return detail::tvec4( + trunc(x.x), + trunc(x.y), + trunc(x.z), + trunc(x.w)); + } + + // round + template + GLM_FUNC_QUALIFIER genType round(genType const& x) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'round' only accept floating-point inputs"); + + return genType(int(x + genType(0.5))); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 round(detail::tvec2 const& x) + { + return detail::tvec2( + round(x.x), + round(x.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 round(detail::tvec3 const& x) + { + return detail::tvec3( + round(x.x), + round(x.y), + round(x.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 round(detail::tvec4 const& x) + { + return detail::tvec4( + round(x.x), + round(x.y), + round(x.z), + round(x.w)); + } + + // roundEven + template + GLM_FUNC_QUALIFIER genType roundEven(genType const& x) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'roundEven' only accept floating-point inputs"); + + return genType(int(x + genType(int(x) % 2))); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 roundEven(detail::tvec2 const& x) + { + return detail::tvec2( + roundEven(x.x), + roundEven(x.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 roundEven(detail::tvec3 const& x) + { + return detail::tvec3( + roundEven(x.x), + roundEven(x.y), + roundEven(x.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 roundEven(detail::tvec4 const& x) + { + return detail::tvec4( + roundEven(x.x), + roundEven(x.y), + roundEven(x.z), + roundEven(x.w)); + } + + // ceil + template + GLM_FUNC_QUALIFIER genType ceil(genType const & x) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'ceil' only accept floating-point inputs"); + + return ::std::ceil(x); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 ceil(detail::tvec2 const & x) + { + return detail::tvec2( + ceil(x.x), + ceil(x.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 ceil(detail::tvec3 const & x) + { + return detail::tvec3( + ceil(x.x), + ceil(x.y), + ceil(x.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 ceil(detail::tvec4 const & x) + { + return detail::tvec4( + ceil(x.x), + ceil(x.y), + ceil(x.z), + ceil(x.w)); + } + + // fract + template + GLM_FUNC_QUALIFIER genType fract + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'fract' only accept floating-point inputs"); + + return x - ::std::floor(x); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 fract + ( + detail::tvec2 const & x + ) + { + return detail::tvec2( + fract(x.x), + fract(x.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 fract + ( + detail::tvec3 const & x + ) + { + return detail::tvec3( + fract(x.x), + fract(x.y), + fract(x.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 fract + ( + detail::tvec4 const & x + ) + { + return detail::tvec4( + fract(x.x), + fract(x.y), + fract(x.z), + fract(x.w)); + } + + // mod + template + GLM_FUNC_QUALIFIER genType mod + ( + genType const & x, + genType const & y + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'mod' only accept floating-point inputs"); + + return x - y * floor(x / y); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 mod + ( + detail::tvec2 const & x, + typename detail::tvec2::value_type const & y + ) + { + return detail::tvec2( + mod(x.x, y), + mod(x.y, y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 mod + ( + detail::tvec3 const & x, + typename detail::tvec3::value_type const & y + ) + { + return detail::tvec3( + mod(x.x, y), + mod(x.y, y), + mod(x.z, y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 mod + ( + detail::tvec4 const & x, + typename detail::tvec4::value_type const & y + ) + { + return detail::tvec4( + mod(x.x, y), + mod(x.y, y), + mod(x.z, y), + mod(x.w, y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 mod + ( + detail::tvec2 const & x, + detail::tvec2 const & y + ) + { + return detail::tvec2( + mod(x.x, y.x), + mod(x.y, y.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 mod + ( + detail::tvec3 const & x, + detail::tvec3 const & y + ) + { + return detail::tvec3( + mod(x.x, y.x), + mod(x.y, y.y), + mod(x.z, y.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 mod + ( + detail::tvec4 const & x, + detail::tvec4 const & y + ) + { + return detail::tvec4( + mod(x.x, y.x), + mod(x.y, y.y), + mod(x.z, y.z), + mod(x.w, y.w)); + } + + // modf + template + GLM_FUNC_QUALIFIER genType modf + ( + genType const & x, + genType & i + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'modf' only accept floating-point inputs"); + + i = glm::floor(x); + + return x - i; + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 modf + ( + detail::tvec2 const & x, + detail::tvec2 const & y + ) + { + return detail::tvec2( + modf(x.x, y.x), + modf(x.y, y.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 modf + ( + detail::tvec3 const & x, + detail::tvec3 const & y + ) + { + return detail::tvec3( + modf(x.x, y.x), + modf(x.y, y.y), + modf(x.z, y.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 modf + ( + detail::tvec4 const & x, + detail::tvec4 const & y + ) + { + return detail::tvec4( + modf(x.x, y.x), + modf(x.y, y.y), + modf(x.z, y.z), + modf(x.w, y.w)); + } + + //// Only valid if (INT_MIN <= x-y <= INT_MAX) + //// min(x,y) + //r = y + ((x - y) & ((x - y) >> (sizeof(int) * + //CHAR_BIT – 1))); + //// max(x,y) + //r = x - ((x - y) & ((x - y) >> (sizeof(int) * + //CHAR_BIT - 1))); + + // min + template + GLM_FUNC_QUALIFIER genType min + ( + genType const & x, + genType const & y + ) + { + GLM_STATIC_ASSERT( + detail::type::is_float || + detail::type::is_int || + detail::type::is_uint, "'min' only accept numbers"); + + return x < y ? x : y; + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 min + ( + detail::tvec2 const & x, + typename detail::tvec2::value_type const & y + ) + { + return detail::tvec2( + min(x.x, y), + min(x.y, y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 min + ( + detail::tvec3 const & x, + typename detail::tvec3::value_type const & y + ) + { + return detail::tvec3( + min(x.x, y), + min(x.y, y), + min(x.z, y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 min + ( + detail::tvec4 const & x, + typename detail::tvec4::value_type const & y + ) + { + return detail::tvec4( + min(x.x, y), + min(x.y, y), + min(x.z, y), + min(x.w, y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 min + ( + detail::tvec2 const & x, + detail::tvec2 const & y + ) + { + return detail::tvec2( + min(x.x, y.x), + min(x.y, y.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 min + ( + detail::tvec3 const & x, + detail::tvec3 const & y + ) + { + return detail::tvec3( + min(x.x, y.x), + min(x.y, y.y), + min(x.z, y.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 min + ( + detail::tvec4 const & x, + detail::tvec4 const & y + ) + { + return detail::tvec4( + min(x.x, y.x), + min(x.y, y.y), + min(x.z, y.z), + min(x.w, y.w)); + } + + // max + template + GLM_FUNC_QUALIFIER genType max + ( + genType const & x, + genType const & y + ) + { + GLM_STATIC_ASSERT( + detail::type::is_float || + detail::type::is_int || + detail::type::is_uint, "'max' only accept numbers"); + + return x > y ? x : y; + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 max + ( + detail::tvec2 const & x, + typename detail::tvec2::value_type y + ) + { + return detail::tvec2( + max(x.x, y), + max(x.y, y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 max + ( + detail::tvec3 const & x, + typename detail::tvec3::value_type y + ) + { + return detail::tvec3( + max(x.x, y), + max(x.y, y), + max(x.z, y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 max + ( + detail::tvec4 const & x, + typename detail::tvec4::value_type y + ) + { + return detail::tvec4( + max(x.x, y), + max(x.y, y), + max(x.z, y), + max(x.w, y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 max + ( + detail::tvec2 const & x, + detail::tvec2 const & y + ) + { + return detail::tvec2( + max(x.x, y.x), + max(x.y, y.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 max + ( + detail::tvec3 const & x, + detail::tvec3 const & y + ) + { + return detail::tvec3( + max(x.x, y.x), + max(x.y, y.y), + max(x.z, y.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 max + ( + detail::tvec4 const & x, + detail::tvec4 const & y) + { + return detail::tvec4( + max(x.x, y.x), + max(x.y, y.y), + max(x.z, y.z), + max(x.w, y.w)); + } + + // clamp + template + GLM_FUNC_QUALIFIER valType clamp + ( + valType const & x, + valType const & minVal, + valType const & maxVal + ) + { + GLM_STATIC_ASSERT( + detail::type::is_float || + detail::type::is_int || + detail::type::is_uint, "'clamp' only accept numbers"); + + // Old implementation, less predictable branching + //if(x >= maxVal) return maxVal; + //if(x <= minVal) return minVal; + //return x; + return glm::max(glm::min(x, maxVal), minVal); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 clamp + ( + detail::tvec2 const & x, + typename detail::tvec2::value_type const & minVal, + typename detail::tvec2::value_type const & maxVal + ) + { + return detail::tvec2( + clamp(x.x, minVal, maxVal), + clamp(x.y, minVal, maxVal)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 clamp + ( + detail::tvec3 const & x, + typename detail::tvec3::value_type const & minVal, + typename detail::tvec3::value_type const & maxVal + ) + { + return detail::tvec3( + clamp(x.x, minVal, maxVal), + clamp(x.y, minVal, maxVal), + clamp(x.z, minVal, maxVal)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 clamp + ( + detail::tvec4 const & x, + typename detail::tvec4::value_type const & minVal, + typename detail::tvec4::value_type const & maxVal + ) + { + return detail::tvec4( + clamp(x.x, minVal, maxVal), + clamp(x.y, minVal, maxVal), + clamp(x.z, minVal, maxVal), + clamp(x.w, minVal, maxVal)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 clamp + ( + detail::tvec2 const & x, + detail::tvec2 const & minVal, + detail::tvec2 const & maxVal + ) + { + return detail::tvec2( + clamp(x.x, minVal.x, maxVal.x), + clamp(x.y, minVal.y, maxVal.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 clamp + ( + detail::tvec3 const & x, + detail::tvec3 const & minVal, + detail::tvec3 const & maxVal + ) + { + return detail::tvec3( + clamp(x.x, minVal.x, maxVal.x), + clamp(x.y, minVal.y, maxVal.y), + clamp(x.z, minVal.z, maxVal.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 clamp + ( + detail::tvec4 const & x, + detail::tvec4 const & minVal, + detail::tvec4 const & maxVal + ) + { + return detail::tvec4( + clamp(x.x, minVal.x, maxVal.x), + clamp(x.y, minVal.y, maxVal.y), + clamp(x.z, minVal.z, maxVal.z), + clamp(x.w, minVal.w, maxVal.w)); + } + + // mix + template + GLM_FUNC_QUALIFIER genTypeT mix + ( + genTypeT const & x, + genTypeT const & y, + genTypeU const & a + ) + { + // It could be a vector too + //GLM_STATIC_ASSERT( + // detail::type::is_float && + // detail::type::is_float); + + //return x + a * (y - x); + return genTypeT(genTypeU(x) + a * genTypeU(y - x)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 mix + ( + detail::tvec2 const & x, + detail::tvec2 const & y, + valTypeB const & a + ) + { + return detail::tvec2( + detail::tvec2(x) + a * detail::tvec2(y - x)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 mix + ( + detail::tvec3 const & x, + detail::tvec3 const & y, + valTypeB const & a + ) + { + return detail::tvec3( + detail::tvec3(x) + a * detail::tvec3(y - x)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 mix + ( + detail::tvec4 const & x, + detail::tvec4 const & y, + valTypeB const & a + ) + { + return detail::tvec4( + detail::tvec4(x) + a * detail::tvec4(y - x)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 mix + ( + detail::tvec2 const & x, + detail::tvec2 const & y, + detail::tvec2 const & a + ) + { + return detail::tvec2( + detail::tvec2(x) + a * detail::tvec2(y - x)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 mix + ( + detail::tvec3 const & x, + detail::tvec3 const & y, + detail::tvec3 const & a + ) + { + return detail::tvec3( + detail::tvec3(x) + a * detail::tvec3(y - x)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 mix + ( + detail::tvec4 const & x, + detail::tvec4 const & y, + detail::tvec4 const & a + ) + { + return detail::tvec4( + detail::tvec4(x) + a * detail::tvec4(y - x)); + } + + //template + //GLM_FUNC_QUALIFIER genTypeT mix + //( + // genTypeT const & x, + // genTypeT const & y, + // float const & a + //) + //{ + // // It could be a vector too + // //GLM_STATIC_ASSERT( + // // detail::type::is_float && + // // detail::type::is_float); + + // return x + a * (y - x); + //} + + template + GLM_FUNC_QUALIFIER genType mix + ( + genType const & x, + genType const & y, + bool a + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'mix' only accept floating-point inputs"); + + return a ? x : y; + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 mix + ( + detail::tvec2 const & x, + detail::tvec2 const & y, + typename detail::tvec2::bool_type a + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'mix' only accept floating-point inputs"); + + detail::tvec2 result; + for + ( + typename detail::tvec2::size_type i = 0; + i < detail::tvec2::value_size(); + ++i + ) + { + result[i] = a[i] ? x[i] : y[i]; + } + return result; + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 mix + ( + detail::tvec3 const & x, + detail::tvec3 const & y, + typename detail::tvec3::bool_type a + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'mix' only accept floating-point inputs"); + + detail::tvec3 result; + for + ( + typename detail::tvec3::size_type i = 0; + i < detail::tvec3::value_size(); + ++i + ) + { + result[i] = a[i] ? x[i] : y[i]; + } + return result; + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 mix + ( + detail::tvec4 const & x, + detail::tvec4 const & y, + typename detail::tvec4::bool_type a + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'mix' only accept floating-point inputs"); + + detail::tvec4 result; + for + ( + typename detail::tvec4::size_type i = 0; + i < detail::tvec4::value_size(); + ++i + ) + { + result[i] = a[i] ? x[i] : y[i]; + } + return result; + } + + // step + template + GLM_FUNC_QUALIFIER genType step + ( + genType const & edge, + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'mix' only accept floating-point inputs"); + + return x <= edge ? genType(0) : genType(1); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 step + ( + typename detail::tvec2::value_type const & edge, + detail::tvec2 const & x + ) + { + return detail::tvec2( + x.x <= edge ? T(0) : T(1), + x.y <= edge ? T(0) : T(1)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 step + ( + typename detail::tvec3::value_type const & edge, + detail::tvec3 const & x + ) + { + return detail::tvec3( + x.x <= edge ? T(0) : T(1), + x.y <= edge ? T(0) : T(1), + x.z <= edge ? T(0) : T(1)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 step + ( + typename detail::tvec4::value_type const & edge, + detail::tvec4 const & x + ) + { + return detail::tvec4( + x.x <= edge ? T(0) : T(1), + x.y <= edge ? T(0) : T(1), + x.z <= edge ? T(0) : T(1), + x.w <= edge ? T(0) : T(1)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 step + ( + detail::tvec2 const & edge, + detail::tvec2 const & x + ) + { + return detail::tvec2( + x.x <= edge.x ? T(0) : T(1), + x.y <= edge.y ? T(0) : T(1)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 step + ( + detail::tvec3 const & edge, + detail::tvec3 const & x + ) + { + return detail::tvec3( + x.x <= edge.x ? T(0) : T(1), + x.y <= edge.y ? T(0) : T(1), + x.z <= edge.z ? T(0) : T(1)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 step + ( + detail::tvec4 const & edge, + detail::tvec4 const & x + ) + { + return detail::tvec4( + x.x <= edge.x ? T(0) : T(1), + x.y <= edge.y ? T(0) : T(1), + x.z <= edge.z ? T(0) : T(1), + x.w <= edge.w ? T(0) : T(1)); + } + + // smoothstep + template + GLM_FUNC_QUALIFIER genType smoothstep + ( + genType const & edge0, + genType const & edge1, + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'mix' only accept floating-point inputs"); + + genType tmp = clamp((x - edge0) / (edge1 - edge0), genType(0), genType(1)); + return tmp * tmp * (genType(3) - genType(2) * tmp); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 smoothstep + ( + typename detail::tvec2::value_type const & edge0, + typename detail::tvec2::value_type const & edge1, + detail::tvec2 const & x + ) + { + return detail::tvec2( + smoothstep(edge0, edge1, x.x), + smoothstep(edge0, edge1, x.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 smoothstep + ( + typename detail::tvec3::value_type const & edge0, + typename detail::tvec3::value_type const & edge1, + detail::tvec3 const & x + ) + { + return detail::tvec3( + smoothstep(edge0, edge1, x.x), + smoothstep(edge0, edge1, x.y), + smoothstep(edge0, edge1, x.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 smoothstep + ( + typename detail::tvec4::value_type const & edge0, + typename detail::tvec4::value_type const & edge1, + detail::tvec4 const & x + ) + { + return detail::tvec4( + smoothstep(edge0, edge1, x.x), + smoothstep(edge0, edge1, x.y), + smoothstep(edge0, edge1, x.z), + smoothstep(edge0, edge1, x.w)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 smoothstep + ( + detail::tvec2 const & edge0, + detail::tvec2 const & edge1, + detail::tvec2 const & x + ) + { + return detail::tvec2( + smoothstep(edge0.x, edge1.x, x.x), + smoothstep(edge0.y, edge1.y, x.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 smoothstep + ( + detail::tvec3 const & edge0, + detail::tvec3 const & edge1, + detail::tvec3 const & x + ) + { + return detail::tvec3( + smoothstep(edge0.x, edge1.x, x.x), + smoothstep(edge0.y, edge1.y, x.y), + smoothstep(edge0.z, edge1.z, x.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 smoothstep + ( + detail::tvec4 const & edge0, + detail::tvec4 const & edge1, + detail::tvec4 const & x + ) + { + return detail::tvec4( + smoothstep(edge0.x, edge1.x, x.x), + smoothstep(edge0.y, edge1.y, x.y), + smoothstep(edge0.z, edge1.z, x.z), + smoothstep(edge0.w, edge1.w, x.w)); + } + + template + GLM_FUNC_QUALIFIER typename genType::bool_type isnan + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'mix' only accept floating-point inputs"); + +#if(GLM_COMPILER & GLM_COMPILER_VC) + return typename genType::bool_type(_isnan(x)); +#else + return typename genType::bool_type(std::isnan(x)); +#endif + } + + template + GLM_FUNC_QUALIFIER typename detail::tvec2::bool_type isnan + ( + detail::tvec2 const & x + ) + { + return typename detail::tvec2::bool_type( + isnan(x.x), + isnan(x.y)); + } + + template + GLM_FUNC_QUALIFIER typename detail::tvec3::bool_type isnan + ( + detail::tvec3 const & x + ) + { + return typename detail::tvec3::bool_type( + isnan(x.x), + isnan(x.y), + isnan(x.z)); + } + + template + GLM_FUNC_QUALIFIER typename detail::tvec4::bool_type isnan + ( + detail::tvec4 const & x + ) + { + return typename detail::tvec4::bool_type( + isnan(x.x), + isnan(x.y), + isnan(x.z), + isnan(x.w)); + } + + template + GLM_FUNC_QUALIFIER typename genType::bool_type isinf + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'isinf' only accept floating-point inputs"); + +#if(GLM_COMPILER & GLM_COMPILER_VC) + return typename genType::bool_type(_fpclass(x) == _FPCLASS_NINF || _fpclass(x) == _FPCLASS_PINF); +#else + return typename genType::bool_type(std::isinf(x)); +#endif + } + + template + GLM_FUNC_QUALIFIER typename detail::tvec2::bool_type isinf + ( + detail::tvec2 const & x + ) + { + return typename detail::tvec2::bool_type( + isnan(x.x), + isnan(x.y)); + } + + template + GLM_FUNC_QUALIFIER typename detail::tvec3::bool_type isinf + ( + detail::tvec3 const & x + ) + { + return typename detail::tvec3::bool_type( + isnan(x.x), + isnan(x.y), + isnan(x.z)); + } + + template + GLM_FUNC_QUALIFIER typename detail::tvec4::bool_type isinf + ( + detail::tvec4 const & x + ) + { + return typename detail::tvec4::bool_type( + isnan(x.x), + isnan(x.y), + isnan(x.z), + isnan(x.w)); + } + + GLM_FUNC_QUALIFIER int floatBitsToInt(float const & value) + { + union + { + float f; + int i; + } fi; + + fi.f = value; + return fi.i; + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 floatBitsToInt + ( + detail::tvec2 const & value + ) + { + return detail::tvec2( + floatBitsToInt(value.x), + floatBitsToInt(value.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 floatBitsToInt + ( + detail::tvec3 const & value + ) + { + return detail::tvec3( + floatBitsToInt(value.x), + floatBitsToInt(value.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 floatBitsToInt + ( + detail::tvec4 const & value + ) + { + return detail::tvec4( + floatBitsToInt(value.x), + floatBitsToInt(value.y)); + } + + GLM_FUNC_QUALIFIER uint floatBitsToUint(float const & value) + { + union + { + float f; + uint u; + } fu; + + fu.f = value; + return fu.u; + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 floatBitsToUint + ( + detail::tvec2 const & value + ) + { + return detail::tvec2( + floatBitsToUint(value.x), + floatBitsToUint(value.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 floatBitsToUint + ( + detail::tvec3 const & value + ) + { + return detail::tvec3( + floatBitsToUint(value.x), + floatBitsToUint(value.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 floatBitsToUint + ( + detail::tvec4 const & value + ) + { + return detail::tvec4( + floatBitsToUint(value.x), + floatBitsToUint(value.y)); + } + + GLM_FUNC_QUALIFIER float intBitsToFloat(int const & value) + { + union + { + float f; + int i; + } fi; + + fi.i = value; + return fi.f; + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 intBitsToFloat + ( + detail::tvec2 const & value + ) + { + return detail::tvec2( + intBitsToFloat(value.x), + intBitsToFloat(value.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 intBitsToFloat + ( + detail::tvec3 const & value + ) + { + return detail::tvec3( + intBitsToFloat(value.x), + intBitsToFloat(value.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 intBitsToFloat + ( + detail::tvec4 const & value + ) + { + return detail::tvec4( + intBitsToFloat(value.x), + intBitsToFloat(value.y)); + } + + GLM_FUNC_QUALIFIER float uintBitsToFloat(uint const & value) + { + union + { + float f; + uint u; + } fu; + + fu.u = value; + return fu.f; + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 uintBitsToFloat + ( + detail::tvec2 const & value + ) + { + return detail::tvec2( + uintBitsToFloat(value.x), + uintBitsToFloat(value.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 uintBitsToFloat + ( + detail::tvec3 const & value + ) + { + return detail::tvec3( + uintBitsToFloat(value.x), + uintBitsToFloat(value.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 uintBitsToFloat + ( + detail::tvec4 const & value + ) + { + return detail::tvec4( + uintBitsToFloat(value.x), + uintBitsToFloat(value.y)); + } + + template + GLM_FUNC_QUALIFIER genType fma + ( + genType const & a, + genType const & b, + genType const & c + ) + { + return a * b + c; + } + + template + GLM_FUNC_QUALIFIER genType frexp + ( + genType const & x, + int & exp + ) + { + return std::frexp(x, exp); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 frexp + ( + detail::tvec2 const & x, + detail::tvec2 & exp + ) + { + return std::frexp(x, exp); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 frexp + ( + detail::tvec3 const & x, + detail::tvec3 & exp + ) + { + return std::frexp(x, exp); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 frexp + ( + detail::tvec4 const & x, + detail::tvec4 & exp + ) + { + return std::frexp(x, exp); + } + + template + GLM_FUNC_QUALIFIER genType ldexp + ( + genType const & x, + int const & exp + ) + { + return std::frexp(x, exp); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 ldexp + ( + detail::tvec2 const & x, + detail::tvec2 const & exp + ) + { + return std::frexp(x, exp); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 ldexp + ( + detail::tvec3 const & x, + detail::tvec3 const & exp + ) + { + return std::frexp(x, exp); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 ldexp + ( + detail::tvec4 const & x, + detail::tvec4 const & exp + ) + { + return std::frexp(x, exp); + } + + }//namespace common + }//namespace function + }//namespace core +}//namespace glm diff --git a/ExternalLibs/glm/core/func_exponential.hpp b/ExternalLibs/glm/core/func_exponential.hpp new file mode 100644 index 0000000..7871397 --- /dev/null +++ b/ExternalLibs/glm/core/func_exponential.hpp @@ -0,0 +1,90 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2008-08-08 +// Updated : 2010-02-04 +// Licence : This source is under MIT License +// File : glm/core/func_exponential.hpp +/////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_func_exponential +#define glm_core_func_exponential + +namespace glm +{ + namespace test{ + void main_core_func_exponential(); + }//namespace test + + namespace core{ + namespace function{ + //! Define all exponential functions from Section 8.2 of GLSL 1.30.8 specification. Included in glm namespace. + namespace exponential{ + + /// \addtogroup core_funcs + ///@{ + + //! Returns x raised to the y power. + //! + //! \li GLSL pow man page + //! \li GLSL 1.30.08 specification, section 8.2 + template + genType pow(genType const & x, genType const & y); + + //! Returns the natural exponentiation of x, i.e., e^x. + //! + //! \li GLSL exp man page + //! \li GLSL 1.30.08 specification, section 8.2 + template + genType exp(genType const & x); + + //! Returns the natural logarithm of x, i.e., + //! returns the value y which satisfies the equation x = e^y. + //! Results are undefined if x <= 0. + //! + //! \li GLSL log man page + //! \li GLSL 1.30.08 specification, section 8.2 + template + genType log(genType const & x); + + //! Returns 2 raised to the x power. + //! + //! \li GLSL exp2 man page + //! \li GLSL 1.30.08 specification, section 8.2 + template + genType exp2(genType const & x); + + //! Returns the base 2 log of x, i.e., returns the value y, + //! which satisfies the equation x = 2 ^ y. + //! + //! \li GLSL log2 man page + //! \li GLSL 1.30.08 specification, section 8.2 + template + genType log2(genType const & x); + + //! Returns the positive square root of x. + //! + //! \li GLSL sqrt man page + //! \li GLSL 1.30.08 specification, section 8.2 + template + genType sqrt(genType const & x); + + //! Returns the reciprocal of the positive square root of x. + //! + //! \li GLSL inversesqrt man page + //! \li GLSL 1.30.08 specification, section 8.2 + template + genType inversesqrt(genType const & x); + + ///@} + + }//namespace exponential + }//namespace function + }//namespace core + + using namespace core::function::exponential; +}//namespace glm + +#include "func_exponential.inl" + +#endif//glm_core_func_exponential diff --git a/ExternalLibs/glm/core/func_exponential.inl b/ExternalLibs/glm/core/func_exponential.inl new file mode 100644 index 0000000..d3bc59e --- /dev/null +++ b/ExternalLibs/glm/core/func_exponential.inl @@ -0,0 +1,358 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2008-08-03 +// Updated : 2010-02-04 +// Licence : This source is under MIT License +// File : glm/core/func_exponential.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + namespace core{ + namespace function{ + namespace exponential{ + + // pow + template + GLM_FUNC_QUALIFIER genType pow + ( + genType const & x, + genType const & y + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'pow' only accept floating-point input"); + + return ::std::pow(x, y); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 pow + ( + detail::tvec2 const & x, + detail::tvec2 const & y + ) + { + return detail::tvec2( + pow(x.x, y.x), + pow(x.y, y.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 pow + ( + detail::tvec3 const & x, + detail::tvec3 const & y + ) + { + return detail::tvec3( + pow(x.x, y.x), + pow(x.y, y.y), + pow(x.z, y.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 pow + ( + detail::tvec4 const & x, + detail::tvec4 const & y + ) + { + return detail::tvec4( + pow(x.x, y.x), + pow(x.y, y.y), + pow(x.z, y.z), + pow(x.w, y.w)); + } + + // exp + template + GLM_FUNC_QUALIFIER genType exp + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'exp' only accept floating-point input"); + + return ::std::exp(x); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 exp + ( + detail::tvec2 const & x + ) + { + return detail::tvec2( + exp(x.x), + exp(x.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 exp + ( + detail::tvec3 const & x + ) + { + return detail::tvec3( + exp(x.x), + exp(x.y), + exp(x.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 exp + ( + detail::tvec4 const & x + ) + { + return detail::tvec4( + exp(x.x), + exp(x.y), + exp(x.z), + exp(x.w)); + } + + // log + template + GLM_FUNC_QUALIFIER genType log + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'log' only accept floating-point input"); + + return ::std::log(x); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 log + ( + detail::tvec2 const & x + ) + { + return detail::tvec2( + log(x.x), + log(x.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 log + ( + detail::tvec3 const & x + ) + { + return detail::tvec3( + log(x.x), + log(x.y), + log(x.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 log + ( + detail::tvec4 const & x + ) + { + return detail::tvec4( + log(x.x), + log(x.y), + log(x.z), + log(x.w)); + } + + //exp2, ln2 = 0.69314718055994530941723212145818f + template + GLM_FUNC_QUALIFIER genType exp2 + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'exp2' only accept floating-point input"); + + return ::std::exp(genType(0.69314718055994530941723212145818) * x); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 exp2 + ( + detail::tvec2 const & x + ) + { + return detail::tvec2( + exp2(x.x), + exp2(x.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 exp2 + ( + detail::tvec3 const & x + ) + { + return detail::tvec3( + exp2(x.x), + exp2(x.y), + exp2(x.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 exp2 + ( + detail::tvec4 const & x + ) + { + return detail::tvec4( + exp2(x.x), + exp2(x.y), + exp2(x.z), + exp2(x.w)); + } + + // log2, ln2 = 0.69314718055994530941723212145818f + template + GLM_FUNC_QUALIFIER genType log2 + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'log2' only accept floating-point input"); + + return ::std::log(x) / genType(0.69314718055994530941723212145818); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 log2 + ( + detail::tvec2 const & x + ) + { + return detail::tvec2( + log2(x.x), + log2(x.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 log2 + ( + detail::tvec3 const & x + ) + { + return detail::tvec3( + log2(x.x), + log2(x.y), + log2(x.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 log2 + ( + detail::tvec4 const & x + ) + { + return detail::tvec4( + log2(x.x), + log2(x.y), + log2(x.z), + log2(x.w)); + } + + // sqrt + template + GLM_FUNC_QUALIFIER genType sqrt + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'sqrt' only accept floating-point input"); + + return genType(::std::sqrt(x)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 sqrt + ( + detail::tvec2 const & x + ) + { + return detail::tvec2( + sqrt(x.x), + sqrt(x.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 sqrt + ( + detail::tvec3 const & x + ) + { + return detail::tvec3( + sqrt(x.x), + sqrt(x.y), + sqrt(x.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 sqrt + ( + detail::tvec4 const & x + ) + { + return detail::tvec4( + sqrt(x.x), + sqrt(x.y), + sqrt(x.z), + sqrt(x.w)); + } + + template + GLM_FUNC_QUALIFIER genType inversesqrt + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'inversesqrt' only accept floating-point input"); + + return genType(1) / ::std::sqrt(x); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 inversesqrt + ( + detail::tvec2 const & x + ) + { + return detail::tvec2( + inversesqrt(x.x), + inversesqrt(x.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 inversesqrt + ( + detail::tvec3 const & x + ) + { + return detail::tvec3( + inversesqrt(x.x), + inversesqrt(x.y), + inversesqrt(x.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 inversesqrt + ( + detail::tvec4 const & x + ) + { + return detail::tvec4( + inversesqrt(x.x), + inversesqrt(x.y), + inversesqrt(x.z), + inversesqrt(x.w)); + } + + }//namespace exponential + }//namespace function + }//namespace core +}//namespace glm diff --git a/ExternalLibs/glm/core/func_geometric.hpp b/ExternalLibs/glm/core/func_geometric.hpp new file mode 100644 index 0000000..c82d104 --- /dev/null +++ b/ExternalLibs/glm/core/func_geometric.hpp @@ -0,0 +1,113 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2008-08-03 +// Updated : 2010-02-04 +// Licence : This source is under MIT License +// File : glm/core/func_geometric.hpp +/////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_func_geometric +#define glm_core_func_geometric + +namespace glm +{ + namespace test{ + void main_core_func_geometric(); + }//namespace test + + namespace core{ + namespace function{ + //! Define all geometric functions from Section 8.4 of GLSL 1.30.8 specification. Included in glm namespace. + namespace geometric{ + + /// \addtogroup core_funcs + ///@{ + + //! Returns the length of x, i.e., sqrt(x * x). + //! + //! \li GLSL length man page + //! \li GLSL 1.30.08 specification, section 8.4 + template + typename genType::value_type length( + genType const & x); + + //! Returns the distance betwwen p0 and p1, i.e., length(p0 - p1). + //! + //! \li GLSL distance man page + //! \li GLSL 1.30.08 specification, section 8.4 + template + typename genType::value_type distance( + genType const & p0, + genType const & p1); + + //! Returns the dot product of x and y, i.e., result = x * y. + //! + //! \li GLSL dot man page + //! \li GLSL 1.30.08 specification, section 8.4 + template + typename genType::value_type dot( + genType const & x, + genType const & y); + + //! Returns the cross product of x and y. + //! + //! \li GLSL cross man page + //! \li GLSL 1.30.08 specification, section 8.4 + template + detail::tvec3 cross( + detail::tvec3 const & x, + detail::tvec3 const & y); + + //! Returns a vector in the same direction as x but with length of 1. + //! + //! \li GLSL normalize man page + //! \li GLSL 1.30.08 specification, section 8.4 + template + genType normalize( + genType const & x); + + //! If dot(Nref, I) < 0.0, return N, otherwise, return -N. + //! + //! \li GLSL faceforward man page + //! \li GLSL 1.30.08 specification, section 8.4 + template + genType faceforward( + genType const & N, + genType const & I, + genType const & Nref); + + //! For the incident vector I and surface orientation N, + //! returns the reflection direction : result = I - 2.0 * dot(N, I) * N. + //! + //! \li GLSL reflect man page + //! \li GLSL 1.30.08 specification, section 8.4 + template + genType reflect( + genType const & I, + genType const & N); + + //! For the incident vector I and surface normal N, + //! and the ratio of indices of refraction eta, + //! return the refraction vector. + //! + //! \li GLSL refract man page + //! \li GLSL 1.30.08 specification, section 8.4 + template + genType refract( + genType const & I, + genType const & N, + typename genType::value_type const & eta); + + ///@} + + }//namespace geometric + }//namespace function + }//namespace core + + using namespace core::function::geometric; +}//namespace glm + +#include "func_geometric.inl" + +#endif//glm_core_func_geometric diff --git a/ExternalLibs/glm/core/func_geometric.inl b/ExternalLibs/glm/core/func_geometric.inl new file mode 100644 index 0000000..086b522 --- /dev/null +++ b/ExternalLibs/glm/core/func_geometric.inl @@ -0,0 +1,290 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2008-08-03 +// Updated : 2010-02-04 +// Licence : This source is under MIT License +// File : glm/core/func_geometric.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + namespace core{ + namespace function{ + namespace geometric{ + + // length + template + GLM_FUNC_QUALIFIER genType length + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'length' only accept floating-point inputs"); + + genType sqr = x * x; + return sqrt(sqr); + } + + template + GLM_FUNC_QUALIFIER typename detail::tvec2::value_type length + ( + detail::tvec2 const & v + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'length' only accept floating-point inputs"); + + typename detail::tvec2::value_type sqr = v.x * v.x + v.y * v.y; + return sqrt(sqr); + } + + template + GLM_FUNC_QUALIFIER typename detail::tvec3::value_type length + ( + detail::tvec3 const & v + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'length' only accept floating-point inputs"); + + typename detail::tvec3::value_type sqr = v.x * v.x + v.y * v.y + v.z * v.z; + return sqrt(sqr); + } + + template + GLM_FUNC_QUALIFIER typename detail::tvec4::value_type length + ( + detail::tvec4 const & v + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'length' only accept floating-point inputs"); + + typename detail::tvec4::value_type sqr = v.x * v.x + v.y * v.y + v.z * v.z + v.w * v.w; + return sqrt(sqr); + } + + // distance + template + GLM_FUNC_QUALIFIER genType distance + ( + genType const & p0, + genType const & p1 + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'distance' only accept floating-point inputs"); + + return length(p1 - p0); + } + + template + GLM_FUNC_QUALIFIER typename detail::tvec2::value_type distance + ( + detail::tvec2 const & p0, + detail::tvec2 const & p1 + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'distance' only accept floating-point inputs"); + + return length(p1 - p0); + } + + template + GLM_FUNC_QUALIFIER typename detail::tvec3::value_type distance + ( + detail::tvec3 const & p0, + detail::tvec3 const & p1 + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'distance' only accept floating-point inputs"); + + return length(p1 - p0); + } + + template + GLM_FUNC_QUALIFIER typename detail::tvec4::value_type distance + ( + detail::tvec4 const & p0, + detail::tvec4 const & p1 + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'distance' only accept floating-point inputs"); + + return length(p1 - p0); + } + + // dot + template + GLM_FUNC_QUALIFIER genType dot + ( + genType const & x, + genType const & y + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'dot' only accept floating-point inputs"); + + return x * y; + } + + template + GLM_FUNC_QUALIFIER typename detail::tvec2::value_type dot + ( + detail::tvec2 const & x, + detail::tvec2 const & y + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'dot' only accept floating-point inputs"); + + return x.x * y.x + x.y * y.y; + } + + template + GLM_FUNC_QUALIFIER T dot + ( + detail::tvec3 const & x, + detail::tvec3 const & y + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'dot' only accept floating-point inputs"); + + return x.x * y.x + x.y * y.y + x.z * y.z; + } +/* // SSE3 + GLM_FUNC_QUALIFIER float dot(const tvec4& x, const tvec4& y) + { + float Result; + __asm + { + mov esi, x + mov edi, y + movaps xmm0, [esi] + mulps xmm0, [edi] + haddps( _xmm0, _xmm0 ) + haddps( _xmm0, _xmm0 ) + movss Result, xmm0 + } + return Result; + } +*/ + template + GLM_FUNC_QUALIFIER T dot + ( + detail::tvec4 const & x, + detail::tvec4 const & y + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'dot' only accept floating-point inputs"); + + return x.x * y.x + x.y * y.y + x.z * y.z + x.w * y.w; + } + + // cross + template + GLM_FUNC_QUALIFIER detail::tvec3 cross + ( + detail::tvec3 const & x, + detail::tvec3 const & y + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'cross' only accept floating-point inputs"); + + return detail::tvec3( + x.y * y.z - y.y * x.z, + x.z * y.x - y.z * x.x, + x.x * y.y - y.x * x.y); + } + + // normalize + template + GLM_FUNC_QUALIFIER genType normalize + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'normalize' only accept floating-point inputs"); + + return x < genType(0) ? genType(-1) : genType(1); + } + + // According to issue 10 GLSL 1.10 specification, if length(x) == 0 then result is undefine and generate an error + template + GLM_FUNC_QUALIFIER detail::tvec2 normalize + ( + detail::tvec2 const & x + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'normalize' only accept floating-point inputs"); + + typename detail::tvec2::value_type sqr = x.x * x.x + x.y * x.y; + return x * inversesqrt(sqr); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 normalize + ( + detail::tvec3 const & x + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'normalize' only accept floating-point inputs"); + + typename detail::tvec3::value_type sqr = x.x * x.x + x.y * x.y + x.z * x.z; + return x * inversesqrt(sqr); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 normalize + ( + detail::tvec4 const & x + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'normalize' only accept floating-point inputs"); + + typename detail::tvec4::value_type sqr = x.x * x.x + x.y * x.y + x.z * x.z + x.w * x.w; + return x * inversesqrt(sqr); + } + + // faceforward + template + GLM_FUNC_QUALIFIER genType faceforward + ( + genType const & N, + genType const & I, + genType const & Nref + ) + { + return dot(Nref, I) < 0 ? N : -N; + } + + // reflect + template + genType reflect + ( + genType const & I, + genType const & N + ) + { + return I - N * dot(N, I) * float(2); + } + + // refract + template + GLM_FUNC_QUALIFIER genType refract + ( + genType const & I, + genType const & N, + typename genType::value_type const & eta + ) + { + //It could be a vector + //GLM_STATIC_ASSERT(detail::type::is_float); + + typename genType::value_type dotValue = dot(N, I); + typename genType::value_type k = typename genType::value_type(1) - eta * eta * (typename genType::value_type(1) - dotValue * dotValue); + if(k < typename genType::value_type(0)) + return genType(0); + else + return eta * I - (eta * dotValue + sqrt(k)) * N; + } + + }//namespace geometric + }//namespace function + }//namespace core +}//namespace glm diff --git a/ExternalLibs/glm/core/func_integer.hpp b/ExternalLibs/glm/core/func_integer.hpp new file mode 100644 index 0000000..b411b58 --- /dev/null +++ b/ExternalLibs/glm/core/func_integer.hpp @@ -0,0 +1,162 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2010-03-17 +// Updated : 2010-03-31 +// Licence : This source is under MIT License +// File : glm/core/func_integer.hpp +/////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_func_integer +#define glm_core_func_integer + +namespace glm +{ + namespace test{ + void main_core_func_integer(); + }//namespace test + + namespace core{ + namespace function{ + //! Define integer functions from Section 8.8 of GLSL 4.00.8 specification. + namespace integer{ + + /// \addtogroup core_funcs + ///@{ + + //! Adds 32-bit unsigned integer x and y, returning the sum + //! modulo pow(2, 32). The value carry is set to 0 if the sum was + //! less than pow(2, 32), or to 1 otherwise. + //! + //! \li GLSL uaddCarry man page + //! \li GLSL 4.00.08 specification, section 8.8 + template + genUType uaddCarry( + genUType const & x, + genUType const & y, + genUType & carry); + + //! Subtracts the 32-bit unsigned integer y from x, returning + //! the difference if non-negative, or pow(2, 32) plus the difference + //! otherwise. The value borrow is set to 0 if x >= y, or to 1 otherwise. + //! + //! \li GLSL usubBorrow man page + //! \li GLSL 4.00.08 specification, section 8.8 + template + genUType usubBorrow( + genUType const & x, + genUType const & y, + genUType & borrow); + + //! Multiplies 32-bit integers x and y, producing a 64-bit + //! result. The 32 least-significant bits are returned in lsb. + //! The 32 most-significant bits are returned in msb. + //! + //! \li GLSL umulExtended man page + //! \li GLSL 4.00.08 specification, section 8.8 + template + void umulExtended( + genUType const & x, + genUType const & y, + genUType & msb, + genUType & lsb); + + //! Multiplies 32-bit integers x and y, producing a 64-bit + //! result. The 32 least-significant bits are returned in lsb. + //! The 32 most-significant bits are returned in msb. + //! + //! \li GLSL imulExtended man page + //! \li GLSL 4.00.08 specification, section 8.8 + template + void imulExtended( + genIType const & x, + genIType const & y, + genIType & msb, + genIType & lsb); + + //! Extracts bits [offset, offset + bits - 1] from value, + //! returning them in the least significant bits of the result. + //! For unsigned data types, the most significant bits of the + //! result will be set to zero. For signed data types, the + //! most significant bits will be set to the value of bit offset + base – 1. + //! + //! If bits is zero, the result will be zero. The result will be + //! undefined if offset or bits is negative, or if the sum of + //! offset and bits is greater than the number of bits used + //! to store the operand. + //! + //! \li GLSL bitfieldExtract man page + //! \li GLSL 4.00.08 specification, section 8.8 + template + genIUType bitfieldExtract( + genIUType const & Value, + int const & Offset, + int const & Bits); + + //! Returns the insertion the bits least-significant bits of insert into base. + //! + //! The result will have bits [offset, offset + bits - 1] taken + //! from bits [0, bits – 1] of insert, and all other bits taken + //! directly from the corresponding bits of base. If bits is + //! zero, the result will simply be base. The result will be + //! undefined if offset or bits is negative, or if the sum of + //! offset and bits is greater than the number of bits used to + //! store the operand. + //! + //! \li GLSL bitfieldInsert man page + //! \li GLSL 4.00.08 specification, section 8.8 + template + genIUType bitfieldInsert( + genIUType const & Base, + genIUType const & Insert, + int const & Offset, + int const & Bits); + + //! Returns the reversal of the bits of value. + //! The bit numbered n of the result will be taken from bit (bits - 1) - n of value, + //! where bits is the total number of bits used to represent value. + //! + //! \li GLSL bitfieldReverse man page + //! \li GLSL 4.00.08 specification, section 8.8 + template + genIUType bitfieldReverse(genIUType const & value); + + //! Returns the number of bits set to 1 in the binary representation of value. + //! + //! \li GLSL bitCount man page + //! \li GLSL 4.00.08 specification, section 8.8 + template class C> + typename C::signed_type bitCount(C const & Value); + + //! Returns the bit number of the least significant bit set to + //! 1 in the binary representation of value. + //! If value is zero, -1 will be returned. + //! + //! \li GLSL findLSB man page + //! \li GLSL 4.00.08 specification, section 8.8 + template class C> + typename C::signed_type findLSB(C const & Value); + + //! Returns the bit number of the most significant bit in the binary representation of value. + //! For positive integers, the result will be the bit number of the most significant bit set to 1. + //! For negative integers, the result will be the bit number of the most significant + //! bit set to 0. For a value of zero or negative one, -1 will be returned. + //! + //! \li GLSL findMSB man page + //! \li GLSL 4.00.08 specification, section 8.8 + template class C> + typename C::signed_type findMSB(C const & Value); + + ///@} + + }//namespace integer + }//namespace function + }//namespace core + + using namespace core::function::integer; +}//namespace glm + +#include "func_integer.inl" + +#endif//glm_core_func_integer + diff --git a/ExternalLibs/glm/core/func_integer.inl b/ExternalLibs/glm/core/func_integer.inl new file mode 100644 index 0000000..0e30aa2 --- /dev/null +++ b/ExternalLibs/glm/core/func_integer.inl @@ -0,0 +1,597 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2010-03-17 +// Updated : 2010-03-31 +// Licence : This source is under MIT License +// File : glm/core/func_integer.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + namespace detail + { + + }//namespace detail + + namespace core{ + namespace function{ + namespace integer + { + // uaddCarry + template + GLM_FUNC_QUALIFIER genUType uaddCarry + ( + genUType const & x, + genUType const & y, + genUType & Carry + ) + { + detail::highp_uint_t Value64 = detail::highp_uint_t(x) + detail::highp_uint_t(y); + genUType Result = genUType(Value64 % (detail::highp_uint_t(1) << detail::highp_uint_t(32))); + Carry = (Value64 % (detail::highp_uint_t(1) << detail::highp_uint_t(32))) > 1 ? 1 : 0; + return Result; + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 uaddCarry + ( + detail::tvec2 const & x, + detail::tvec2 const & y, + detail::tvec2 & Carry + ) + { + return detail::tvec2( + uaddCarry(x[0], y[0], Carry[0]), + uaddCarry(x[1], y[1], Carry[1])); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 uaddCarry + ( + detail::tvec3 const & x, + detail::tvec3 const & y, + detail::tvec3 & Carry + ) + { + return detail::tvec3( + uaddCarry(x[0], y[0], Carry[0]), + uaddCarry(x[1], y[1], Carry[1]), + uaddCarry(x[2], y[2], Carry[2])); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 uaddCarry + ( + detail::tvec4 const & x, + detail::tvec4 const & y, + detail::tvec4 & Carry + ) + { + return detail::tvec4( + uaddCarry(x[0], y[0], Carry[0]), + uaddCarry(x[1], y[1], Carry[1]), + uaddCarry(x[2], y[2], Carry[2]), + uaddCarry(x[3], y[3], Carry[3])); + } + + // usubBorrow + template + GLM_FUNC_QUALIFIER genUType usubBorrow + ( + genUType const & x, + genUType const & y, + genUType & Borrow + ) + { + Borrow = x >= y ? 0 : 1; + if(x > y) + return genUType(detail::highp_int_t(x) - detail::highp_int_t(y)); + else + return genUType(detail::highp_int_t(1) << detail::highp_int_t(32) + detail::highp_int_t(x) - detail::highp_int_t(y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 usubBorrow + ( + detail::tvec2 const & x, + detail::tvec2 const & y, + detail::tvec2 & Borrow + ) + { + return detail::tvec2( + usubBorrow(x[0], y[0], Borrow[0]), + usubBorrow(x[1], y[1], Borrow[1])); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 usubBorrow + ( + detail::tvec3 const & x, + detail::tvec3 const & y, + detail::tvec3 & Borrow + ) + { + return detail::tvec3( + usubBorrow(x[0], y[0], Borrow[0]), + usubBorrow(x[1], y[1], Borrow[1]), + usubBorrow(x[2], y[2], Borrow[2])); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 usubBorrow + ( + detail::tvec4 const & x, + detail::tvec4 const & y, + detail::tvec4 & Borrow + ) + { + return detail::tvec4( + usubBorrow(x[0], y[0], Borrow[0]), + usubBorrow(x[1], y[1], Borrow[1]), + usubBorrow(x[2], y[2], Borrow[2]), + usubBorrow(x[3], y[3], Borrow[3])); + } + + // umulExtended + template + GLM_FUNC_QUALIFIER void umulExtended + ( + genUType const & x, + genUType const & y, + genUType & msb, + genUType & lsb + ) + { + detail::highp_uint_t ValueX64 = x; + detail::highp_uint_t ValueY64 = y; + detail::highp_uint_t Value64 = ValueX64 * ValueY64; + msb = *(genUType*)&genUType(Value64 & ((detail::highp_uint_t(1) << detail::highp_uint_t(32)) - detail::highp_uint_t(1))); + lsb = *(genUType*)&genUType(Value64 >> detail::highp_uint_t(32)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 umulExtended + ( + detail::tvec2 const & x, + detail::tvec2 const & y, + detail::tvec2 & msb, + detail::tvec2 & lsb + ) + { + return detail::tvec2( + umulExtended(x[0], y[0], msb, lsb), + umulExtended(x[1], y[1], msb, lsb)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 umulExtended + ( + detail::tvec3 const & x, + detail::tvec3 const & y, + detail::tvec3 & msb, + detail::tvec3 & lsb + ) + { + return detail::tvec3( + umulExtended(x[0], y[0], msb, lsb), + umulExtended(x[1], y[1], msb, lsb), + umulExtended(x[2], y[2], msb, lsb)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 umulExtended + ( + detail::tvec4 const & x, + detail::tvec4 const & y, + detail::tvec4 & msb, + detail::tvec4 & lsb + ) + { + return detail::tvec4( + umulExtended(x[0], y[0], msb, lsb), + umulExtended(x[1], y[1], msb, lsb), + umulExtended(x[2], y[2], msb, lsb), + umulExtended(x[3], y[3], msb, lsb)); + } + + // imulExtended + template + GLM_FUNC_QUALIFIER void imulExtended + ( + genIType const & x, + genIType const & y, + genIType & msb, + genIType & lsb + ) + { + detail::highp_int_t ValueX64 = x; + detail::highp_int_t ValueY64 = y; + detail::highp_int_t Value64 = ValueX64 * ValueY64; + msb = *(genIType*)&genIType(Value64 & ((detail::highp_uint_t(1) << detail::highp_uint_t(32)) - detail::highp_uint_t(1))); + lsb = *(genIType*)&genIType(Value64 >> detail::highp_uint_t(32)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 imulExtended + ( + detail::tvec2 const & x, + detail::tvec2 const & y, + detail::tvec2 & msb, + detail::tvec2 & lsb + ) + { + return detail::tvec2( + imulExtended(x[0], y[0], msb, lsb), + imulExtended(x[1], y[1], msb, lsb)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 imulExtended + ( + detail::tvec3 const & x, + detail::tvec3 const & y, + detail::tvec3 & msb, + detail::tvec3 & lsb + ) + { + return detail::tvec3( + imulExtended(x[0], y[0], msb, lsb), + imulExtended(x[1], y[1], msb, lsb), + imulExtended(x[2], y[2], msb, lsb)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 imulExtended + ( + detail::tvec4 const & x, + detail::tvec4 const & y, + detail::tvec4 & msb, + detail::tvec4 & lsb + ) + { + return detail::tvec4( + imulExtended(x[0], y[0], msb, lsb), + imulExtended(x[1], y[1], msb, lsb), + imulExtended(x[2], y[2], msb, lsb), + imulExtended(x[3], y[3], msb, lsb)); + } + + // bitfieldExtract + template + GLM_FUNC_QUALIFIER genIUType bitfieldExtract + ( + genIUType const & Value, + int const & Offset, + int const & Bits + ) + { + int GenSize = int(sizeof(genIUType)) << int(3); + + assert(Offset + Bits <= GenSize); + + genIUType ShiftLeft = Bits ? Value << (GenSize - (Bits + Offset)) : genIUType(0); + genIUType ShiftBack = ShiftLeft >> genIUType(GenSize - Bits); + + return ShiftBack; + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 bitfieldExtract + ( + detail::tvec2 const & Value, + int const & Offset, + int const & Bits + ) + { + return detail::tvec2( + bitfieldExtract(Value[0]), + bitfieldExtract(Value[1])); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 bitfieldExtract + ( + detail::tvec3 const & Value, + int const & Offset, + int const & Bits + ) + { + return detail::tvec3( + bitfieldExtract(Value[0]), + bitfieldExtract(Value[1]), + bitfieldExtract(Value[2])); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 bitfieldExtract + ( + detail::tvec4 const & Value, + int const & Offset, + int const & Bits + ) + { + return detail::tvec4( + bitfieldExtract(Value[0]), + bitfieldExtract(Value[1]), + bitfieldExtract(Value[2]), + bitfieldExtract(Value[3])); + } + + // bitfieldInsert + template + GLM_FUNC_QUALIFIER genIUType bitfieldInsert + ( + genIUType const & Base, + genIUType const & Insert, + int const & Offset, + int const & Bits + ) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'bitfieldInsert' only accept integer values"); + assert(Offset + Bits <= sizeof(genIUType)); + + if(Bits == 0) + return Base; + + genIUType Mask = 0; + for(int Bit = Offset; Bit < Offset + Bits; ++Bit) + Mask |= (1 << Bit); + + return (Base & ~Mask) | (Insert & Mask); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 bitfieldInsert + ( + detail::tvec2 const & Base, + detail::tvec2 const & Insert, + int const & Offset, + int const & Bits + ) + { + return detail::tvec2( + bitfieldInsert(Base[0], Insert[0], Offset, Bits), + bitfieldInsert(Base[1], Insert[1], Offset, Bits)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 bitfieldInsert + ( + detail::tvec3 const & Base, + detail::tvec3 const & Insert, + int const & Offset, + int const & Bits + ) + { + return detail::tvec3( + bitfieldInsert(Base[0], Insert[0], Offset, Bits), + bitfieldInsert(Base[1], Insert[1], Offset, Bits), + bitfieldInsert(Base[2], Insert[2], Offset, Bits)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 bitfieldInsert + ( + detail::tvec4 const & Base, + detail::tvec4 const & Insert, + int const & Offset, + int const & Bits + ) + { + return detail::tvec4( + bitfieldInsert(Base[0], Insert[0], Offset, Bits), + bitfieldInsert(Base[1], Insert[1], Offset, Bits), + bitfieldInsert(Base[2], Insert[2], Offset, Bits), + bitfieldInsert(Base[3], Insert[3], Offset, Bits)); + } + + // bitfieldReverse + template + GLM_FUNC_QUALIFIER genIUType bitfieldReverse(genIUType const & Value) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'bitfieldReverse' only accept integer values"); + + genIUType Out = 0; + std::size_t BitSize = sizeof(genIUType) * 8; + for(std::size_t i = 0; i < BitSize; ++i) + if(Value & (genIUType(1) << i)) + Out |= genIUType(1) << (BitSize - 1 - i); + return Out; + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 bitfieldReverse + ( + detail::tvec2 const & value + ) + { + return detail::tvec2( + bitfieldReverse(value[0]), + bitfieldReverse(value[1])); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 bitfieldReverse + ( + detail::tvec3 const & value + ) + { + return detail::tvec3( + bitfieldReverse(value[0]), + bitfieldReverse(value[1]), + bitfieldReverse(value[2])); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 bitfieldReverse + ( + detail::tvec4 const & value + ) + { + return detail::tvec4( + bitfieldReverse(value[0]), + bitfieldReverse(value[1]), + bitfieldReverse(value[2]), + bitfieldReverse(value[3])); + } + + // bitCount + template + GLM_FUNC_QUALIFIER int bitCount(genIUType const & Value) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'bitCount' only accept integer values"); + + int Count = 0; + for(std::size_t i = 0; i < sizeof(genIUType) * std::size_t(8); ++i) + { + if(Value & (1 << i)) + ++Count; + } + return Count; + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 bitCount + ( + detail::tvec2 const & value + ) + { + return detail::tvec2( + bitCount(value[0]), + bitCount(value[1])); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 bitCount + ( + detail::tvec3 const & value + ) + { + return detail::tvec3( + bitCount(value[0]), + bitCount(value[1]), + bitCount(value[2])); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 bitCount + ( + detail::tvec4 const & value + ) + { + return detail::tvec4( + bitCount(value[0]), + bitCount(value[1]), + bitCount(value[2]), + bitCount(value[3])); + } + + // findLSB + template + GLM_FUNC_QUALIFIER int findLSB + ( + genIUType const & Value + ) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'findLSB' only accept integer values"); + if(Value == 0) + return -1; + + genIUType Bit; + for(Bit = genIUType(0); !(Value & (1 << Bit)); ++Bit){} + return Bit; + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 findLSB + ( + detail::tvec2 const & value + ) + { + return detail::tvec2( + findLSB(value[0]), + findLSB(value[1])); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 findLSB + ( + detail::tvec3 const & value + ) + { + return detail::tvec3( + findLSB(value[0]), + findLSB(value[1]), + findLSB(value[2])); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 findLSB + ( + detail::tvec4 const & value + ) + { + return detail::tvec4( + findLSB(value[0]), + findLSB(value[1]), + findLSB(value[2]), + findLSB(value[3])); + } + + // findMSB + template + GLM_FUNC_QUALIFIER int findMSB + ( + genIUType const & Value + ) + { + GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'findMSB' only accept integer values"); + if(Value == 0) + return -1; + + genIUType bit = genIUType(-1); + for(genIUType tmp = Value; tmp; tmp >>= 1, ++bit){} + return bit; + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 findMSB + ( + detail::tvec2 const & value + ) + { + return detail::tvec2( + findMSB(value[0]), + findMSB(value[1])); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 findMSB + ( + detail::tvec3 const & value + ) + { + return detail::tvec3( + findMSB(value[0]), + findMSB(value[1]), + findMSB(value[2])); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 findMSB + ( + detail::tvec4 const & value + ) + { + return detail::tvec4( + findMSB(value[0]), + findMSB(value[1]), + findMSB(value[2]), + findMSB(value[3])); + } + + }//namespace integer + }//namespace function + }//namespace core +}//namespace glm diff --git a/ExternalLibs/glm/core/func_matrix.hpp b/ExternalLibs/glm/core/func_matrix.hpp new file mode 100644 index 0000000..6a60b47 --- /dev/null +++ b/ExternalLibs/glm/core/func_matrix.hpp @@ -0,0 +1,115 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2008-08-03 +// Updated : 2010-02-04 +// Licence : This source is under MIT License +// File : glm/core/func_matrix.hpp +/////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_func_matrix +#define glm_core_func_matrix + +namespace glm +{ + namespace test{ + void main_core_func_matrix(); + }//namespace test + + namespace core{ + namespace function{ + //! Define all matrix functions from Section 8.5 of GLSL 1.30.8 specification. Included in glm namespace. + namespace matrix{ + + /// \addtogroup core_funcs + ///@{ + + //! Multiply matrix x by matrix y component-wise, i.e., + //! result[i][j] is the scalar product of x[i][j] and y[i][j]. + //! + //! \li GLSL matrixCompMult man page + //! \li GLSL 1.30.08 specification, section 8.5 + template + matType matrixCompMult( + matType const & x, + matType const & y); + + //! Treats the first parameter c as a column vector + //! and the second parameter r as a row vector + //! and does a linear algebraic matrix multiply c * r. + //! + //! \li GLSL outerProduct man page + //! \li GLSL 1.30.08 specification, section 8.5 + template + matType outerProduct( + vecType const & c, + vecType const & r); + + //! Returns the transposed matrix of x + //! + //! \li GLSL transpose man page + //! \li GLSL 1.30.08 specification, section 8.5 + template + typename matType::transpose_type transpose( + matType const & x); + + //! Return the determinant of a mat2 matrix. + //! + //! \li GLSL determinant man page + //! \li GLSL 1.30.08 specification, section 8.5 + template + typename detail::tmat2x2::value_type determinant( + detail::tmat2x2 const & m); + + //! Return the determinant of a mat3 matrix. + //! + //! \li GLSL determinant man page + //! \li GLSL 1.30.08 specification, section 8.5 + template + typename detail::tmat3x3::value_type determinant( + detail::tmat3x3 const & m); + + //! Return the determinant of a mat4 matrix. + //! + //! \li GLSL determinant man page + //! \li GLSL 1.30.08 specification, section 8.5 + template + typename detail::tmat4x4::value_type determinant( + detail::tmat4x4 const & m); + + //! Return the inverse of a mat2 matrix. + //! + //! \li GLSL inverse man page + //! \li GLSL 1.40.07 specification, section 8.5 + template + detail::tmat2x2 inverse( + detail::tmat2x2 const & m); + + //! Return the inverse of a mat3 matrix. + //! + //! \li GLSL inverse man page + //! \li GLSL 1.40.07 specification, section 8.5 + template + detail::tmat3x3 inverse( + detail::tmat3x3 const & m); + + //! Return the inverse of a mat4 matrix. + //! + //! \li GLSL inverse man page + //! \li GLSL 1.40.07 specification, section 8.5 + template + detail::tmat4x4 inverse( + detail::tmat4x4 const & m); + + ///@} + + }//namespace matrix + }//namespace function + }//namespace core + + using namespace core::function::matrix; +}//namespace glm + +#include "func_matrix.inl" + +#endif//glm_core_func_matrix diff --git a/ExternalLibs/glm/core/func_matrix.inl b/ExternalLibs/glm/core/func_matrix.inl new file mode 100644 index 0000000..d775d96 --- /dev/null +++ b/ExternalLibs/glm/core/func_matrix.inl @@ -0,0 +1,571 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2008-03-08 +// Updated : 2010-02-04 +// Licence : This source is under MIT License +// File : glm/core/func_matrix.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + namespace core{ + namespace function{ + namespace matrix{ + + // matrixCompMult + template + GLM_FUNC_QUALIFIER matType matrixCompMult + ( + matType const & x, + matType const & y + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'matrixCompMult' only accept floating-point inputs"); + + matType result(matType::null); + for(typename matType::size_type i = 0; i < matType::col_size(); ++i) + result[i] = x[i] * y[i]; + return result; + } + + // outerProduct + template + GLM_FUNC_QUALIFIER detail::tmat2x2 outerProduct + ( + detail::tvec2 const & c, + detail::tvec2 const & r + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'outerProduct' only accept floating-point inputs"); + + detail::tmat2x2 m(detail::tmat2x2::null); + m[0][0] = c[0] * r[0]; + m[0][1] = c[1] * r[0]; + m[1][0] = c[0] * r[1]; + m[1][1] = c[1] * r[1]; + return m; + } + + template + GLM_FUNC_QUALIFIER detail::tmat3x3 outerProduct + ( + detail::tvec3 const & c, + detail::tvec3 const & r + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'outerProduct' only accept floating-point inputs"); + + detail::tmat3x3 m(detail::tmat3x3::null); + for(typename detail::tmat3x3::size_type i = 0; i < detail::tmat3x3::col_size(); ++i) + m[i] = c * r[i]; + return m; + } + + template + GLM_FUNC_QUALIFIER detail::tmat4x4 outerProduct + ( + detail::tvec4 const & c, + detail::tvec4 const & r + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'outerProduct' only accept floating-point inputs"); + + detail::tmat4x4 m(detail::tmat4x4::null); + for(typename detail::tmat4x4::size_type i = 0; i < detail::tmat4x4::col_size(); ++i) + m[i] = c * r[i]; + return m; + } + + template + GLM_FUNC_QUALIFIER detail::tmat2x3 outerProduct + ( + detail::tvec3 const & c, + detail::tvec2 const & r + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'outerProduct' only accept floating-point inputs"); + + detail::tmat2x3 m(detail::tmat2x3::null); + m[0][0] = c.x * r.x; + m[0][1] = c.y * r.x; + m[0][2] = c.z * r.x; + m[1][0] = c.x * r.y; + m[1][1] = c.y * r.y; + m[1][2] = c.z * r.y; + return m; + } + + template + GLM_FUNC_QUALIFIER detail::tmat3x2 outerProduct + ( + detail::tvec2 const & c, + detail::tvec3 const & r + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'outerProduct' only accept floating-point inputs"); + + detail::tmat3x2 m(detail::tmat3x2::null); + m[0][0] = c.x * r.x; + m[0][1] = c.y * r.x; + m[1][0] = c.x * r.y; + m[1][1] = c.y * r.y; + m[2][0] = c.x * r.z; + m[2][1] = c.y * r.z; + return m; + } + + template + GLM_FUNC_QUALIFIER detail::tmat2x4 outerProduct + ( + detail::tvec2 const & c, + detail::tvec4 const & r + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'outerProduct' only accept floating-point inputs"); + + detail::tmat2x4 m(detail::tmat2x4::null); + m[0][0] = c.x * r.x; + m[0][1] = c.y * r.x; + m[0][2] = c.z * r.x; + m[0][3] = c.w * r.x; + m[1][0] = c.x * r.y; + m[1][1] = c.y * r.y; + m[1][2] = c.z * r.y; + m[1][3] = c.w * r.y; + return m; + } + + template + GLM_FUNC_QUALIFIER detail::tmat4x2 outerProduct + ( + detail::tvec4 const & c, + detail::tvec2 const & r + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'outerProduct' only accept floating-point inputs"); + + detail::tmat4x2 m(detail::tmat4x2::null); + m[0][0] = c.x * r.x; + m[0][1] = c.y * r.x; + m[1][0] = c.x * r.y; + m[1][1] = c.y * r.y; + m[2][0] = c.x * r.z; + m[2][1] = c.y * r.z; + m[3][0] = c.x * r.w; + m[3][1] = c.y * r.w; + return m; + } + + template + GLM_FUNC_QUALIFIER detail::tmat3x4 outerProduct + ( + detail::tvec4 const & c, + detail::tvec3 const & r + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'outerProduct' only accept floating-point inputs"); + + detail::tmat3x4 m(detail::tmat3x4::null); + m[0][0] = c.x * r.x; + m[0][1] = c.y * r.x; + m[0][2] = c.z * r.x; + m[0][3] = c.w * r.x; + m[1][0] = c.x * r.y; + m[1][1] = c.y * r.y; + m[1][2] = c.z * r.y; + m[1][3] = c.w * r.y; + m[2][0] = c.x * r.z; + m[2][1] = c.y * r.z; + m[2][2] = c.z * r.z; + m[2][3] = c.w * r.z; + return m; + } + + template + GLM_FUNC_QUALIFIER detail::tmat4x3 outerProduct + ( + detail::tvec3 const & c, + detail::tvec4 const & r + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'outerProduct' only accept floating-point inputs"); + + detail::tmat4x3 m(detail::tmat4x3::null); + m[0][0] = c.x * r.x; + m[0][1] = c.y * r.x; + m[0][2] = c.z * r.x; + m[1][0] = c.x * r.y; + m[1][1] = c.y * r.y; + m[1][2] = c.z * r.y; + m[2][0] = c.x * r.z; + m[2][1] = c.y * r.z; + m[2][2] = c.z * r.z; + m[3][0] = c.x * r.w; + m[3][1] = c.y * r.w; + m[3][2] = c.z * r.w; + return m; + } + + template + GLM_FUNC_QUALIFIER detail::tmat2x2 transpose + ( + detail::tmat2x2 const & m + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'transpose' only accept floating-point inputs"); + + detail::tmat2x2 result(detail::tmat2x2::null); + result[0][0] = m[0][0]; + result[0][1] = m[1][0]; + result[1][0] = m[0][1]; + result[1][1] = m[1][1]; + return result; + } + + template + GLM_FUNC_QUALIFIER detail::tmat3x3 transpose + ( + detail::tmat3x3 const & m + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'transpose' only accept floating-point inputs"); + + detail::tmat3x3 result(detail::tmat3x3::null); + result[0][0] = m[0][0]; + result[0][1] = m[1][0]; + result[0][2] = m[2][0]; + + result[1][0] = m[0][1]; + result[1][1] = m[1][1]; + result[1][2] = m[2][1]; + + result[2][0] = m[0][2]; + result[2][1] = m[1][2]; + result[2][2] = m[2][2]; + return result; + } + + template + GLM_FUNC_QUALIFIER detail::tmat4x4 transpose + ( + detail::tmat4x4 const & m + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'transpose' only accept floating-point inputs"); + + detail::tmat4x4 result(detail::tmat4x4::null); + result[0][0] = m[0][0]; + result[0][1] = m[1][0]; + result[0][2] = m[2][0]; + result[0][3] = m[3][0]; + + result[1][0] = m[0][1]; + result[1][1] = m[1][1]; + result[1][2] = m[2][1]; + result[1][3] = m[3][1]; + + result[2][0] = m[0][2]; + result[2][1] = m[1][2]; + result[2][2] = m[2][2]; + result[2][3] = m[3][2]; + + result[3][0] = m[0][3]; + result[3][1] = m[1][3]; + result[3][2] = m[2][3]; + result[3][3] = m[3][3]; + return result; + } + + template + GLM_FUNC_QUALIFIER detail::tmat2x3 transpose + ( + detail::tmat3x2 const & m + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'transpose' only accept floating-point inputs"); + + detail::tmat2x3 result(detail::tmat2x3::null); + result[0][0] = m[0][0]; + result[0][1] = m[1][0]; + result[0][2] = m[2][0]; + result[1][0] = m[0][1]; + result[1][1] = m[1][1]; + result[1][2] = m[2][1]; + return result; + } + + template + GLM_FUNC_QUALIFIER detail::tmat3x2 transpose + ( + detail::tmat2x3 const & m + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'transpose' only accept floating-point inputs"); + + detail::tmat3x2 result(detail::tmat3x2::null); + result[0][0] = m[0][0]; + result[0][1] = m[1][0]; + result[1][0] = m[0][1]; + result[1][1] = m[1][1]; + result[2][0] = m[0][2]; + result[2][1] = m[1][2]; + return result; + } + + template + GLM_FUNC_QUALIFIER detail::tmat2x4 transpose + ( + detail::tmat4x2 const & m + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'transpose' only accept floating-point inputs"); + + detail::tmat2x4 result(detail::tmat2x4::null); + result[0][0] = m[0][0]; + result[0][1] = m[1][0]; + result[0][2] = m[2][0]; + result[0][3] = m[3][0]; + result[1][0] = m[0][1]; + result[1][1] = m[1][1]; + result[1][2] = m[2][1]; + result[1][3] = m[3][1]; + return result; + } + + template + GLM_FUNC_QUALIFIER detail::tmat4x2 transpose + ( + detail::tmat2x4 const & m + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'transpose' only accept floating-point inputs"); + + detail::tmat4x2 result(detail::tmat4x2::null); + result[0][0] = m[0][0]; + result[0][1] = m[1][0]; + result[1][0] = m[0][1]; + result[1][1] = m[1][1]; + result[2][0] = m[0][2]; + result[2][1] = m[1][2]; + result[3][0] = m[0][3]; + result[3][1] = m[1][3]; + return result; + } + + template + GLM_FUNC_QUALIFIER detail::tmat3x4 transpose + ( + detail::tmat4x3 const & m + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'transpose' only accept floating-point inputs"); + + detail::tmat3x4 result(detail::tmat3x4::null); + result[0][0] = m[0][0]; + result[0][1] = m[1][0]; + result[0][2] = m[2][0]; + result[0][3] = m[3][0]; + result[1][0] = m[0][1]; + result[1][1] = m[1][1]; + result[1][2] = m[2][1]; + result[1][3] = m[3][1]; + result[2][0] = m[0][2]; + result[2][1] = m[1][2]; + result[2][2] = m[2][2]; + result[2][3] = m[3][2]; + return result; + } + + template + GLM_FUNC_QUALIFIER detail::tmat4x3 transpose + ( + detail::tmat3x4 const & m + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'transpose' only accept floating-point inputs"); + + detail::tmat4x3 result(detail::tmat4x3::null); + result[0][0] = m[0][0]; + result[0][1] = m[1][0]; + result[0][2] = m[2][0]; + result[1][0] = m[0][1]; + result[1][1] = m[1][1]; + result[1][2] = m[2][1]; + result[2][0] = m[0][2]; + result[2][1] = m[1][2]; + result[2][2] = m[2][2]; + result[3][0] = m[0][3]; + result[3][1] = m[1][3]; + result[3][2] = m[2][3]; + return result; + } + + template + GLM_FUNC_QUALIFIER typename detail::tmat2x2::value_type determinant + ( + detail::tmat2x2 const & m + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'determinant' only accept floating-point inputs"); + + return m[0][0] * m[1][1] - m[1][0] * m[0][1]; + } + + template + GLM_FUNC_QUALIFIER typename detail::tmat3x3::value_type determinant + ( + detail::tmat3x3 const & m + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'determinant' only accept floating-point inputs"); + + return + + m[0][0] * (m[1][1] * m[2][2] - m[2][1] * m[1][2]) + - m[1][0] * (m[0][1] * m[2][2] - m[2][1] * m[0][2]) + + m[2][0] * (m[0][1] * m[1][2] - m[1][1] * m[0][2]); + } + + template + GLM_FUNC_QUALIFIER typename detail::tmat4x4::value_type determinant + ( + detail::tmat4x4 const & m + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'determinant' only accept floating-point inputs"); + + T SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; + T SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; + T SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2]; + T SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3]; + T SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2]; + T SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1]; + + detail::tvec4 DetCof( + + (m[1][1] * SubFactor00 - m[1][2] * SubFactor01 + m[1][3] * SubFactor02), + - (m[1][0] * SubFactor00 - m[1][2] * SubFactor03 + m[1][3] * SubFactor04), + + (m[1][0] * SubFactor01 - m[1][1] * SubFactor03 + m[1][3] * SubFactor05), + - (m[1][0] * SubFactor02 - m[1][1] * SubFactor04 + m[1][2] * SubFactor05)); + + return m[0][0] * DetCof[0] + + m[0][1] * DetCof[1] + + m[0][2] * DetCof[2] + + m[0][3] * DetCof[3]; + } + + template + GLM_FUNC_QUALIFIER detail::tmat2x2 inverse + ( + detail::tmat2x2 const & m + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'inverse' only accept floating-point inputs"); + + //valType Determinant = m[0][0] * m[1][1] - m[1][0] * m[0][1]; + T Determinant = determinant(m); + + detail::tmat2x2 Inverse( + + m[1][1] / Determinant, + - m[0][1] / Determinant, + - m[1][0] / Determinant, + + m[0][0] / Determinant); + + return Inverse; + } + + template + GLM_FUNC_QUALIFIER detail::tmat3x3 inverse + ( + detail::tmat3x3 const & m + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'inverse' only accept floating-point inputs"); + + //valType Determinant = m[0][0] * (m[1][1] * m[2][2] - m[2][1] * m[1][2]) + // - m[1][0] * (m[0][1] * m[2][2] - m[2][1] * m[0][2]) + // + m[2][0] * (m[0][1] * m[1][2] - m[1][1] * m[0][2]); + + T Determinant = determinant(m); + + detail::tmat3x3 Inverse(detail::tmat3x3::null); + Inverse[0][0] = + (m[1][1] * m[2][2] - m[2][1] * m[1][2]); + Inverse[1][0] = - (m[1][0] * m[2][2] - m[2][0] * m[1][2]); + Inverse[2][0] = + (m[1][0] * m[2][1] - m[2][0] * m[1][1]); + Inverse[0][1] = - (m[0][1] * m[2][2] - m[2][1] * m[0][2]); + Inverse[1][1] = + (m[0][0] * m[2][2] - m[2][0] * m[0][2]); + Inverse[2][1] = - (m[0][0] * m[2][1] - m[2][0] * m[0][1]); + Inverse[0][2] = + (m[0][1] * m[1][2] - m[1][1] * m[0][2]); + Inverse[1][2] = - (m[0][0] * m[1][2] - m[1][0] * m[0][2]); + Inverse[2][2] = + (m[0][0] * m[1][1] - m[1][0] * m[0][1]); + Inverse /= Determinant; + + return Inverse; + } + + template + GLM_FUNC_QUALIFIER detail::tmat4x4 inverse + ( + detail::tmat4x4 const & m + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'inverse' only accept floating-point inputs"); + + T Coef00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; + T Coef02 = m[1][2] * m[3][3] - m[3][2] * m[1][3]; + T Coef03 = m[1][2] * m[2][3] - m[2][2] * m[1][3]; + + T Coef04 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; + T Coef06 = m[1][1] * m[3][3] - m[3][1] * m[1][3]; + T Coef07 = m[1][1] * m[2][3] - m[2][1] * m[1][3]; + + T Coef08 = m[2][1] * m[3][2] - m[3][1] * m[2][2]; + T Coef10 = m[1][1] * m[3][2] - m[3][1] * m[1][2]; + T Coef11 = m[1][1] * m[2][2] - m[2][1] * m[1][2]; + + T Coef12 = m[2][0] * m[3][3] - m[3][0] * m[2][3]; + T Coef14 = m[1][0] * m[3][3] - m[3][0] * m[1][3]; + T Coef15 = m[1][0] * m[2][3] - m[2][0] * m[1][3]; + + T Coef16 = m[2][0] * m[3][2] - m[3][0] * m[2][2]; + T Coef18 = m[1][0] * m[3][2] - m[3][0] * m[1][2]; + T Coef19 = m[1][0] * m[2][2] - m[2][0] * m[1][2]; + + T Coef20 = m[2][0] * m[3][1] - m[3][0] * m[2][1]; + T Coef22 = m[1][0] * m[3][1] - m[3][0] * m[1][1]; + T Coef23 = m[1][0] * m[2][1] - m[2][0] * m[1][1]; + + detail::tvec4 const SignA(+1, -1, +1, -1); + detail::tvec4 const SignB(-1, +1, -1, +1); + + detail::tvec4 Fac0(Coef00, Coef00, Coef02, Coef03); + detail::tvec4 Fac1(Coef04, Coef04, Coef06, Coef07); + detail::tvec4 Fac2(Coef08, Coef08, Coef10, Coef11); + detail::tvec4 Fac3(Coef12, Coef12, Coef14, Coef15); + detail::tvec4 Fac4(Coef16, Coef16, Coef18, Coef19); + detail::tvec4 Fac5(Coef20, Coef20, Coef22, Coef23); + + detail::tvec4 Vec0(m[1][0], m[0][0], m[0][0], m[0][0]); + detail::tvec4 Vec1(m[1][1], m[0][1], m[0][1], m[0][1]); + detail::tvec4 Vec2(m[1][2], m[0][2], m[0][2], m[0][2]); + detail::tvec4 Vec3(m[1][3], m[0][3], m[0][3], m[0][3]); + + detail::tvec4 Inv0 = SignA * (Vec1 * Fac0 - Vec2 * Fac1 + Vec3 * Fac2); + detail::tvec4 Inv1 = SignB * (Vec0 * Fac0 - Vec2 * Fac3 + Vec3 * Fac4); + detail::tvec4 Inv2 = SignA * (Vec0 * Fac1 - Vec1 * Fac3 + Vec3 * Fac5); + detail::tvec4 Inv3 = SignB * (Vec0 * Fac2 - Vec1 * Fac4 + Vec2 * Fac5); + + detail::tmat4x4 Inverse(Inv0, Inv1, Inv2, Inv3); + + detail::tvec4 Row0(Inverse[0][0], Inverse[1][0], Inverse[2][0], Inverse[3][0]); + + T Determinant = glm::dot(m[0], Row0); + + Inverse /= Determinant; + + return Inverse; + } + + }//namespace matrix + }//namespace function + }//namespace core +}//namespace glm diff --git a/ExternalLibs/glm/core/func_noise.hpp b/ExternalLibs/glm/core/func_noise.hpp new file mode 100644 index 0000000..b76ec4b --- /dev/null +++ b/ExternalLibs/glm/core/func_noise.hpp @@ -0,0 +1,66 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2008-08-01 +// Updated : 2008-09-10 +// Licence : This source is under MIT License +// File : glm/core/func_noise.hpp +/////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_func_noise +#define glm_core_func_noise + +namespace glm +{ + namespace test{ + void main_core_func_noise(); + }//namespace test + + namespace core{ + namespace function{ + // Define all noise functions from Section 8.9 of GLSL 1.30.8 specification. Included in glm namespace. + namespace noise{ + + /// \addtogroup core_funcs + ///@{ + + //! Returns a 1D noise value based on the input value x. + //! + //! \li GLSL noise1 man page + //! \li GLSL 1.30.08 specification, section 8.9 + template + typename genType::value_type noise1(genType const & x); + + //! Returns a 2D noise value based on the input value x. + //! + //! \li GLSL noise2 man page + //! \li GLSL 1.30.08 specification, section 8.9 + template + detail::tvec2 noise2(genType const & x); + + //! Returns a 3D noise value based on the input value x. + //! + //! \li GLSL noise3 man page + //! \li GLSL 1.30.08 specification, section 8.9 + template + detail::tvec3 noise3(genType const & x); + + //! Returns a 4D noise value based on the input value x. + //! + //! \li GLSL noise4 man page + //! \li GLSL 1.30.08 specification, section 8.9 + template + detail::tvec4 noise4(genType const & x); + + ///@} + + }//namespace noise + }//namespace function + }//namespace core + + using namespace core::function::noise; +}//namespace glm + +#include "func_noise.inl" + +#endif//glm_core_func_noise diff --git a/ExternalLibs/glm/core/func_noise.inl b/ExternalLibs/glm/core/func_noise.inl new file mode 100644 index 0000000..8e00964 --- /dev/null +++ b/ExternalLibs/glm/core/func_noise.inl @@ -0,0 +1,21 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2008-08-01 +// Updated : 2011-04-14 +// Licence : This source is under MIT License +// File : glm/core/func_noise.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + namespace core{ + namespace function{ + namespace noise{ + + + + }//namespace noise + }//namespace function + }//namespace core +}//namespace glm diff --git a/ExternalLibs/glm/core/func_packing.hpp b/ExternalLibs/glm/core/func_packing.hpp new file mode 100644 index 0000000..3b42778 --- /dev/null +++ b/ExternalLibs/glm/core/func_packing.hpp @@ -0,0 +1,136 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2010-03-17 +// Updated : 2010-03-17 +// Licence : This source is under MIT License +// File : glm/core/func_packing.hpp +/////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_func_packing +#define glm_core_func_packing + +namespace glm +{ + namespace test{ + void main_core_func_packing(); + }//namespace test + + namespace core{ + namespace function{ + //! Define packing functions from section 8.4 floating-point pack and unpack functions of GLSL 4.00.8 specification + namespace packing + { + /// \addtogroup core_funcs + ///@{ + + //! First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values. + //! Then, the results are packed into the returned 32-bit unsigned integer. + //! + //! The conversion for component c of v to fixed point is done as follows: + //! packUnorm2x16: round(clamp(c, 0, +1) * 65535.0) + //! + //! The first component of the vector will be written to the least significant bits of the output; + //! the last component will be written to the most significant bits. + //! + //! \li GLSL packUnorm2x16 man page + //! \li GLSL 4.00.08 specification, section 8.4 + detail::uint32 packUnorm2x16(detail::tvec2 const & v); + + //! First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values. + //! Then, the results are packed into the returned 32-bit unsigned integer. + //! + //! The conversion for component c of v to fixed point is done as follows: + //! packUnorm4x8: round(clamp(c, 0, +1) * 255.0) + //! + //! The first component of the vector will be written to the least significant bits of the output; + //! the last component will be written to the most significant bits. + //! + //! \li GLSL packUnorm4x8 man page + //! \li GLSL 4.00.08 specification, section 8.4 + detail::uint32 packUnorm4x8(detail::tvec4 const & v); + + //! First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values. + //! Then, the results are packed into the returned 32-bit unsigned integer. + //! + //! The conversion for component c of v to fixed point is done as follows: + //! packSnorm4x8: round(clamp(c, -1, +1) * 127.0) + //! + //! The first component of the vector will be written to the least significant bits of the output; + //! the last component will be written to the most significant bits. + //! + //! \li GLSL packSnorm4x8 man page + //! \li GLSL 4.00.08 specification, section 8.4 + detail::uint32 packSnorm4x8(detail::tvec4 const & v); + + //! First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit unsigned integers, four 8-bit unsigned integers, or four 8-bit signed integers. + //! Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector. + //! + //! The conversion for unpacked fixed-point value f to floating point is done as follows: + //! unpackUnorm2x16: f / 65535.0 + //! + //! The first component of the returned vector will be extracted from the least significant bits of the input; + //! the last component will be extracted from the most significant bits. + //! + //! \li GLSL unpackUnorm2x16 man page + //! \li GLSL 4.00.08 specification, section 8.4 + detail::tvec2 unpackUnorm2x16(detail::uint32 const & p); + + //! First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit unsigned integers, four 8-bit unsigned integers, or four 8-bit signed integers. + //! Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector. + //! + //! The conversion for unpacked fixed-point value f to floating point is done as follows: + //! unpackUnorm4x8: f / 255.0 + //! + //! The first component of the returned vector will be extracted from the least significant bits of the input; + //! the last component will be extracted from the most significant bits. + //! + //! \li GLSL unpackUnorm4x8 man page + //! \li GLSL 4.00.08 specification, section 8.4 + detail::tvec4 unpackUnorm4x8(detail::uint32 const & p); + + //! First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit unsigned integers, four 8-bit unsigned integers, or four 8-bit signed integers. + //! Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector. + //! + //! The conversion for unpacked fixed-point value f to floating point is done as follows: + //! unpackSnorm4x8: clamp(f / 127.0, -1, +1) + //! + //! The first component of the returned vector will be extracted from the least significant bits of the input; + //! the last component will be extracted from the most significant bits. + //! + //! \li GLSL unpackSnorm4x8 man page + //! \li GLSL 4.00.08 specification, section 8.4 + detail::tvec4 unpackSnorm4x8(detail::uint32 const & p); + + //! Returns a double-precision value obtained by packing the components of v into a 64-bit value. + //! If an IEEE 754 Inf or NaN is created, it will not signal, and the resulting floating point value is unspecified. + //! Otherwise, the bit- level representation of v is preserved. + //! The first vector component specifies the 32 least significant bits; + //! the second component specifies the 32 most significant bits. + //! + //! \li GLSL packDouble2x32 man page + //! \li GLSL 4.00.08 specification, section 8.4 + double packDouble2x32(detail::tvec2 const & v); + + //! Returns a two-component unsigned integer vector representation of v. + //! The bit-level representation of v is preserved. + //! The first component of the vector contains the 32 least significant bits of the double; + //! the second component consists the 32 most significant bits. + //! + //! \li GLSL unpackDouble2x32 man page + //! \li GLSL 4.00.08 specification, section 8.4 + detail::tvec2 unpackDouble2x32(double const & v); + + ///@} + + }//namespace packing + }//namespace function + }//namespace core + + using namespace core::function::packing; +}//namespace glm + +#include "func_packing.inl" + +#endif//glm_core_func_packing + diff --git a/ExternalLibs/glm/core/func_packing.inl b/ExternalLibs/glm/core/func_packing.inl new file mode 100644 index 0000000..672e67b --- /dev/null +++ b/ExternalLibs/glm/core/func_packing.inl @@ -0,0 +1,94 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2010-03-17 +// Updated : 2010-03-17 +// Licence : This source is under MIT License +// File : glm/core/func_packing.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + namespace detail + { + + }//namespace detail + + namespace core{ + namespace function{ + namespace packing + { + GLM_FUNC_QUALIFIER detail::uint32 packUnorm2x16(detail::tvec2 const & v) + { + detail::uint16 A((detail::uint16)round(clamp(v.x, 0.0f, 1.0f) * 65535.0f)); + detail::uint16 B((detail::uint16)round(clamp(v.y, 0.0f, 1.0f) * 65535.0f)); + return detail::uint32((B << 16) | A); + } + + GLM_FUNC_QUALIFIER detail::uint32 packUnorm4x8(detail::tvec4 const & v) + { + detail::uint8 A((detail::uint8)round(clamp(v.x, 0.0f, 1.0f) * 255.0f)); + detail::uint8 B((detail::uint8)round(clamp(v.y, 0.0f, 1.0f) * 255.0f)); + detail::uint8 C((detail::uint8)round(clamp(v.z, 0.0f, 1.0f) * 255.0f)); + detail::uint8 D((detail::uint8)round(clamp(v.w, 0.0f, 1.0f) * 255.0f)); + return detail::uint32((D << 24) | (C << 16) | (B << 8) | A); + } + + GLM_FUNC_QUALIFIER detail::uint32 packSnorm4x8(detail::tvec4 const & v) + { + detail::uint8 A((detail::uint8)round(clamp(v.x,-1.0f, 1.0f) * 255.0f)); + detail::uint8 B((detail::uint8)round(clamp(v.y,-1.0f, 1.0f) * 255.0f)); + detail::uint8 C((detail::uint8)round(clamp(v.z,-1.0f, 1.0f) * 255.0f)); + detail::uint8 D((detail::uint8)round(clamp(v.w,-1.0f, 1.0f) * 255.0f)); + return detail::uint32((D << 24) | (C << 16) | (B << 8) | A); + } + + GLM_FUNC_QUALIFIER detail::tvec2 unpackUnorm2x16(detail::uint32 const & p) + { + detail::uint16 A(detail::uint16(p >> 0)); + detail::uint16 B(detail::uint16(p >> 16)); + return detail::tvec2( + A * 1.0f / 65535.0f, + B * 1.0f / 65535.0f); + } + + GLM_FUNC_QUALIFIER detail::tvec4 unpackUnorm4x8(detail::uint32 const & p) + { + detail::uint8 A(detail::uint8(p >> 0)); + detail::uint8 B(detail::uint8(p >> 8)); + detail::uint8 C(detail::uint8(p >> 16)); + detail::uint8 D(detail::uint8(p >> 24)); + return detail::tvec4( + A * 1.0f / 255.0f, + B * 1.0f / 255.0f, + C * 1.0f / 255.0f, + D * 1.0f / 255.0f); + } + + GLM_FUNC_QUALIFIER detail::tvec4 unpackSnorm4x8(detail::uint32 const & p) + { + detail::uint8 A(detail::uint8(p >> 0)); + detail::uint8 B(detail::uint8(p >> 8)); + detail::uint8 C(detail::uint8(p >> 16)); + detail::uint8 D(detail::uint8(p >> 24)); + return clamp(detail::tvec4( + A * 1.0f / 127.0f, + B * 1.0f / 127.0f, + C * 1.0f / 127.0f, + D * 1.0f / 127.0f), -1.0f, 1.0f); + } + + GLM_FUNC_QUALIFIER double packDouble2x32(detail::tvec2 const & v) + { + return *(double*)&v; + } + + GLM_FUNC_QUALIFIER detail::tvec2 unpackDouble2x32(double const & v) + { + return *(detail::tvec2*)&v; + } + + }//namespace packing + }//namespace function + }//namespace core +}//namespace glm diff --git a/ExternalLibs/glm/core/func_trigonometric.hpp b/ExternalLibs/glm/core/func_trigonometric.hpp new file mode 100644 index 0000000..34e6257 --- /dev/null +++ b/ExternalLibs/glm/core/func_trigonometric.hpp @@ -0,0 +1,160 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2008-08-01 +// Updated : 2008-09-10 +// Licence : This source is under MIT License +// File : glm/core/func_trigonometric.hpp +/////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_func_trigonometric +#define glm_core_func_trigonometric + +namespace glm +{ + namespace test{ + void main_core_func_trigonometric(); + }//namespace test + + namespace core{ + namespace function{ + //! Define Angle and trigonometry functions + //! from Section 8.1 of GLSL 1.30.8 specification. + //! Included in glm namespace. + namespace trigonometric{ + + /// \addtogroup core_funcs + ///@{ + + //! Converts degrees to radians and returns the result. + //! + //! \li GLSL radians man page + //! \li GLSL 1.30.08 specification, section 8.1 + template + genType radians(genType const & degrees); + + //! Converts radians to degrees and returns the result. + //! + //! \li GLSL degrees man page + //! \li GLSL 1.30.08 specification, section 8.1 + template + genType degrees(genType const & radians); + + //! The standard trigonometric sine function. + //! The values returned by this function will range from [-1, 1]. + //! + //! \li GLSL sin man page + //! \li GLSL 1.30.08 specification, section 8.1 + template + genType sin(genType const & angle); + + //! The standard trigonometric cosine function. + //! The values returned by this function will range from [-1, 1]. + //! + //! \li GLSL cos man page + //! \li GLSL 1.30.08 specification, section 8.1 + template + genType cos(genType const & angle); + + //! The standard trigonometric tangent function. + //! + //! \li GLSL tan man page + //! \li GLSL 1.30.08 specification, section 8.1 + template + genType tan(genType const & angle); + + //! Arc sine. Returns an angle whose sine is x. + //! The range of values returned by this function is [-PI/2, PI/2]. + //! Results are undefined if |x| > 1. + //! + //! \li GLSL asin man page + //! \li GLSL 1.30.08 specification, section 8.1 + template + genType asin(genType const & x); + + //! Arc cosine. Returns an angle whose sine is x. + //! The range of values returned by this function is [0, PI]. + //! Results are undefined if |x| > 1. + //! + //! \li GLSL acos man page + //! \li GLSL 1.30.08 specification, section 8.1 + template + genType acos(genType const & x); + + //! Arc tangent. Returns an angle whose tangent is y/x. + //! The signs of x and y are used to determine what + //! quadrant the angle is in. The range of values returned + //! by this function is [-PI, PI]. Results are undefined + //! if x and y are both 0. + //! + //! \li GLSL atan man page + //! \li GLSL 1.30.08 specification, section 8.1 + template + genType atan(genType const & y, genType const & x); + + //! Arc tangent. Returns an angle whose tangent is y_over_x. + //! The range of values returned by this function is [-PI/2, PI/2]. + //! + //! \li GLSL atan man page + //! \li GLSL 1.30.08 specification, section 8.1 + template + genType atan(genType const & y_over_x); + + //! Returns the hyperbolic sine function, (exp(x) - exp(-x)) / 2 + //! + //! \li GLSL sinh man page + //! \li GLSL 1.30.08 specification, section 8.1 + template + genType sinh(genType const & angle); + + //! Returns the hyperbolic cosine function, (exp(x) + exp(-x)) / 2 + //! + //! \li GLSL cosh man page + //! \li GLSL 1.30.08 specification, section 8.1 + template + genType cosh(genType const & angle); + + //! Returns the hyperbolic tangent function, sinh(angle) / cosh(angle) + //! + //! \li GLSL tanh man page + //! \li GLSL 1.30.08 specification, section 8.1 + template + genType tanh(genType const & angle); + + //! Arc hyperbolic sine; returns the inverse of sinh. + //! + //! \li GLSL asinh man page + //! \li GLSL 1.30.08 specification, section 8.1 + template + genType asinh(genType const & x); + + //! Arc hyperbolic cosine; returns the non-negative inverse + //! of cosh. Results are undefined if x < 1. + //! + //! \li GLSL acosh man page + //! \li GLSL 1.30.08 specification, section 8.1 + template + genType acosh(genType const & x); + + //! Arc hyperbolic tangent; returns the inverse of tanh. + //! Results are undefined if abs(x) >= 1. + //! + //! \li GLSL atanh man page + //! \li GLSL 1.30.08 specification, section 8.1 + template + genType atanh(genType const & x); + + ///@} + + }//namespace trigonometric + }//namespace function + }//namespace core + + using namespace core::function::trigonometric; +}//namespace glm + +#include "func_trigonometric.inl" + +#endif//glm_core_func_trigonometric + + diff --git a/ExternalLibs/glm/core/func_trigonometric.inl b/ExternalLibs/glm/core/func_trigonometric.inl new file mode 100644 index 0000000..0584601 --- /dev/null +++ b/ExternalLibs/glm/core/func_trigonometric.inl @@ -0,0 +1,745 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2008-08-03 +// Updated : 2008-09-14 +// Licence : This source is under MIT License +// File : glm/core/func_trigonometric.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + namespace core{ + namespace function{ + namespace trigonometric{ + + // radians + template + GLM_FUNC_QUALIFIER genType radians + ( + genType const & degrees + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'radians' only accept floating-point input"); + + const genType pi = genType(3.1415926535897932384626433832795); + return degrees * (pi / genType(180)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 radians + ( + detail::tvec2 const & degrees + ) + { + return detail::tvec2( + radians(degrees.x), + radians(degrees.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 radians + ( + detail::tvec3 const & degrees + ) + { + return detail::tvec3( + radians(degrees.x), + radians(degrees.y), + radians(degrees.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 radians + ( + detail::tvec4 const & degrees + ) + { + return detail::tvec4( + radians(degrees.x), + radians(degrees.y), + radians(degrees.z), + radians(degrees.w)); + } + + // degrees + template + GLM_FUNC_QUALIFIER genType degrees + ( + genType const & radians + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'degrees' only accept floating-point input"); + + const genType pi = genType(3.1415926535897932384626433832795); + return radians * (genType(180) / pi); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 degrees + ( + detail::tvec2 const & radians + ) + { + return detail::tvec2( + degrees(radians.x), + degrees(radians.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 degrees + ( + detail::tvec3 const & radians + ) + { + return detail::tvec3( + degrees(radians.x), + degrees(radians.y), + degrees(radians.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 degrees + ( + detail::tvec4 const & radians + ) + { + return detail::tvec4( + degrees(radians.x), + degrees(radians.y), + degrees(radians.z), + degrees(radians.w)); + } + + // sin + template + GLM_FUNC_QUALIFIER genType sin + ( + genType const & angle + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'sin' only accept floating-point input"); + + return ::std::sin(angle); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 sin + ( + detail::tvec2 const & angle + ) + { + return detail::tvec2( + sin(angle.x), + sin(angle.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 sin + ( + detail::tvec3 const & angle + ) + { + return detail::tvec3( + sin(angle.x), + sin(angle.y), + sin(angle.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 sin + ( + detail::tvec4 const & angle + ) + { + return detail::tvec4( + sin(angle.x), + sin(angle.y), + sin(angle.z), + sin(angle.w)); + } + + // cos + template + GLM_FUNC_QUALIFIER genType cos(genType const & angle) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'cos' only accept floating-point input"); + + return ::std::cos(angle); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 cos + ( + detail::tvec2 const & angle + ) + { + return detail::tvec2( + cos(angle.x), + cos(angle.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 cos + ( + detail::tvec3 const & angle + ) + { + return detail::tvec3( + cos(angle.x), + cos(angle.y), + cos(angle.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 cos + ( + detail::tvec4 const & angle + ) + { + return detail::tvec4( + cos(angle.x), + cos(angle.y), + cos(angle.z), + cos(angle.w)); + } + + // tan + template + GLM_FUNC_QUALIFIER genType tan + ( + genType const & angle + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'tan' only accept floating-point input"); + + return ::std::tan(angle); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 tan + ( + detail::tvec2 const & angle + ) + { + return detail::tvec2( + tan(angle.x), + tan(angle.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 tan + ( + detail::tvec3 const & angle + ) + { + return detail::tvec3( + tan(angle.x), + tan(angle.y), + tan(angle.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 tan + ( + detail::tvec4 const & angle + ) + { + return detail::tvec4( + tan(angle.x), + tan(angle.y), + tan(angle.z), + tan(angle.w)); + } + + // asin + template + GLM_FUNC_QUALIFIER genType asin + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'asin' only accept floating-point input"); + + return ::std::asin(x); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 asin + ( + detail::tvec2 const & x + ) + { + return detail::tvec2( + asin(x.x), + asin(x.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 asin + ( + detail::tvec3 const & x + ) + { + return detail::tvec3( + asin(x.x), + asin(x.y), + asin(x.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 asin + ( + detail::tvec4 const & x + ) + { + return detail::tvec4( + asin(x.x), + asin(x.y), + asin(x.z), + asin(x.w)); + } + + // acos + template + GLM_FUNC_QUALIFIER genType acos + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'acos' only accept floating-point input"); + + return ::std::acos(x); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 acos + ( + detail::tvec2 const & x + ) + { + return detail::tvec2( + acos(x.x), + acos(x.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 acos + ( + detail::tvec3 const & x + ) + { + return detail::tvec3( + acos(x.x), + acos(x.y), + acos(x.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 acos + ( + detail::tvec4 const & x + ) + { + return detail::tvec4( + acos(x.x), + acos(x.y), + acos(x.z), + acos(x.w)); + } + + // atan + template + GLM_FUNC_QUALIFIER genType atan + ( + genType const & y, + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'atan' only accept floating-point input"); + + return ::std::atan2(y, x); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 atan + ( + detail::tvec2 const & y, + detail::tvec2 const & x + ) + { + return detail::tvec2( + atan(y.x, x.x), + atan(y.y, x.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 atan + ( + detail::tvec3 const & y, + detail::tvec3 const & x + ) + { + return detail::tvec3( + atan(y.x, x.x), + atan(y.y, x.y), + atan(y.z, x.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 atan + ( + detail::tvec4 const & y, + detail::tvec4 const & x + ) + { + return detail::tvec4( + atan(y.x, x.x), + atan(y.y, x.y), + atan(y.z, x.z), + atan(y.w, x.w)); + } + + template + GLM_FUNC_QUALIFIER genType atan + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'atan' only accept floating-point input"); + + return ::std::atan(x); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 atan + ( + detail::tvec2 const & x + ) + { + return detail::tvec2( + atan(x.x), + atan(x.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 atan + ( + detail::tvec3 const & x + ) + { + return detail::tvec3( + atan(x.x), + atan(x.y), + atan(x.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 atan + ( + detail::tvec4 const & x + ) + { + return detail::tvec4( + atan(x.x), + atan(x.y), + atan(x.z), + atan(x.w)); + } + + // sinh + template + GLM_FUNC_QUALIFIER genType sinh + ( + genType const & angle + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'sinh' only accept floating-point input"); + + return std::sinh(angle); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 sinh + ( + detail::tvec2 const & angle + ) + { + return detail::tvec2( + sinh(angle.x), + sinh(angle.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 sinh + ( + detail::tvec3 const & angle + ) + { + return detail::tvec3( + sinh(angle.x), + sinh(angle.y), + sinh(angle.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 sinh + ( + detail::tvec4 const & angle + ) + { + return detail::tvec4( + sinh(angle.x), + sinh(angle.y), + sinh(angle.z), + sinh(angle.w)); + } + + // cosh + template + GLM_FUNC_QUALIFIER genType cosh + ( + genType const & angle + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'cosh' only accept floating-point input"); + + return std::cosh(angle); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 cosh + ( + detail::tvec2 const & angle + ) + { + return detail::tvec2( + cosh(angle.x), + cosh(angle.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 cosh + ( + detail::tvec3 const & angle + ) + { + return detail::tvec3( + cosh(angle.x), + cosh(angle.y), + cosh(angle.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 cosh + ( + detail::tvec4 const & angle + ) + { + return detail::tvec4( + cosh(angle.x), + cosh(angle.y), + cosh(angle.z), + cosh(angle.w)); + } + + // tanh + template + GLM_FUNC_QUALIFIER genType tanh + ( + genType const & angle + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'tanh' only accept floating-point input"); + + return std::tanh(angle); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 tanh + ( + detail::tvec2 const & angle + ) + { + return detail::tvec2( + tanh(angle.x), + tanh(angle.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 tanh + ( + detail::tvec3 const & angle + ) + { + return detail::tvec3( + tanh(angle.x), + tanh(angle.y), + tanh(angle.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 tanh + ( + detail::tvec4 const & angle + ) + { + return detail::tvec4( + tanh(angle.x), + tanh(angle.y), + tanh(angle.z), + tanh(angle.w)); + } + + // asinh + template + GLM_FUNC_QUALIFIER genType asinh + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'asinh' only accept floating-point input"); + + return (x < genType(0) ? genType(-1) : (x > genType(0) ? genType(1) : genType(0))) * log(abs(x) + sqrt(genType(1) + x * x)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 asinh + ( + detail::tvec2 const & x + ) + { + return detail::tvec2( + asinh(x.x), + asinh(x.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 asinh + ( + detail::tvec3 const & x + ) + { + return detail::tvec3( + asinh(x.x), + asinh(x.y), + asinh(x.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 asinh + ( + detail::tvec4 const & x + ) + { + return detail::tvec4( + asinh(x.x), + asinh(x.y), + asinh(x.z), + asinh(x.w)); + } + + // acosh + template + GLM_FUNC_QUALIFIER genType acosh + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'acosh' only accept floating-point input"); + + if(x < genType(1)) + return genType(0); + return log(x + sqrt(x * x - genType(1))); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 acosh + ( + detail::tvec2 const & x + ) + { + return detail::tvec2( + acosh(x.x), + acosh(x.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 acosh + ( + detail::tvec3 const & x + ) + { + return detail::tvec3( + acosh(x.x), + acosh(x.y), + acosh(x.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 acosh + ( + detail::tvec4 const & x + ) + { + return detail::tvec4( + acosh(x.x), + acosh(x.y), + acosh(x.z), + acosh(x.w)); + } + + // atanh + template + GLM_FUNC_QUALIFIER genType atanh + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'atanh' only accept floating-point input"); + + if(abs(x) >= genType(1)) + return 0; + return genType(0.5) * log((genType(1) + x) / (genType(1) - x)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 atanh + ( + detail::tvec2 const & x + ) + { + return detail::tvec2( + atanh(x.x), + atanh(x.y)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 atanh + ( + detail::tvec3 const & x + ) + { + return detail::tvec3( + atanh(x.x), + atanh(x.y), + atanh(x.z)); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 atanh + ( + detail::tvec4 const & x + ) + { + return detail::tvec4( + atanh(x.x), + atanh(x.y), + atanh(x.z), + atanh(x.w)); + } + + }//namespace trigonometric + }//namespace function + }//namespace core +}//namespace glm diff --git a/ExternalLibs/glm/core/func_vector_relational.hpp b/ExternalLibs/glm/core/func_vector_relational.hpp new file mode 100644 index 0000000..d290def --- /dev/null +++ b/ExternalLibs/glm/core/func_vector_relational.hpp @@ -0,0 +1,219 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2008-08-03 +// Updated : 2008-09-09 +// Licence : This source is under MIT License +// File : glm/core/func_vector_relational.hpp +/////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_func_vector_relational +#define glm_core_func_vector_relational + +#include "_detail.hpp" + +namespace glm +{ + namespace test{ + void main_core_func_vector_relational(); + }//namespace test + + namespace core{ + namespace function{ + //! Define vector relational functions from Section 8.6 of GLSL 1.30.8 specification. + //! Included in glm namespace. + namespace vector_relational + { + /// \addtogroup core_funcs + ///@{ + + //! Returns the component-wise comparison result of x < y. + //! + //! \li GLSL lessThan man page + //! \li GLSL 1.30.08 specification, section 8.6 + template class vecType> + GLM_FUNC_QUALIFIER typename vecType::bool_type lessThan + ( + vecType const & x, + vecType const & y + ) + { + GLM_STATIC_ASSERT(detail::is_vector >::_YES, + "Invalid template instantiation of 'lessThan', GLM vector types required"); + GLM_STATIC_ASSERT(detail::is_bool::_NO, + "Invalid template instantiation of 'lessThan', GLM vector types required floating-point or integer value types vectors"); + + typename vecType::bool_type Result(vecType::null); + for(typename vecType::size_type i = 0; i < vecType::value_size(); ++i) + Result[i] = x[i] < y[i]; + + return Result; + } + + //! Returns the component-wise comparison of result x <= y. + //! + //! \li GLSL lessThanEqual man page + //! \li GLSL 1.30.08 specification, section 8.6 + template class vecType> + GLM_FUNC_QUALIFIER typename vecType::bool_type lessThanEqual + ( + vecType const & x, + vecType const & y + ) + { + GLM_STATIC_ASSERT(detail::is_vector >::_YES, + "Invalid template instantiation of 'lessThanEqual', GLM vector types required"); + GLM_STATIC_ASSERT(detail::is_bool::_NO, + "Invalid template instantiation of 'lessThanEqual', GLM vector types required floating-point or integer value types vectors"); + + typename vecType::bool_type Result(vecType::null); + for(typename vecType::size_type i = 0; i < vecType::value_size(); ++i) + Result[i] = x[i] <= y[i]; + return Result; + } + + //! Returns the component-wise comparison of result x > y. + //! + //! \li GLSL greaterThan man page + //! \li GLSL 1.30.08 specification, section 8.6 + template class vecType> + GLM_FUNC_QUALIFIER typename vecType::bool_type greaterThan + ( + vecType const & x, + vecType const & y + ) + { + GLM_STATIC_ASSERT(detail::is_vector >::_YES, + "Invalid template instantiation of 'greaterThan', GLM vector types required"); + GLM_STATIC_ASSERT(detail::is_bool::_NO, + "Invalid template instantiation of 'greaterThan', GLM vector types required floating-point or integer value types vectors"); + + typename vecType::bool_type Result(vecType::null); + for(typename vecType::size_type i = 0; i < vecType::value_size(); ++i) + Result[i] = x[i] > y[i]; + return Result; + } + + //! Returns the component-wise comparison of result x >= y. + //! + //! \li GLSL greaterThanEqual man page + //! \li GLSL 1.30.08 specification, section 8.6 + template class vecType> + GLM_FUNC_QUALIFIER typename vecType::bool_type greaterThanEqual + ( + vecType const & x, + vecType const & y + ) + { + GLM_STATIC_ASSERT(detail::is_vector >::_YES, + "Invalid template instantiation of 'greaterThanEqual', GLM vector types required"); + GLM_STATIC_ASSERT(detail::is_bool::_NO, + "Invalid template instantiation of 'greaterThanEqual', GLM vector types required floating-point or integer value types vectors"); + + typename vecType::bool_type Result(vecType::null); + for(typename vecType::size_type i = 0; i < vecType::value_size(); ++i) + Result[i] = x[i] >= y[i]; + return Result; + } + + //! Returns the component-wise comparison of result x == y. + //! + //! \li GLSL equal man page + //! \li GLSL 1.30.08 specification, section 8.6 + template class vecType> + GLM_FUNC_QUALIFIER typename vecType::bool_type equal + ( + vecType const & x, + vecType const & y + ) + { + GLM_STATIC_ASSERT(detail::is_vector >::_YES, + "Invalid template instantiation of 'equal', GLM vector types required"); + + typename vecType::bool_type Result(vecType::null); + for(typename vecType::size_type i = 0; i < vecType::value_size(); ++i) + Result[i] = x[i] == y[i]; + return Result; + } + + //! Returns the component-wise comparison of result x != y. + //! + //! \li GLSL notEqual man page + //! \li GLSL 1.30.08 specification, section 8.6 + template class vecType> + GLM_FUNC_QUALIFIER typename vecType::bool_type notEqual + ( + vecType const & x, + vecType const & y + ) + { + GLM_STATIC_ASSERT(detail::is_vector >::_YES, + "Invalid template instantiation of 'notEqual', GLM vector types required"); + + typename vecType::bool_type Result(vecType::null); + for(typename vecType::size_type i = 0; i < vecType::value_size(); ++i) + Result[i] = x[i] != y[i]; + return Result; + } + + //! Returns true if any component of x is true. + //! + //! \li GLSL any man page + //! \li GLSL 1.30.08 specification, section 8.6 + template