void GLIndexArray::compile() { m_IsCompiled = true; if (0 != m_InternalIndexArray && m_InternalIndexArray->size() != 0) { std::shared_ptr<std::vector<unsigned int>> pArray; if (m_UseAdjacency) { buildAdjacencyList(); pArray = m_AdjIndexArray; } else pArray = m_InternalIndexArray; IBuffer *b = NULL; if (m_GLBuffer == 0) { b = RESOURCEMANAGER->createBuffer(m_Name); b->setStructure(std::vector < Enums::DataType > {Enums::UINT}); m_GLBuffer = b->getPropi(IBuffer::ID); } else { b = RESOURCEMANAGER->getBuffer(m_Name); } b->setData(pArray->size() * sizeof(unsigned int), &(*pArray)[0]); //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_GLBuffer); //glBufferData(GL_ELEMENT_ARRAY_BUFFER, pArray->size() * sizeof(unsigned int), &(*pArray)[0], GL_STATIC_DRAW); //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); //b->setPropui(IBuffer::SIZE, pArray->size() * sizeof(unsigned int)); } }
bool GLVertexArray::compile (void) { if (m_IsCompiled) return false; m_IsCompiled = true; for (int i = 0; i < VertexData::MaxAttribs; i++){ if (0 != m_InternalArrays[i] && m_InternalArrays[i]->size() != 0){ std::shared_ptr<std::vector<VertexData::Attr>> &pArray = m_InternalArrays[i]; IBuffer *b = NULL; std::string s = m_Name + ":" + VertexData::Syntax[i]; if (m_GLBuffers[i] == 0) { b = RESOURCEMANAGER->createBuffer(s); b->setStructure(std::vector < Enums::DataType > {Enums::FLOAT, Enums::FLOAT, Enums::FLOAT, Enums::FLOAT}); m_GLBuffers[i] = b->getPropi(IBuffer::ID); } else { b = RESOURCEMANAGER->getBuffer(s); } b->setData(pArray->size() * 4 * sizeof(float), (float*)&(*pArray)[0]); } } return true; }
void PhysicsManager::addScene(nau::scene::IScene *aScene, const std::string &matName) { if (!m_PhysInst) return; m_Scenes[aScene] = matName; std::string sn = aScene->getName(); PhysicsMaterial &pm = getMaterial(matName); IPhysics::SceneType type = (IPhysics::SceneType)pm.getPrope(PhysicsMaterial::SCENE_TYPE); IPhysics::SceneShape shape = (IPhysics::SceneShape)pm.getPrope(PhysicsMaterial::SCENE_SHAPE); m_PhysInst->setSceneType(sn, type); float * max = new float[3](); float * min = new float[3](); vec3 maxVec = aScene->getBoundingVolume().getMax(); vec3 minVec = aScene->getBoundingVolume().getMin(); max[0] = maxVec.x; max[1] = maxVec.y; max[2] = maxVec.z; min[0] = minVec.x; min[1] = minVec.y; min[2] = minVec.z; m_PhysInst->setSceneShape(sn, shape, min, max); m_PhysInst->setSceneCondition(sn, (IPhysics::SceneCondition)pm.getPrope(PhysicsMaterial::SCENE_CONDITION)); switch (type) { case IPhysics::PARTICLES: { int maxParticles = static_cast<int>(pm.getPropf((FloatProperty)pm.getAttribSet()->getAttributes()["MAX_PARTICLES"]->getId())); pm.setBuffer((float *)malloc(maxParticles * 4 * sizeof(float))); IBuffer * buff = RESOURCEMANAGER->getBuffer(pm.getProps((StringProperty)pm.getAttribSet()->getAttributes()["BUFFER"]->getId())); buff->setData(maxParticles * 4 * sizeof(float), pm.getBuffer()); m_PhysInst->setScene( sn, matName, maxParticles, pm.getBuffer(), 0, NULL, (float *)aScene->getTransform().getMatrix() ); } break; case IPhysics::DEBUG: m_PhysInst->setScene(sn, matName, 0, NULL, 0, NULL, (float *)aScene->getTransform().getMatrix()); break; default: m_PhysInst->setSceneTransform(sn, (float *)aScene->getTransform().getMatrix()); std::shared_ptr<IRenderable> &r = aScene->getSceneObject(0)->getRenderable(); std::vector<VertexAttrib> *vd = r->getVertexData()->getDataOf(0).get(); m_PhysInst->setScene( sn, matName, static_cast<int> (vd->size()), (float *)&(vd->at(0)), static_cast<int> (r->getIndexData()->getIndexData()->size()), (unsigned int *)&(r->getIndexData()->getIndexData()->at(0)), (float *)aScene->getTransform().getMatrix() ); EVENTMANAGER->addListener("SCENE_TRANSFORM", this); break; } std::map<std::string, std::unique_ptr<Attribute>> &attrs = pm.getAttribSet()->getAttributes(); for (auto &a : attrs) { switch (a.second->getType()) { case Enums::FLOAT: m_PhysInst->applyFloatProperty(sn, a.second->getName(), pm.getPropf((FloatProperty)a.second->getId())); break; case Enums::VEC4: m_PhysInst->applyVec4Property(sn, a.second->getName(), &(pm.getPropf4((Float4Property)a.second->getId()).x)); break; } } m_Built = false; }
void PhysicsManager::update() { if (!m_PhysInst) return; m_PhysInst->update(); float *t; std::vector<std::shared_ptr<SceneObject>> so; for (auto s : m_Scenes) { int st = getMaterial(s.second).getPrope(PhysicsMaterial::SCENE_TYPE); switch (st) { case IPhysics::STATIC: break; case IPhysics::RIGID: t = m_PhysInst->getSceneTransform(s.first->getName()); s.first->setTransform(math::mat4(t)); break; case IPhysics::CLOTH: t = m_PhysInst->getSceneTransform(s.first->getName()); s.first->setTransform(math::mat4(t)); s.first->getAllObjects(&so); for (auto &o : so) { o->getRenderable()->getVertexData()->resetCompilationFlag(); o->getRenderable()->getVertexData()->compile(); } break; case IPhysics::CHARACTER: t = m_PhysInst->getSceneTransform(s.first->getName()); s.first->setTransform(math::mat4(t)); break; case IPhysics::PARTICLES: { std::string &sceneName = s.first->getName(); PhysicsMaterial &pm = getMaterial(s.second); int nPart = static_cast<int>(pm.getPropf((FloatProperty)pm.getAttribSet()->getAttributes()["NBPARTICLES"]->getId())); std::string bufferName = pm.getProps((StringProperty)pm.getAttribSet()->getAttributes()["BUFFER"]->getId()); IBuffer * pointsBuffer = RESOURCEMANAGER->getBuffer(bufferName); pointsBuffer->setSubData(0, nPart * 4 * sizeof(float), pm.getBuffer()); RENDERMANAGER->getCurrentPass()->setPropui(Pass::INSTANCE_COUNT, nPart); } break; case IPhysics::DEBUG: { IBuffer * b = RESOURCEMANAGER->getBufferByID(s.first->getSceneObject(0)->getRenderable()->getVertexData()->getBufferID(VertexData::GetAttribIndex(std::string("position")))); std::vector<float> * debugPos = m_PhysInst->getDebug(); b->setData(debugPos->size() * sizeof(float), &debugPos->at(0)); s.first->getAllObjects(&so); for (auto &o : so) { o->getRenderable()->getVertexData()->resetCompilationFlag(); o->getRenderable()->getVertexData()->compile(); } } break; } } for (auto cam : *(m_PhysInst->getCameraPositions())) { Camera * camera = RENDERMANAGER->getCamera(cam.first).get(); vec4 previous = camera->getPropf4(Camera::POSITION); vec4 current = vec4(cam.second[0], cam.second[1], cam.second[2], 1.0f); if (current != previous) camera->setPropf4(Camera::POSITION, current); } }