mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 06:20:06 +00:00 
			
		
		
		
	Placefile triangle looping
This commit is contained in:
		
							parent
							
								
									1a4b064214
								
							
						
					
					
						commit
						5c77bff2c6
					
				
					 1 changed files with 48 additions and 11 deletions
				
			
		|  | @ -19,6 +19,9 @@ static const auto        logger_    = scwx::util::Logger::Create(logPrefix_); | ||||||
| static constexpr std::size_t kVerticesPerTriangle = 3; | static constexpr std::size_t kVerticesPerTriangle = 3; | ||||||
| static constexpr std::size_t kPointsPerVertex     = 8; | static constexpr std::size_t kPointsPerVertex     = 8; | ||||||
| 
 | 
 | ||||||
|  | // Threshold, start time, end time
 | ||||||
|  | static constexpr std::size_t kIntegersPerVertex_ = 3; | ||||||
|  | 
 | ||||||
| class PlacefileTriangles::Impl | class PlacefileTriangles::Impl | ||||||
| { | { | ||||||
| public: | public: | ||||||
|  | @ -29,6 +32,7 @@ public: | ||||||
|        uMapMatrixLocation_(GL_INVALID_INDEX), |        uMapMatrixLocation_(GL_INVALID_INDEX), | ||||||
|        uMapScreenCoordLocation_(GL_INVALID_INDEX), |        uMapScreenCoordLocation_(GL_INVALID_INDEX), | ||||||
|        uMapDistanceLocation_(GL_INVALID_INDEX), |        uMapDistanceLocation_(GL_INVALID_INDEX), | ||||||
|  |        uSelectedTimeLocation_(GL_INVALID_INDEX), | ||||||
|        vao_ {GL_INVALID_INDEX}, |        vao_ {GL_INVALID_INDEX}, | ||||||
|        vbo_ {GL_INVALID_INDEX}, |        vbo_ {GL_INVALID_INDEX}, | ||||||
|        numVertices_ {0} |        numVertices_ {0} | ||||||
|  | @ -51,15 +55,16 @@ public: | ||||||
|    std::mutex bufferMutex_ {}; |    std::mutex bufferMutex_ {}; | ||||||
| 
 | 
 | ||||||
|    std::vector<GLfloat> currentBuffer_ {}; |    std::vector<GLfloat> currentBuffer_ {}; | ||||||
|    std::vector<GLint>   currentThresholdBuffer_ {}; |    std::vector<GLint>   currentIntegerBuffer_ {}; | ||||||
|    std::vector<GLfloat> newBuffer_ {}; |    std::vector<GLfloat> newBuffer_ {}; | ||||||
|    std::vector<GLint>   newThresholdBuffer_ {}; |    std::vector<GLint>   newIntegerBuffer_ {}; | ||||||
| 
 | 
 | ||||||
|    std::shared_ptr<ShaderProgram> shaderProgram_; |    std::shared_ptr<ShaderProgram> shaderProgram_; | ||||||
|    GLint                          uMVPMatrixLocation_; |    GLint                          uMVPMatrixLocation_; | ||||||
|    GLint                          uMapMatrixLocation_; |    GLint                          uMapMatrixLocation_; | ||||||
|    GLint                          uMapScreenCoordLocation_; |    GLint                          uMapScreenCoordLocation_; | ||||||
|    GLint                          uMapDistanceLocation_; |    GLint                          uMapDistanceLocation_; | ||||||
|  |    GLint                          uSelectedTimeLocation_; | ||||||
| 
 | 
 | ||||||
|    GLuint                vao_; |    GLuint                vao_; | ||||||
|    std::array<GLuint, 2> vbo_; |    std::array<GLuint, 2> vbo_; | ||||||
|  | @ -104,6 +109,8 @@ void PlacefileTriangles::Initialize() | ||||||
|       p->shaderProgram_->GetUniformLocation("uMapScreenCoord"); |       p->shaderProgram_->GetUniformLocation("uMapScreenCoord"); | ||||||
|    p->uMapDistanceLocation_ = |    p->uMapDistanceLocation_ = | ||||||
|       p->shaderProgram_->GetUniformLocation("uMapDistance"); |       p->shaderProgram_->GetUniformLocation("uMapDistance"); | ||||||
|  |    p->uSelectedTimeLocation_ = | ||||||
|  |       p->shaderProgram_->GetUniformLocation("uSelectedTime"); | ||||||
| 
 | 
 | ||||||
|    gl.glGenVertexArrays(1, &p->vao_); |    gl.glGenVertexArrays(1, &p->vao_); | ||||||
|    gl.glGenBuffers(2, p->vbo_.data()); |    gl.glGenBuffers(2, p->vbo_.data()); | ||||||
|  | @ -146,10 +153,18 @@ void PlacefileTriangles::Initialize() | ||||||
|    gl.glVertexAttribIPointer(3, //
 |    gl.glVertexAttribIPointer(3, //
 | ||||||
|                              1, |                              1, | ||||||
|                              GL_INT, |                              GL_INT, | ||||||
|                              0, |                              kIntegersPerVertex_ * sizeof(GLint), | ||||||
|                              static_cast<void*>(0)); |                              static_cast<void*>(0)); | ||||||
|    gl.glEnableVertexAttribArray(3); |    gl.glEnableVertexAttribArray(3); | ||||||
| 
 | 
 | ||||||
|  |    // aTimeRange
 | ||||||
|  |    gl.glVertexAttribIPointer(4, //
 | ||||||
|  |                              2, | ||||||
|  |                              GL_INT, | ||||||
|  |                              kIntegersPerVertex_ * sizeof(GLint), | ||||||
|  |                              reinterpret_cast<void*>(1 * sizeof(GLint))); | ||||||
|  |    gl.glEnableVertexAttribArray(4); | ||||||
|  | 
 | ||||||
|    p->dirty_ = true; |    p->dirty_ = true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -181,6 +196,17 @@ void PlacefileTriangles::Render( | ||||||
|          gl.glUniform1f(p->uMapDistanceLocation_, 0.0f); |          gl.glUniform1f(p->uMapDistanceLocation_, 0.0f); | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|  |       // Selected time
 | ||||||
|  |       std::chrono::system_clock::time_point selectedTime = | ||||||
|  |          (p->selectedTime_ == std::chrono::system_clock::time_point {}) ? | ||||||
|  |             std::chrono::system_clock::now() : | ||||||
|  |             p->selectedTime_; | ||||||
|  |       gl.glUniform1i( | ||||||
|  |          p->uSelectedTimeLocation_, | ||||||
|  |          static_cast<GLint>(std::chrono::duration_cast<std::chrono::minutes>( | ||||||
|  |                                selectedTime.time_since_epoch()) | ||||||
|  |                                .count())); | ||||||
|  | 
 | ||||||
|       // Draw icons
 |       // Draw icons
 | ||||||
|       gl.glDrawArrays(GL_TRIANGLES, 0, p->numVertices_); |       gl.glDrawArrays(GL_TRIANGLES, 0, p->numVertices_); | ||||||
|    } |    } | ||||||
|  | @ -197,14 +223,14 @@ void PlacefileTriangles::Deinitialize() | ||||||
| 
 | 
 | ||||||
|    // Clear the current buffers
 |    // Clear the current buffers
 | ||||||
|    p->currentBuffer_.clear(); |    p->currentBuffer_.clear(); | ||||||
|    p->currentThresholdBuffer_.clear(); |    p->currentIntegerBuffer_.clear(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void PlacefileTriangles::StartTriangles() | void PlacefileTriangles::StartTriangles() | ||||||
| { | { | ||||||
|    // Clear the new buffers
 |    // Clear the new buffers
 | ||||||
|    p->newBuffer_.clear(); |    p->newBuffer_.clear(); | ||||||
|    p->newThresholdBuffer_.clear(); |    p->newIntegerBuffer_.clear(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void PlacefileTriangles::AddTriangles( | void PlacefileTriangles::AddTriangles( | ||||||
|  | @ -222,11 +248,11 @@ void PlacefileTriangles::FinishTriangles() | ||||||
| 
 | 
 | ||||||
|    // Swap buffers
 |    // Swap buffers
 | ||||||
|    p->currentBuffer_.swap(p->newBuffer_); |    p->currentBuffer_.swap(p->newBuffer_); | ||||||
|    p->currentThresholdBuffer_.swap(p->newThresholdBuffer_); |    p->currentIntegerBuffer_.swap(p->newIntegerBuffer_); | ||||||
| 
 | 
 | ||||||
|    // Clear the new buffers
 |    // Clear the new buffers
 | ||||||
|    p->newBuffer_.clear(); |    p->newBuffer_.clear(); | ||||||
|    p->newThresholdBuffer_.clear(); |    p->newIntegerBuffer_.clear(); | ||||||
| 
 | 
 | ||||||
|    // Mark the draw item dirty
 |    // Mark the draw item dirty
 | ||||||
|    p->dirty_ = true; |    p->dirty_ = true; | ||||||
|  | @ -239,6 +265,16 @@ void PlacefileTriangles::Impl::UpdateBuffers( | ||||||
|    units::length::nautical_miles<double> threshold = di->threshold_; |    units::length::nautical_miles<double> threshold = di->threshold_; | ||||||
|    GLint thresholdValue = static_cast<GLint>(std::round(threshold.value())); |    GLint thresholdValue = static_cast<GLint>(std::round(threshold.value())); | ||||||
| 
 | 
 | ||||||
|  |    // Start and end time
 | ||||||
|  |    GLint startTime = | ||||||
|  |       static_cast<GLint>(std::chrono::duration_cast<std::chrono::minutes>( | ||||||
|  |                             di->startTime_.time_since_epoch()) | ||||||
|  |                             .count()); | ||||||
|  |    GLint endTime = | ||||||
|  |       static_cast<GLint>(std::chrono::duration_cast<std::chrono::minutes>( | ||||||
|  |                             di->endTime_.time_since_epoch()) | ||||||
|  |                             .count()); | ||||||
|  | 
 | ||||||
|    // Default color to "Color" statement
 |    // Default color to "Color" statement
 | ||||||
|    boost::gil::rgba8_pixel_t lastColor = di->color_; |    boost::gil::rgba8_pixel_t lastColor = di->color_; | ||||||
| 
 | 
 | ||||||
|  | @ -268,14 +304,15 @@ void PlacefileTriangles::Impl::UpdateBuffers( | ||||||
|       newBuffer_.insert( |       newBuffer_.insert( | ||||||
|          newBuffer_.end(), |          newBuffer_.end(), | ||||||
|          {screenCoordinate.x, screenCoordinate.y, x, y, r, g, b, a}); |          {screenCoordinate.x, screenCoordinate.y, x, y, r, g, b, a}); | ||||||
|       newThresholdBuffer_.push_back(thresholdValue); |       newIntegerBuffer_.insert(newIntegerBuffer_.end(), | ||||||
|  |                                {thresholdValue, startTime, endTime}); | ||||||
|    } |    } | ||||||
| 
 | 
 | ||||||
|    // Remove extra vertices that don't correspond to a full triangle
 |    // Remove extra vertices that don't correspond to a full triangle
 | ||||||
|    while (newBuffer_.size() % kVerticesPerTriangle != 0) |    while (newBuffer_.size() % kVerticesPerTriangle != 0) | ||||||
|    { |    { | ||||||
|       newBuffer_.pop_back(); |       newBuffer_.pop_back(); | ||||||
|       newThresholdBuffer_.pop_back(); |       newIntegerBuffer_.pop_back(); | ||||||
|    } |    } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -297,8 +334,8 @@ void PlacefileTriangles::Impl::Update() | ||||||
|       // Buffer threshold data
 |       // Buffer threshold data
 | ||||||
|       gl.glBindBuffer(GL_ARRAY_BUFFER, vbo_[1]); |       gl.glBindBuffer(GL_ARRAY_BUFFER, vbo_[1]); | ||||||
|       gl.glBufferData(GL_ARRAY_BUFFER, |       gl.glBufferData(GL_ARRAY_BUFFER, | ||||||
|                       sizeof(GLint) * currentThresholdBuffer_.size(), |                       sizeof(GLint) * currentIntegerBuffer_.size(), | ||||||
|                       currentThresholdBuffer_.data(), |                       currentIntegerBuffer_.data(), | ||||||
|                       GL_DYNAMIC_DRAW); |                       GL_DYNAMIC_DRAW); | ||||||
| 
 | 
 | ||||||
|       numVertices_ = |       numVertices_ = | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat