[1378] | 1 | #include "dxstdafx.h"
|
---|
| 2 | #include ".\sprite.h"
|
---|
| 3 | #include "Scene.h"
|
---|
| 4 | #include "GameManager.h"
|
---|
| 5 | #include "ResourceManager.h"
|
---|
| 6 |
|
---|
| 7 | Sprite::Sprite(void) : Node()
|
---|
| 8 | {
|
---|
| 9 | this->firstTime = true;
|
---|
| 10 | this->lookAtCamera = true;
|
---|
| 11 | this->rightVec.setXYZ(1, 0, 0);
|
---|
| 12 | this->upVec.setXYZ(0, 1, 0);
|
---|
| 13 | this->activeFrame = 0;
|
---|
| 14 | this->nbFrames = 1;
|
---|
| 15 | this->animationDuration = 0;
|
---|
| 16 | this->maxDuration = 0;
|
---|
| 17 | this->nbRows = 1;
|
---|
| 18 | this->nbColumns = 1;
|
---|
| 19 | this->invRows = 1;
|
---|
| 20 | this->invColumns = 1;
|
---|
| 21 | this->loopAnimation = true;
|
---|
| 22 | this->invFps = 1;
|
---|
| 23 | this->fps = 1;
|
---|
| 24 | this->sphereSizeFactor = 1;
|
---|
| 25 | for(int i=0;i<3;i++) {
|
---|
| 26 | for(int j=0;j<7;j++) {
|
---|
| 27 | this->keyFrame[i][j] = 1;
|
---|
| 28 | currentValues[j] = 1;
|
---|
| 29 | }
|
---|
| 30 | }
|
---|
| 31 | this->halfWidth = 1;
|
---|
| 32 | this->halfHeight = 1;
|
---|
| 33 | this->keyFrame[Sprite::KEY_START][KF_TIME] = 0;
|
---|
| 34 | this->keyFrame[Sprite::KEY_MIDDLE][KF_TIME] = 0.5;
|
---|
| 35 | this->firstRendering = true;
|
---|
| 36 | this->nodeType |= Scene::NODE_SPRITE;
|
---|
| 37 | this->animatedSprite = false;
|
---|
| 38 | this->textureName = "";
|
---|
| 39 | this->alpha = 1;
|
---|
| 40 | this->firstRendering = true;
|
---|
| 41 | this->texture = NULL;
|
---|
| 42 |
|
---|
| 43 | }
|
---|
| 44 |
|
---|
| 45 | Sprite::~Sprite(void)
|
---|
| 46 | {
|
---|
| 47 | }
|
---|
| 48 |
|
---|
| 49 | void Sprite::setDimension(float _width, float _height)
|
---|
| 50 | {
|
---|
| 51 | this->halfWidth = _width/2;
|
---|
| 52 | this->halfHeight = _height/2;
|
---|
| 53 |
|
---|
| 54 | for(int i=0;i<3;i++) {
|
---|
| 55 | this->keyFrame[i][Sprite::KF_HWIDTH] = this->halfWidth;
|
---|
| 56 | this->keyFrame[i][Sprite::KF_HHEIGHT] = this->halfHeight;
|
---|
| 57 | }
|
---|
| 58 |
|
---|
| 59 | this->minAABBox.x = -this->halfWidth;
|
---|
| 60 | this->maxAABBox.x = this->halfWidth;
|
---|
| 61 |
|
---|
| 62 | this->minAABBox.y = -this->halfWidth;
|
---|
| 63 | this->maxAABBox.y = this->halfWidth;
|
---|
| 64 |
|
---|
| 65 | this->minAABBox.z = -0.5;
|
---|
| 66 | this->maxAABBox.z = 0.5;
|
---|
| 67 | }
|
---|
| 68 |
|
---|
| 69 | void Sprite::update(float dt)
|
---|
| 70 | {
|
---|
| 71 | Node::update(dt);
|
---|
| 72 |
|
---|
| 73 | if(!this->firstRendering) {
|
---|
| 74 | this->calcCurrentValues(this->maxAge - this->timeToLive);
|
---|
| 75 |
|
---|
| 76 | if(this->animatedSprite) {
|
---|
| 77 | //Calculate activeFrame
|
---|
| 78 | this->animationDuration+=dt;
|
---|
| 79 | if(this->loopAnimation) {
|
---|
| 80 | if(this->animationDuration>this->maxDuration)
|
---|
| 81 | this->animationDuration-=this->maxDuration;
|
---|
| 82 | } else {
|
---|
| 83 | this->animationDuration = this->maxDuration;
|
---|
| 84 | }
|
---|
| 85 |
|
---|
| 86 | this->activeFrame = (int) (this->animationDuration*this->fps);
|
---|
| 87 | } else {
|
---|
| 88 | this->maxDuration = (float) this->nbFrames*this->invFps;
|
---|
| 89 | this->maxDuration++;
|
---|
| 90 | }
|
---|
| 91 | }
|
---|
| 92 | }
|
---|
| 93 |
|
---|
| 94 | void Sprite::generatePhysicMesh(int type)
|
---|
| 95 | {
|
---|
| 96 | sphereDesc.radius = (this->halfHeight>this->halfWidth) ? this->halfHeight*this->sphereSizeFactor : this->halfWidth*this->sphereSizeFactor;
|
---|
| 97 | this->pActorDesc.shapes.pushBack(&sphereDesc);
|
---|
| 98 | }
|
---|
| 99 |
|
---|
| 100 | Node* Sprite::clone()
|
---|
| 101 | {
|
---|
| 102 | Sprite* obj = (Sprite*) this->myScene->createNode(Scene::NODE_SPRITE,*this->father, true, false);
|
---|
| 103 | this->cloneChildren(obj);
|
---|
| 104 |
|
---|
| 105 | obj->lookAtCamera = this->lookAtCamera;
|
---|
| 106 | obj->halfWidth = this->halfWidth;
|
---|
| 107 | obj->halfHeight = this->halfHeight;
|
---|
| 108 | obj->rightVec = this->rightVec;
|
---|
| 109 | obj->upVec = this->upVec;
|
---|
| 110 | obj->setAlpha(this->alpha);
|
---|
| 111 | obj->setRowColumnCount(this->nbRows, this->nbColumns);
|
---|
| 112 | obj->setFPS(this->fps);
|
---|
| 113 | obj->setFrameCount(this->nbFrames);
|
---|
| 114 | obj->setTexture(this->textureName);
|
---|
| 115 | obj->setDimension(2*this->halfWidth, 2*this->halfHeight);
|
---|
| 116 | obj->setTimeToLive(this->timeToLive);
|
---|
| 117 | obj->userData = this->userData;
|
---|
| 118 | for(int i=0;i<3;i++) {
|
---|
| 119 | for(int j=0;j<7;j++) {
|
---|
| 120 | obj->keyFrame[i][j] = this->keyFrame[i][j];
|
---|
| 121 | }
|
---|
| 122 | }
|
---|
| 123 | obj->animatedSprite = this->animatedSprite;
|
---|
| 124 |
|
---|
| 125 | obj->pActorDesc = this->pActorDesc;
|
---|
| 126 | obj->pBodyDesc = this->pBodyDesc;
|
---|
| 127 | obj->pActorDesc.body = &obj->pBodyDesc;
|
---|
| 128 |
|
---|
| 129 | obj->pActorDesc.shapes.clear();
|
---|
| 130 | obj->sphereDesc.radius = this->sphereDesc.radius;
|
---|
| 131 | obj->pActorDesc.shapes.pushBack(&obj->sphereDesc);
|
---|
| 132 | return obj;
|
---|
| 133 | }
|
---|
| 134 |
|
---|
| 135 | void Sprite::setLookAtCamera(bool _lookAtCamera)
|
---|
| 136 | {
|
---|
| 137 | this->lookAtCamera = _lookAtCamera;
|
---|
| 138 | }
|
---|
| 139 |
|
---|
| 140 | void Sprite::calcPhysicWorldMatrix(D3DXMATRIX &pMatWorld)
|
---|
| 141 | {
|
---|
| 142 | if(this->lookAtCamera) {
|
---|
| 143 | if(this->pActor!=NULL) {
|
---|
| 144 | NxVec3 vec = this->pActor->getGlobalPosition();
|
---|
| 145 | D3DXMatrixTranslation(&this->myWorldMatrix, vec.x, vec.y, vec.z);
|
---|
| 146 | }
|
---|
| 147 | } else {
|
---|
| 148 | Node::calcPhysicWorldMatrix(pMatWorld);
|
---|
| 149 | }
|
---|
| 150 | }
|
---|
| 151 |
|
---|
| 152 | void Sprite::setTexture(std::string _textureName)
|
---|
| 153 | {
|
---|
| 154 | this->textureName = _textureName;
|
---|
| 155 | this->texture = this->myScene->manager->resManager.loadTexture(this->textureName);
|
---|
| 156 | }
|
---|
| 157 |
|
---|
| 158 | void Sprite::setAlpha(float _alpha)
|
---|
| 159 | {
|
---|
| 160 | this->alpha = _alpha;
|
---|
| 161 | if(this->hasRenderer() && this->alpha!=1) {
|
---|
| 162 | SimpleMeshRenderer* r = (SimpleMeshRenderer*) this->myRenderer.get();
|
---|
| 163 | r->enableAlphaBlending(true);
|
---|
| 164 | }
|
---|
| 165 | }
|
---|
| 166 |
|
---|
| 167 | float Sprite::getMinDim() {
|
---|
| 168 | return min(this->halfWidth, this->halfHeight);
|
---|
| 169 | }
|
---|
| 170 |
|
---|
| 171 | void Sprite::setFPS(int _fps)
|
---|
| 172 | {
|
---|
| 173 | this->animatedSprite = true;
|
---|
| 174 | this->invFps = (float) 1.0f/_fps;
|
---|
| 175 | this->fps = _fps;
|
---|
| 176 | }
|
---|
| 177 |
|
---|
| 178 | void Sprite::setFrameCount(int _frameCount)
|
---|
| 179 | {
|
---|
| 180 | this->animatedSprite = true;
|
---|
| 181 | this->nbFrames = _frameCount;
|
---|
| 182 | }
|
---|
| 183 |
|
---|
| 184 | void Sprite::setRowColumnCount(int _nbRows, int _nbColumns)
|
---|
| 185 | {
|
---|
| 186 | this->animatedSprite = true;
|
---|
| 187 | this->nbRows = _nbRows;
|
---|
| 188 | this->nbColumns = _nbColumns;
|
---|
| 189 | this->invRows = (float) 1/this->nbRows;
|
---|
| 190 | this->invColumns = (float) 1/this->nbColumns;
|
---|
| 191 | }
|
---|
| 192 |
|
---|
| 193 | void Sprite::setLoopAnimation(bool _loopAnimation)
|
---|
| 194 | {
|
---|
| 195 | this->animatedSprite = true;
|
---|
| 196 | this->loopAnimation = _loopAnimation;
|
---|
| 197 | }
|
---|
| 198 |
|
---|
| 199 | void Sprite::setSphereSizeFactor(float _sphereSizeFactor)
|
---|
| 200 | {
|
---|
| 201 | this->sphereSizeFactor = _sphereSizeFactor;
|
---|
| 202 | }
|
---|
| 203 |
|
---|
| 204 | void Sprite::setKeyFrame(int _keyFrame, float alpha, float red, float green, float blue, float width, float height, float time)
|
---|
| 205 | {
|
---|
| 206 | this->keyFrame[_keyFrame][Sprite::KF_ALPHA] = alpha;
|
---|
| 207 | this->keyFrame[_keyFrame][Sprite::KF_RED] = red;
|
---|
| 208 | this->keyFrame[_keyFrame][Sprite::KF_GREEN] = green;
|
---|
| 209 | this->keyFrame[_keyFrame][Sprite::KF_BLUE] = blue;
|
---|
| 210 | this->keyFrame[_keyFrame][Sprite::KF_HWIDTH] = width/2;
|
---|
| 211 | this->keyFrame[_keyFrame][Sprite::KF_HHEIGHT] = height/2;
|
---|
| 212 | this->keyFrame[_keyFrame][Sprite::KF_TIME] = time;
|
---|
| 213 | }
|
---|
| 214 |
|
---|
| 215 | void Sprite::calcCurrentValues(float age) {
|
---|
| 216 | int sid;
|
---|
| 217 | int eid;
|
---|
| 218 | float fadeFactor = age/this->maxAge;
|
---|
| 219 | if(fadeFactor < this->keyFrame[Sprite::KEY_MIDDLE][KF_TIME]) {
|
---|
| 220 | //interpolate between start - middle
|
---|
| 221 | sid = KEY_START;
|
---|
| 222 | eid = KEY_MIDDLE;
|
---|
| 223 | fadeFactor = fadeFactor/this->keyFrame[Sprite::KEY_MIDDLE][KF_TIME];
|
---|
| 224 | } else {
|
---|
| 225 | //interpolate between middle - end
|
---|
| 226 | sid = KEY_MIDDLE;
|
---|
| 227 | eid = KEY_END;
|
---|
| 228 | fadeFactor = (fadeFactor-this->keyFrame[Sprite::KEY_MIDDLE][KF_TIME])/(1-this->keyFrame[Sprite::KEY_MIDDLE][KF_TIME]);
|
---|
| 229 | }
|
---|
| 230 | fadeFactor = (fadeFactor>1) ? 1 : fadeFactor;
|
---|
| 231 | for(int i=0;i<7;i++) {
|
---|
| 232 | this->currentValues[i] = (1-fadeFactor)*this->keyFrame[sid][i] + fadeFactor*this->keyFrame[eid][i];
|
---|
| 233 | }
|
---|
| 234 | this->currentValues[Sprite::KF_ALPHA] = max(0.0f, this->currentValues[Sprite::KF_ALPHA]);
|
---|
| 235 | this->halfWidth = this->currentValues[Sprite::KF_HWIDTH];
|
---|
| 236 | this->halfHeight = this->currentValues[Sprite::KF_HHEIGHT];
|
---|
| 237 | } |
---|