Example #1
0
void ATOM_D3DVertexArray::unlock (void)
{
	if (!_M_locked)
	{
		return;
	}

	if (_M_vertexbuffer)
	{
		HRESULT hr = S_OK;

		if (_preservedContent)
		{
			if (_M_locked != LOCK_READ)
			{
				void *Data = 0;

				hr = _M_vertexbuffer->Lock (_M_lock_offset, _M_lock_size, &Data, _M_lock_flags);
				if (FAILED(hr))
				{
					ATOM_LOGGER::error ("%s() unlock failed!\n", __FUNCTION__);
					ATOM_CHECK_D3D_RESULT(hr);
				}

				memcpy (Data, (char*)_preservedContent+_M_lock_offset, _M_lock_size?_M_lock_size:getVertexStride()*getNumVertices());
				hr = _M_vertexbuffer->Unlock ();
			}
		}
		else
		{
			hr = _M_vertexbuffer->Unlock ();
		}
		if (FAILED(hr))
		{
			ATOM_LOGGER::error ("%s() Unlock failed!\n", __FUNCTION__);
			ATOM_CHECK_D3D_RESULT(hr);
		}
	}

	_M_locked = 0;
}
void veParticleSphereRenderer::updateBuffer(veRenderableObject *renderableObj, veCamera *camera, unsigned int contextID)
{
    auto vao = _vaoBuffer->getData(contextID);
    if (!vao) {
        vao = _vaoBuffer->createData(contextID);
        _needUpdate = true;
    }
    if (!_vertices.empty() && !_indices.empty() && _needUpdate){
        
        auto vbo = _vboBuffer->getData(contextID);
        if (!vbo){
            vbo = _vboBuffer->createData(contextID);
        }
        
        auto ibo = _iboBuffer->getData(contextID);
        if (!ibo){
            ibo = _iboBuffer->createData(contextID);
        }
        
        auto mvpbo = _mvpboBuffer->getData(contextID);
        if (!mvpbo){
            mvpbo = _mvpboBuffer->createData(contextID);
        }
        
        auto colorbo = _colorboBuffer->getData(contextID);
        if (!colorbo){
            colorbo = _colorboBuffer->createData(contextID);
        }
        
        glBindVertexArray(vao);
        glBindBuffer(GL_ARRAY_BUFFER, vbo);
        glBufferData(GL_ARRAY_BUFFER, _vertices.size() * sizeof(_vertices[0]), _vertices.buffer(), GL_STATIC_DRAW);
        
        unsigned int stride = sizeof(GLfloat) * getVertexStride();
        //v
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, stride, 0);
        glEnableVertexAttribArray(0);
        
        //tc
        glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, stride, (GLvoid *)(sizeof(GLfloat) * 3));
        glEnableVertexAttribArray(1);
        
        glBindBuffer(GL_ARRAY_BUFFER, colorbo);
        glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, 0, 0);
        glVertexAttribDivisor(2, 1);
        glEnableVertexAttribArray(2);
        
        glBindBuffer(GL_ARRAY_BUFFER, mvpbo);
        for (unsigned short i = 0; i < 4; ++i){
            glVertexAttribPointer(3 + i, 4, GL_FLOAT, GL_FALSE, sizeof(veMat4),
                                  (GLvoid*)(sizeof(GLfloat) * i * 4));
            glVertexAttribDivisor(3 + i, 1);
            glEnableVertexAttribArray(3 + i);
        }
        
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, _indices.size() * sizeof(_indices[0]), _indices.buffer(), GL_STATIC_DRAW);

        _needUpdate = false;
    }
    
    _instanceCount = 0;
    _mvpMats.clear();
    _colors.clear();
    veMat4 viewProjMat = camera->projectionMatrix() * camera->viewMatrix();
    
    const auto &particles = static_cast<veParticleSystem *>(renderableObj)->getParticles().getActiveDataList();
    static_cast<veParticleSystem *>(renderableObj)->lock();
    for (auto particle : particles){
        updateInstanceParams(particle, viewProjMat);
        ++_instanceCount;
    }
    static_cast<veParticleSystem *>(renderableObj)->unLock();
    
    if (!_colors.empty()){
        auto colorbo = _colorboBuffer->getData(contextID);
        glBindBuffer(GL_ARRAY_BUFFER, colorbo);
        glBufferData(GL_ARRAY_BUFFER, _colors.size() * sizeof(_colors[0]), _colors.buffer(), GL_DYNAMIC_DRAW);
    }
    
    if (!_mvpMats.empty()){
        auto mvpbo = _mvpboBuffer->getData(contextID);
        glBindBuffer(GL_ARRAY_BUFFER, mvpbo);
        glBufferData(GL_ARRAY_BUFFER, _mvpMats.size() * sizeof(_mvpMats[0]), _mvpMats.buffer(), GL_DYNAMIC_DRAW);
    }
}
void veTerrainRenderer::render(veNode *node, veRenderableObject *renderableObj, veCamera *camera, unsigned int contextID)
{
    
    auto vao = _vaoBuffer->getData(contextID);
    if (!vao) {
        vao = _vaoBuffer->createData(contextID);
        _needRefresh = true;
    }
    
    auto terrainGrid = static_cast<veTerrainGrid *>(renderableObj);
    if (_needRefresh) {
        glBindVertexArray(vao);
        
        auto vbo = _vboBuffer->getData(contextID);
        if (!vbo){
            vbo = _vboBuffer->createData(contextID);
        }
        glBindBuffer(GL_ARRAY_BUFFER, vbo);
        
        if (!terrainGrid->getVertexArray()->empty())
            glBufferData(GL_ARRAY_BUFFER, terrainGrid->getVertexArray()->size() * sizeof((*terrainGrid->getVertexArray())[0]), terrainGrid->getVertexArray()->buffer(), GL_DYNAMIC_DRAW);
        
        unsigned int stride = terrainGrid->getVertexStride();
        
        unsigned int offsets = 0;
        for (unsigned int i = 0; i < terrainGrid->getVertexAtrributeNum(); ++i) {
            glVertexAttribPointer(i, terrainGrid->getVertexAtrributeSize(i), GL_FLOAT, GL_FALSE, stride, (GLvoid *)(sizeof(GLfloat) * offsets));
            glEnableVertexAttribArray(i);
            offsets += terrainGrid->getVertexAtrributeSize(i);
        }
        
        auto ibo = _iboBuffer->getData(contextID);
        if (!ibo){
            ibo = _iboBuffer->createData(contextID);
        }
        
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
        if (!terrainGrid->getIndexArray()->empty())
            glBufferData(GL_ELEMENT_ARRAY_BUFFER, terrainGrid->getIndexArray()->size() * sizeof((*terrainGrid->getIndexArray())[0]), terrainGrid->getIndexArray()->buffer(), GL_STATIC_DRAW);
        _indicesCount = (GLsizei)terrainGrid->getIndexArray()->size();
        
        _needRefresh = false;
    }

	veRenderCommand rc;
	rc.mask = node->getMask();
	rc.worldMatrix = new veMat4Ptr(node->getNodeToWorldMatrix());
	rc.camera = camera;
	rc.sceneManager = camera->getSceneManager();
	rc.depthInCamera = (camera->viewMatrix() * rc.worldMatrix->value())[2][3];
	rc.renderer = this;
    rc.contextID = contextID;

    auto material = renderableObj->getMaterial();
    for (unsigned int i = 0; i < material->activeTechnique()->getPassNum(); ++i) {
        auto pass = material->activeTechnique()->getPass(i);
        if (camera->getMask() & pass->drawMask()) {
            bool isTransparent = pass->blendFunc() != veBlendFunc::DISABLE ? true : false;
            rc.pass = pass;
            pass->visit(rc);
            if (isTransparent)
                camera->getRenderQueue()->pushCommand(i, veRenderQueue::RENDER_QUEUE_TRANSPARENT, rc);
            else
                camera->getRenderQueue()->pushCommand(i, veRenderQueue::RENDER_QUEUE_ENTITY, rc);
        }
    }

}