int luaSetBuffer(lua_State *l) { const char *name = lua_tostring(l, -4); size_t offset = (size_t)lua_tointeger(l, -3); const char *dataType = lua_tostring(l, -2); Enums::DataType dt = Enums::getType(dataType); int card = Enums::getCardinality(dt); Enums::DataType bdt = Enums::getBasicType(dt); int size = Enums::getSize(dt); IBuffer *buff = RESOURCEMANAGER->getBuffer(name); if (buff == NULL) { NAU_THROW("Lua getBuffer: invalid buffer: %s", name); return 0; } void *arr = NULL; float *arrF; int *arrI; unsigned int *arrUI; switch (bdt) { case Enums::FLOAT: arrF = (float *)malloc(sizeof(float) * card); lua_pushnil(l); for (int i = 0; i < card && lua_next(l,-2) != 0; ++i) { arrF[i] = (float)lua_tonumber(l, -1); lua_pop(l, 1); } arr = arrF; break; case Enums::INT: case Enums::BOOL: arrI = (int *)malloc(sizeof(int) * card); lua_pushnil(l); for (int i = 0; i < card && lua_next(l, -2) != 0; ++i) { arrI[i] = (int)lua_tointeger(l, -1); lua_pop(l, 1); } arr = arrI; break; case Enums::UINT : arrUI = (unsigned int *)malloc(sizeof(unsigned int) * card); lua_pushnil(l); for (int i = 0; i < card && lua_next(l, -2) != 0; ++i) { arrUI[i] = (unsigned int)lua_tointeger(l, -1); lua_pop(l, 1); } arr = arrUI; break; } buff->setSubData(offset, size, arr); return 0; }
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); } }