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); } } }