void LinearGeometry::renderFaces(float alpha, Appearance& appearance) { glBegin(GL_TRIANGLES); _register = appearance.getFaceColor(); glColor4f(_register[0], _register[1], _register[2], _register[3] * alpha * appearance.getModifierAlpha()); int number = getNumberTriangles(); float*** triangles = getTriangles(); for (int i = 0; i < number; i++) { _register = triangles[i][0]; glVertex3f(_register[0], _register[1], _register[2]); _register = triangles[i][1]; glVertex3f(_register[0], _register[1], _register[2]); _register = triangles[i][2]; glVertex3f(_register[0], _register[1], _register[2]); } glEnd(); glBegin(GL_QUADS); number = getNumberQuads(); float*** quads = getQuads(); for (int i = 0; i < number; i++) { _register = quads[i][0]; glVertex3f(_register[0], _register[1], _register[2]); _register = quads[i][1]; glVertex3f(_register[0], _register[1], _register[2]); _register = quads[i][2]; glVertex3f(_register[0], _register[1], _register[2]); _register = quads[i][3]; glVertex3f(_register[0], _register[1], _register[2]); } glEnd(); }
void Renderer::visitRenderQueue(const RenderQueue& queue) { ssize_t size = queue.size(); for (ssize_t index = 0; index < size; ++index) { auto command = queue[index]; auto commandType = command->getType(); if(RenderCommand::Type::QUAD_COMMAND == commandType) { auto cmd = static_cast<QuadCommand*>(command); //Batch quads if(_numQuads + cmd->getQuadCount() > VBO_SIZE) { CCASSERT(cmd->getQuadCount()>= 0 && cmd->getQuadCount() < VBO_SIZE, "VBO is not big enough for quad data, please break the quad data down or use customized render command"); //Draw batched quads if VBO is full drawBatchedQuads(); } _batchedQuadCommands.push_back(cmd); memcpy(_quads + _numQuads, cmd->getQuads(), sizeof(V3F_C4B_T2F_Quad) * cmd->getQuadCount()); convertToWorldCoordinates(_quads + _numQuads, cmd->getQuadCount(), cmd->getModelView()); _numQuads += cmd->getQuadCount(); } else if(RenderCommand::Type::GROUP_COMMAND == commandType) { flush(); int renderQueueID = ((GroupCommand*) command)->getRenderQueueID(); visitRenderQueue(_renderGroups[renderQueueID]); } else if(RenderCommand::Type::CUSTOM_COMMAND == commandType) { flush(); auto cmd = static_cast<CustomCommand*>(command); cmd->execute(); } else if(RenderCommand::Type::BATCH_COMMAND == commandType) { flush(); auto cmd = static_cast<BatchCommand*>(command); cmd->execute(); } else { CCLOGERROR("Unknown commands in renderQueue"); } } }
// ----------------------------------------------------------------------------- // // ----------------------------------------------------------------------------- IGeometry::Pointer QuadGeom::deepCopy() { QuadGeom::Pointer quadCopy = QuadGeom::CreateGeometry(getQuads(), getVertices(), getName()); quadCopy->setEdges(getEdges()); quadCopy->setUnsharedEdges(getUnsharedEdges()); quadCopy->setElementsContainingVert(getElementsContainingVert()); quadCopy->setElementNeighbors(getElementNeighbors()); quadCopy->setElementCentroids(getElementCentroids()); quadCopy->setSpatialDimensionality(getSpatialDimensionality()); return quadCopy; }
void Label::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) { if (_batchNodes.empty() || _lengthOfString <= 0) { return; } // Don't do calculate the culling if the transform was not updated bool transformUpdated = flags & FLAGS_TRANSFORM_DIRTY; #if CC_USE_CULLING auto visitingCamera = Camera::getVisitingCamera(); auto defaultCamera = Camera::getDefaultCamera(); if (visitingCamera == defaultCamera) { _insideBounds = (transformUpdated || visitingCamera->isViewProjectionUpdated()) ? renderer->checkVisibility(transform, _contentSize) : _insideBounds; } else { _insideBounds = renderer->checkVisibility(transform, _contentSize); } if (_insideBounds) #endif { if (!_shadowEnabled && (_currentLabelType == LabelType::BMFONT || _currentLabelType == LabelType::CHARMAP)) { for (auto&& it : _letters) { it.second->updateTransform(); } auto textureAtlas = _batchNodes.at(0)->getTextureAtlas(); _quadCommand.init(_globalZOrder, textureAtlas->getTexture()->getName(), getGLProgramState(), _blendFunc, textureAtlas->getQuads(), textureAtlas->getTotalQuads(), transform, flags); renderer->addCommand(&_quadCommand); } else { _customCommand.init(_globalZOrder, transform, flags); _customCommand.func = CC_CALLBACK_0(Label::onDraw, this, transform, transformUpdated); renderer->addCommand(&_customCommand); } } }
void Renderer::render() { //Uncomment this once everything is rendered by new renderer //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //TODO setup camera or MVP if (_glViewAssigned) { // cleanup _drawnBatches = _drawnVertices = 0; //Process render commands //1. Sort render commands based on ID for (auto &renderqueue : _renderGroups) { renderqueue.sort(); } while(!_renderStack.empty()) { RenderQueue currRenderQueue = _renderGroups[_renderStack.top().renderQueueID]; size_t len = currRenderQueue.size(); //Process RenderQueue for(size_t i = _renderStack.top().currentIndex; i < len; i++) { _renderStack.top().currentIndex = i; auto command = currRenderQueue[i]; auto commandType = command->getType(); if(commandType == RenderCommand::Type::QUAD_COMMAND) { auto cmd = static_cast<QuadCommand*>(command); CCASSERT(nullptr!= cmd, "Illegal command for RenderCommand Taged as QUAD_COMMAND"); //Batch quads if(_numQuads + cmd->getQuadCount() > VBO_SIZE) { CCASSERT(cmd->getQuadCount()>= 0 && cmd->getQuadCount() < VBO_SIZE, "VBO is not big enough for quad data, please break the quad data down or use customized render command"); //Draw batched quads if VBO is full drawBatchedQuads(); } _batchedQuadCommands.push_back(cmd); memcpy(_quads + _numQuads, cmd->getQuads(), sizeof(V3F_C4B_T2F_Quad) * cmd->getQuadCount()); convertToWorldCoordinates(_quads + _numQuads, cmd->getQuadCount(), cmd->getModelView()); _numQuads += cmd->getQuadCount(); } else if(commandType == RenderCommand::Type::CUSTOM_COMMAND) { flush(); auto cmd = static_cast<CustomCommand*>(command); cmd->execute(); } else if(commandType == RenderCommand::Type::BATCH_COMMAND) { flush(); auto cmd = static_cast<BatchCommand*>(command); cmd->execute(); } else if(commandType == RenderCommand::Type::GROUP_COMMAND) { flush(); auto cmd = static_cast<GroupCommand*>(command); _renderStack.top().currentIndex = i + 1; //push new renderQueue to renderStack RenderStackElement element = {cmd->getRenderQueueID(), 0}; _renderStack.push(element); //Exit current loop break; } else { CCASSERT(true, "Invalid command"); flush(); } } //Draw the batched quads drawBatchedQuads(); currRenderQueue = _renderGroups[_renderStack.top().renderQueueID]; len = currRenderQueue.size(); //If pop the render stack if we already processed all the commands if(_renderStack.top().currentIndex + 1 >= len) { _renderStack.pop(); } } } for (size_t j = 0 ; j < _renderGroups.size(); j++) { //commands are owned by nodes // for (const auto &cmd : _renderGroups[j]) // { // cmd->releaseToCommandPool(); // } _renderGroups[j].clear(); } //Clear the stack incase gl view hasn't been initialized yet while(!_renderStack.empty()) { _renderStack.pop(); } RenderStackElement element = {DEFAULT_RENDER_QUEUE, 0}; _renderStack.push(element); _lastMaterialID = 0; }