void Camera::lookAt(const Vec3& lookAtPos, const Vec3& up) { Vec3 upv = up; upv.normalize(); Vec3 zaxis; Vec3::subtract(this->getPosition3D(), lookAtPos, &zaxis); zaxis.normalize(); Vec3 xaxis; Vec3::cross(upv, zaxis, &xaxis); xaxis.normalize(); Vec3 yaxis; Vec3::cross(zaxis, xaxis, &yaxis); yaxis.normalize(); Mat4 rotation; rotation.m[0] = xaxis.x; rotation.m[1] = xaxis.y; rotation.m[2] = xaxis.z; rotation.m[3] = 0; rotation.m[4] = yaxis.x; rotation.m[5] = yaxis.y; rotation.m[6] = yaxis.z; rotation.m[7] = 0; rotation.m[8] = zaxis.x; rotation.m[9] = zaxis.y; rotation.m[10] = zaxis.z; rotation.m[11] = 0; Quaternion quaternion; Quaternion::createFromRotationMatrix(rotation,&quaternion); quaternion.normalize(); setRotationQuat(quaternion); }
Sprite3D* Sprite3D::createSprite3DNode(NodeData* nodedata,ModelData* modeldata,const MaterialDatas& materialdatas) { auto sprite = new (std::nothrow) Sprite3D(); if (sprite) { sprite->setName(nodedata->id); auto mesh = Mesh::create(nodedata->id, getMeshIndexData(modeldata->subMeshId)); if (modeldata->matrialId == "" && materialdatas.materials.size()) { const NTextureData* textureData = materialdatas.materials[0].getTextureData(NTextureData::Usage::Diffuse); if (!textureData->filename.empty()) mesh->setTexture(textureData->filename); } else { const NMaterialData* materialData=materialdatas.getMaterialData(modeldata->matrialId); if(materialData) { const NTextureData* textureData = materialData->getTextureData(NTextureData::Usage::Diffuse); if(textureData && !textureData->filename.empty()) { auto tex = Director::getInstance()->getTextureCache()->addImage(textureData->filename); if(tex) { Texture2D::TexParams texParams; texParams.minFilter = GL_LINEAR; texParams.magFilter = GL_LINEAR; texParams.wrapS = textureData->wrapS; texParams.wrapT = textureData->wrapT; tex->setTexParameters(texParams); mesh->setTexture(tex); mesh->_isTransparent = (materialData->getTextureData(NTextureData::Usage::Transparency) != nullptr); } } } } // set locale transform Vec3 pos; Quaternion qua; Vec3 scale; nodedata->transform.decompose(&scale, &qua, &pos); sprite->setPosition3D(pos); sprite->setRotationQuat(qua); sprite->setScaleX(scale.x); sprite->setScaleY(scale.y); sprite->setScaleZ(scale.z); sprite->addMesh(mesh); sprite->autorelease(); sprite->genGLProgramState(); } return sprite; }
void PUParticleSystem3D::processParticle( ParticlePool &pool, bool &firstActiveParticle, bool &firstParticle, float elapsedTime ) { PUParticle3D *particle = static_cast<PUParticle3D *>(pool.getFirst()); //Mat4 ltow = getNodeToWorldTransform(); //Vec3 scl; //Quaternion rot; //ltow.decompose(&scl, &rot, nullptr); while (particle){ if (!isExpired(particle, elapsedTime)){ particle->process(elapsedTime); //if (_emitter && _emitter->isEnabled()) // _emitter->updateEmitter(particle, elapsedTime); for (auto it : _emitters) { if (it->isEnabled() && !it->isMarkedForEmission()){ (static_cast<PUEmitter*>(it))->updateEmitter(particle, elapsedTime); } } for (auto& it : _affectors) { if (it->isEnabled()){ (static_cast<PUAffector*>(it))->process(particle, elapsedTime, firstActiveParticle); } } if (_render) static_cast<PURender *>(_render)->updateRender(particle, elapsedTime, firstActiveParticle); if (_isEnabled && particle->particleType != PUParticle3D::PT_VISUAL){ if (particle->particleType == PUParticle3D::PT_EMITTER){ auto emitter = static_cast<PUEmitter *>(particle->particleEntityPtr); emitter->setLocalPosition(particle->position); executeEmitParticles(emitter, emitter->calculateRequestedParticles(elapsedTime), elapsedTime); }else if (particle->particleType == PUParticle3D::PT_TECHNIQUE){ auto system = static_cast<PUParticleSystem3D *>(particle->particleEntityPtr); system->setPosition3D(particle->position); system->setRotationQuat(particle->orientation); //system->setScaleX(scl.x);system->setScaleY(scl.y);system->setScaleZ(scl.z); system->forceUpdate(elapsedTime); } } firstActiveParticle = false; // Keep latest position particle->latestPosition = particle->position; //if (_maxVelocitySet && particle->calculateVelocity() > _maxVelocity) //{ // particle->direction *= (_maxVelocity / particle->direction.length()); //} //// Update the position with the direction. //particle->position += (particle->direction * _particleSystemScaleVelocity * elapsedTime); //particle->positionInWorld = particle->position; //particle->orientationInWorld = particle->orientation; //particle->widthInWorld = particle->width; //particle->heightInWorld = particle->height; //particle->depthInWorld = particle->depth; //bool keepLocal = _keepLocal; //PUParticleSystem3D *parent = dynamic_cast<PUParticleSystem3D *>(getParent()); //if (parent) keepLocal = keepLocal || parent->isKeepLocal(); //if (keepLocal){ // ltow.transformPoint(particle->positionInWorld, &particle->positionInWorld); // Vec3 ori; // ltow.transformVector(Vec3(particle->orientation.x, particle->orientation.y, particle->orientation.z), &ori); // particle->orientationInWorld.x = ori.x; particle->orientationInWorld.y = ori.y; particle->orientationInWorld.z = ori.z; // particle->widthInWorld = scl.x * particle->width; // particle->heightInWorld = scl.y * particle->height; // particle->depthInWorld = scl.z * particle->depth; //} processMotion(particle, elapsedTime, firstActiveParticle); } else{ initParticleForExpiration(particle, elapsedTime); pool.lockLatestData(); } for (auto it : _observers){ if (it->isEnabled()){ it->updateObserver(particle, elapsedTime, firstParticle); } } if (particle->hasEventFlags(PUParticle3D::PEF_EXPIRED)) { particle->setEventFlags(0); particle->addEventFlags(PUParticle3D::PEF_EXPIRED); } else { particle->setEventFlags(0); } particle->timeToLive -= elapsedTime; firstParticle = false; particle = static_cast<PUParticle3D *>(pool.getNext()); } }
void Camera::setRotationQuat( float x, float y, float z, float w ) { setRotationQuat( DirectX::XMFLOAT4( x,y,z,w) ); }
void Sprite3D::createNode(NodeData* nodedata, Node* root, const MaterialDatas& materialdatas, bool singleSprite) { Node* node=nullptr; for(const auto& it : nodedata->modelNodeDatas) { if(it) { if(it->bones.size() > 0 || singleSprite) { if(singleSprite && root!=nullptr) root->setName(nodedata->id); auto mesh = Mesh::create(nodedata->id, getMeshIndexData(it->subMeshId)); if(mesh) { _meshes.pushBack(mesh); if (_skeleton && it->bones.size()) { auto skin = MeshSkin::create(_skeleton, it->bones, it->invBindPose); mesh->setSkin(skin); } mesh->_visibleChanged = std::bind(&Sprite3D::onAABBDirty, this); if (it->matrialId == "" && materialdatas.materials.size()) { const NTextureData* textureData = materialdatas.materials[0].getTextureData(NTextureData::Usage::Diffuse); mesh->setTexture(textureData->filename); } else { const NMaterialData* materialData=materialdatas.getMaterialData(it->matrialId); if(materialData) { const NTextureData* textureData = materialData->getTextureData(NTextureData::Usage::Diffuse); if(textureData && !textureData->filename.empty()) { auto tex = Director::getInstance()->getTextureCache()->addImage(textureData->filename); if(tex) { Texture2D::TexParams texParams; texParams.minFilter = GL_LINEAR; texParams.magFilter = GL_LINEAR; texParams.wrapS = textureData->wrapS; texParams.wrapT = textureData->wrapT; tex->setTexParameters(texParams); mesh->setTexture(tex); mesh->_isTransparent = (materialData->getTextureData(NTextureData::Usage::Transparency) != nullptr); } } } } Vec3 pos; Quaternion qua; Vec3 scale; nodedata->transform.decompose(&scale, &qua, &pos); setPosition3D(pos); setRotationQuat(qua); setScaleX(scale.x); setScaleY(scale.y); setScaleZ(scale.z); } } else { auto sprite = createSprite3DNode(nodedata,it,materialdatas); if (sprite) { if(root) { root->addChild(sprite); } } node=sprite; } } } if(nodedata->modelNodeDatas.size() ==0 ) { node= Node::create(); if(node) { node->setName(nodedata->id); // set locale transform Vec3 pos; Quaternion qua; Vec3 scale; nodedata->transform.decompose(&scale, &qua, &pos); node->setPosition3D(pos); node->setRotationQuat(qua); node->setScaleX(scale.x); node->setScaleY(scale.y); node->setScaleZ(scale.z); if(root) { root->addChild(node); } } } for(const auto& it : nodedata->children) { createNode(it,node, materialdatas, nodedata->children.size() == 1); } }