Apollo 11.0
自动驾驶开放平台
renderable_object.cc
浏览该文件的文档.
1/******************************************************************************
2 * Copyright 2018 The Apollo Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *****************************************************************************/
16
18
19#include <iostream>
20
21std::shared_ptr<QOpenGLShaderProgram> RenderableObject::NullRenderableObj;
22
23std::shared_ptr<QOpenGLShaderProgram> RenderableObject::CreateShaderProgram(
24 const QString& vertexShaderFileName, const QString& fragShaderFileName) {
25 std::shared_ptr<QOpenGLShaderProgram> shaderProg(new QOpenGLShaderProgram());
26 if (shaderProg != nullptr) {
27 shaderProg->addShaderFromSourceFile(QOpenGLShader::Vertex,
28 vertexShaderFileName);
29 shaderProg->addShaderFromSourceFile(QOpenGLShader::Fragment,
30 fragShaderFileName);
31 if (!shaderProg->link()) {
32 std::cerr << "----cannot link shader programm, log:("
33 << shaderProg->log().toStdString() << ")\n";
34
35 shaderProg.reset();
36 }
37 }
38 return shaderProg;
39}
40
42 int vertexCount, int vertexElementCount,
43 const std::shared_ptr<QOpenGLShaderProgram>& shaderProgram)
44 : QOpenGLFunctions(),
45 is_init_(false),
46 is_renderable_(true),
47 vertex_count_(vertexCount),
48 vertex_element_count_(vertexElementCount),
49 shader_program_(shaderProgram),
50 vao_(),
51 vbo_(QOpenGLBuffer::VertexBuffer) {}
52
54
56 if (is_init_) {
57 is_renderable_ = false;
58 is_init_ = false;
59 shader_program_.reset();
60 vbo_.destroy();
61 vao_.destroy();
62 }
63}
64
66 std::shared_ptr<QOpenGLShaderProgram>& shaderProgram) {
67 if (is_init_) {
68 return true;
69 }
70
71 if (vertex_count() < 1) {
72 return false;
73 }
74 if (vertex_element_count() < 1) {
75 return false;
76 }
77
78 if (shaderProgram != nullptr) {
79 shader_program_ = shaderProgram;
80 }
81
82 if (shader_program_ == nullptr) {
83 return false;
84 }
85
86 initializeOpenGLFunctions();
87
88 if (!vao_.create()) {
89 return false;
90 }
91 vao_.bind();
92
93 if (!vbo_.create()) {
94 vao_.destroy();
95 return false;
96 }
97 vbo_.setUsagePattern(QOpenGLBuffer::StaticDraw);
98 vbo_.bind();
99
100 vbo_.allocate(VertexBufferSize());
101 GLfloat* pBuffer = static_cast<GLfloat*>(vbo_.map(QOpenGLBuffer::WriteOnly));
102 bool ret = FillVertexBuffer(pBuffer);
103 vbo_.unmap();
104
105 if (!ret) {
106 return ret;
107 }
108
110
111 vbo_.release();
112 vao_.release();
113 is_init_ = true;
114
115 return true;
116}
117
118void RenderableObject::Render(const QMatrix4x4* mvp) {
119 if (is_init_) {
120 if (is_renderable()) {
121 shader_program_->bind();
122 if (mvp) {
123 shader_program_->setUniformValue("mvp", *mvp);
124 }
126 vao_.bind();
127 Draw();
128 vao_.release();
129 shader_program_->release();
130 }
131 } else {
132 std::cerr << "Please initialize the object" << std::endl;
133 }
134}
RenderableObject(int vertex_count=1, int vertex_element_count=3, const std::shared_ptr< QOpenGLShaderProgram > &shaderProgram=NullRenderableObj)
virtual void SetupAllAttrPointer(void)
int vertex_element_count(void) const
bool Init(std::shared_ptr< QOpenGLShaderProgram > &shaderProgram=NullRenderableObj)
virtual void SetupExtraUniforms(void)
int vertex_count(void) const
int VertexBufferSize(void) const
std::shared_ptr< QOpenGLShaderProgram > shader_program_
virtual ~RenderableObject(void)
void Render(const QMatrix4x4 *mvp=nullptr)
QOpenGLVertexArrayObject vao_
virtual void Draw(void)
static std::shared_ptr< QOpenGLShaderProgram > NullRenderableObj
virtual bool FillVertexBuffer(GLfloat *pBuffer)=0
static std::shared_ptr< QOpenGLShaderProgram > CreateShaderProgram(const QString &vertexShaderFileName, const QString &fragShaderFileName)
bool is_renderable(void) const