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