Пример #1
0
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;
}
Пример #2
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);
	}
}