101 void PartRenderer::renderScene() |
101 void PartRenderer::renderScene() |
102 { |
102 { |
103 glClearColor(0.8f, 0.8f, 0.8f, 1.0f); |
103 glClearColor(0.8f, 0.8f, 0.8f, 1.0f); |
104 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); |
104 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); |
105 glEnable(GL_DEPTH_TEST); |
105 glEnable(GL_DEPTH_TEST); |
106 glEnable(GL_LIGHTING); |
|
107 glEnable(GL_POLYGON_OFFSET_FILL); |
106 glEnable(GL_POLYGON_OFFSET_FILL); |
108 glPolygonOffset(1.0f, 1.0f); |
107 glPolygonOffset(1.0f, 1.0f); |
109 switch (this->renderStyle) |
108 switch (this->renderStyle) |
110 { |
109 { |
111 case gl::RenderStyle::Normal: |
110 case gl::RenderStyle::Normal: |
|
111 this->setFragmentStyle(gl::FragmentStyle::Normal); |
|
112 this->renderAllArrays(); |
|
113 break; |
112 case gl::RenderStyle::BfcRedGreen: |
114 case gl::RenderStyle::BfcRedGreen: |
|
115 glEnable(GL_CULL_FACE); |
|
116 glCullFace(GL_BACK); |
|
117 this->setFragmentStyle(gl::FragmentStyle::BfcGreen); |
|
118 renderVao(gl::ArrayClass::Triangles); |
|
119 renderVao(gl::ArrayClass::Quads); |
|
120 glCullFace(GL_FRONT); |
|
121 this->setFragmentStyle(gl::FragmentStyle::BfcRed); |
|
122 renderVao(gl::ArrayClass::Triangles); |
|
123 renderVao(gl::ArrayClass::Quads); |
|
124 glDisable(GL_CULL_FACE); |
|
125 this->setFragmentStyle(gl::FragmentStyle::Normal); |
|
126 renderVao(gl::ArrayClass::Lines); |
113 case gl::RenderStyle::RandomColors: |
127 case gl::RenderStyle::RandomColors: |
|
128 this->setFragmentStyle(gl::FragmentStyle::RandomColors); |
|
129 this->renderAllArrays(); |
114 break; |
130 break; |
115 case gl::RenderStyle::Wireframe: |
131 case gl::RenderStyle::Wireframe: |
116 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); |
132 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); |
|
133 this->setFragmentStyle(gl::FragmentStyle::Normal); |
|
134 this->renderAllArrays(); |
117 break; |
135 break; |
118 } |
136 } |
|
137 glDisable(GL_POLYGON_OFFSET_FILL); |
|
138 } |
|
139 |
|
140 void PartRenderer::renderAllArrays() |
|
141 { |
119 // Lines need to be rendered last so that anti-aliasing does not interfere with polygon rendering. |
142 // Lines need to be rendered last so that anti-aliasing does not interfere with polygon rendering. |
120 renderVao(gl::ArrayClass::Triangles); |
143 renderVao(gl::ArrayClass::Triangles); |
121 renderVao(gl::ArrayClass::Quads); |
144 renderVao(gl::ArrayClass::Quads); |
122 renderVao(gl::ArrayClass::Lines); |
145 renderVao(gl::ArrayClass::Lines); |
123 glDisable(GL_POLYGON_OFFSET_FILL); |
146 } |
124 } |
147 |
125 |
148 |
126 void PartRenderer::updateViewMatrix() |
149 void PartRenderer::updateViewMatrix() |
127 { |
150 { |
128 // I'm not quite sure why using the exponent function on the zoom factor causes linear zoom behavior |
151 // I'm not quite sure why using the exponent function on the zoom factor causes linear zoom behavior |
129 const double z = 2 * std::exp(this->zoom) * (1 + this->compiler->modelDistance()); |
152 const double z = 2 * std::exp(this->zoom) * (1 + this->compiler->modelDistance()); |
186 this->zoom = std::clamp(this->zoom + move, MIN_ZOOM, MAX_ZOOM); |
209 this->zoom = std::clamp(this->zoom + move, MIN_ZOOM, MAX_ZOOM); |
187 this->updateViewMatrix(); |
210 this->updateViewMatrix(); |
188 this->update(); |
211 this->update(); |
189 } |
212 } |
190 |
213 |
|
214 /** |
|
215 * @brief Changes the color of rendered fragments |
|
216 * @param newFragmentStyle new fragment style to use |
|
217 */ |
|
218 void PartRenderer::setFragmentStyle(gl::FragmentStyle newFragmentStyle) |
|
219 { |
|
220 this->compiler->setUniform("fragmentStyle", static_cast<int>(newFragmentStyle)); |
|
221 } |
|
222 |
|
223 /** |
|
224 * @brief Changes the way the scene is rendered |
|
225 * @param newStyle new render style to use |
|
226 */ |
191 void PartRenderer::setRenderStyle(const gl::RenderStyle newStyle) |
227 void PartRenderer::setRenderStyle(const gl::RenderStyle newStyle) |
192 { |
228 { |
193 this->renderStyle = newStyle; |
229 this->renderStyle = newStyle; |
194 this->update(); |
230 this->update(); |
195 } |
231 } |