MCPcopy Create free account
hub / github.com/Panzerschrek/Chasm-Reverse / Rasterizer

Method Rasterizer

PanzerChasm/client/software_renderer/rasterizer.cpp:14–84  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

12{
13
14Rasterizer::Rasterizer(
15 const unsigned int viewport_size_x,
16 const unsigned int viewport_size_y,
17 const unsigned int row_size,
18 uint32_t* const color_buffer )
19 : viewport_size_x_( int(viewport_size_x) )
20 , viewport_size_y_( int(viewport_size_y) )
21 , row_size_( int(row_size) )
22 , color_buffer_( color_buffer )
23{
24 { // Setup depth buffer and depth buffer hierarchy.
25 unsigned int memory_for_depth_required= 0u;
26 depth_buffer_width_= ( viewport_size_x + 1u ) & (~1u);
27 const unsigned int depth_buffer_memory_size= depth_buffer_width_ * viewport_size_y;
28 memory_for_depth_required+= depth_buffer_memory_size;
29
30 for( unsigned int i= 0u; i < c_depth_buffer_hierarchy_levels; i++ )
31 {
32 const unsigned int hierarchy_cell_size= c_first_depth_hierarchy_level_size << i;
33 depth_buffer_hierarchy_[i].width = ( depth_buffer_width_ + ( hierarchy_cell_size - 1u ) ) / hierarchy_cell_size;
34 depth_buffer_hierarchy_[i].height= ( viewport_size_y_ + ( hierarchy_cell_size - 1u ) ) / hierarchy_cell_size;
35
36 memory_for_depth_required+= depth_buffer_hierarchy_[i].width * depth_buffer_hierarchy_[i].height;
37 }
38
39 depth_buffer_storage_.resize( memory_for_depth_required );
40
41 unsigned int offset= 0u;
42 depth_buffer_= depth_buffer_storage_.data();
43 offset+= depth_buffer_memory_size;
44
45 for( unsigned int i= 0u; i < c_depth_buffer_hierarchy_levels; i++ )
46 {
47 depth_buffer_hierarchy_[i].data= depth_buffer_storage_.data() + offset;
48 offset+= depth_buffer_hierarchy_[i].width * depth_buffer_hierarchy_[i].height;
49 }
50 }
51 // Setup occlusion buffer
52 {
53 const unsigned int top_hierarchy_level_cell_size= 16u << ( (c_occlusion_hierarchy_levels-1u) * 2u );
54 const unsigned int top_hierarchy_level_cell_size_minus_one= top_hierarchy_level_cell_size - 1u;
55 const unsigned int viewport_size_x_ceil= ( viewport_size_x + top_hierarchy_level_cell_size_minus_one ) / top_hierarchy_level_cell_size * top_hierarchy_level_cell_size;
56 const unsigned int viewport_size_y_ceil= ( viewport_size_y + top_hierarchy_level_cell_size_minus_one ) / top_hierarchy_level_cell_size * top_hierarchy_level_cell_size;
57
58 // Main buffer
59 occlusion_buffer_width_ = viewport_size_x_ceil / 8u;
60 occlusion_buffer_height_= viewport_size_y_ceil;
61 occlusion_buffer_storage_.resize( occlusion_buffer_width_ * occlusion_buffer_height_ );
62 occlusion_buffer_= occlusion_buffer_storage_.data();
63
64 // Hierarchy
65 unsigned int hexopixels_requested= 0u;
66 for( unsigned int i= 0u; i < c_occlusion_hierarchy_levels; i++ )
67 {
68 auto& level= occlusion_hierarchy_levels_[i];
69 const unsigned int heirarchy_cell_size= 16u << ( i * 2u );
70 level.size[0]= ( viewport_size_x_ceil + ( heirarchy_cell_size - 1u ) ) / heirarchy_cell_size;
71 level.size[1]= ( viewport_size_y_ceil + ( heirarchy_cell_size - 1u ) ) / heirarchy_cell_size;

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected