Store the tile rect in only one place in the scene assembly thread
This commit is contained in:
parent
21563d9d7f
commit
06439f858f
|
@ -14,10 +14,10 @@ use crate::gpu_data::{AlphaTileBatchPrimitive, BuiltObject, FillBatchPrimitive};
|
||||||
use crate::gpu_data::{RenderCommand, SolidTileBatchPrimitive};
|
use crate::gpu_data::{RenderCommand, SolidTileBatchPrimitive};
|
||||||
use crate::scene::Scene;
|
use crate::scene::Scene;
|
||||||
use crate::sorted_vector::SortedVector;
|
use crate::sorted_vector::SortedVector;
|
||||||
use crate::tiles::{self, Tiler};
|
use crate::tiles::Tiler;
|
||||||
use crate::z_buffer::ZBuffer;
|
use crate::z_buffer::ZBuffer;
|
||||||
use pathfinder_geometry::basic::point::{Point2DF32, Point2DI32, Point3DF32};
|
use pathfinder_geometry::basic::point::{Point2DF32, Point2DI32, Point3DF32};
|
||||||
use pathfinder_geometry::basic::rect::{RectF32, RectI32};
|
use pathfinder_geometry::basic::rect::RectF32;
|
||||||
use pathfinder_geometry::basic::transform2d::Transform2DF32;
|
use pathfinder_geometry::basic::transform2d::Transform2DF32;
|
||||||
use pathfinder_geometry::basic::transform3d::Perspective;
|
use pathfinder_geometry::basic::transform3d::Perspective;
|
||||||
use pathfinder_geometry::clip::PolygonClipper3D;
|
use pathfinder_geometry::clip::PolygonClipper3D;
|
||||||
|
@ -52,16 +52,11 @@ struct SceneAssemblyThreadInfo {
|
||||||
next_object_index: u32,
|
next_object_index: u32,
|
||||||
|
|
||||||
pub(crate) z_buffer: Arc<ZBuffer>,
|
pub(crate) z_buffer: Arc<ZBuffer>,
|
||||||
tile_rect: RectI32,
|
|
||||||
current_pass: Pass,
|
current_pass: Pass,
|
||||||
}
|
}
|
||||||
|
|
||||||
enum MainToSceneAssemblyMsg {
|
enum MainToSceneAssemblyMsg {
|
||||||
NewScene {
|
NewScene { listener: Box<dyn RenderCommandListener>, z_buffer: Arc<ZBuffer> },
|
||||||
listener: Box<dyn RenderCommandListener>,
|
|
||||||
effective_view_box: RectF32,
|
|
||||||
z_buffer: Arc<ZBuffer>,
|
|
||||||
},
|
|
||||||
AddObject(IndexedBuiltObject),
|
AddObject(IndexedBuiltObject),
|
||||||
SceneFinished,
|
SceneFinished,
|
||||||
Exit,
|
Exit,
|
||||||
|
@ -122,14 +117,13 @@ impl SceneAssemblyThread {
|
||||||
while let Ok(msg) = self.receiver.recv() {
|
while let Ok(msg) = self.receiver.recv() {
|
||||||
match msg {
|
match msg {
|
||||||
MainToSceneAssemblyMsg::Exit => break,
|
MainToSceneAssemblyMsg::Exit => break,
|
||||||
MainToSceneAssemblyMsg::NewScene { listener, effective_view_box, z_buffer } => {
|
MainToSceneAssemblyMsg::NewScene { listener, z_buffer } => {
|
||||||
self.info = Some(SceneAssemblyThreadInfo {
|
self.info = Some(SceneAssemblyThreadInfo {
|
||||||
listener,
|
listener,
|
||||||
built_object_queue: SortedVector::new(),
|
built_object_queue: SortedVector::new(),
|
||||||
next_object_index: 0,
|
next_object_index: 0,
|
||||||
|
|
||||||
z_buffer,
|
z_buffer,
|
||||||
tile_rect: tiles::round_rect_out_to_tile_bounds(effective_view_box),
|
|
||||||
current_pass: Pass::new(),
|
current_pass: Pass::new(),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -217,8 +211,7 @@ impl SceneAssemblyThread {
|
||||||
|
|
||||||
let mut info = self.info.as_mut().unwrap();
|
let mut info = self.info.as_mut().unwrap();
|
||||||
info.current_pass.solid_tiles =
|
info.current_pass.solid_tiles =
|
||||||
info.z_buffer.build_solid_tiles(info.tile_rect,
|
info.z_buffer.build_solid_tiles(info.current_pass.object_range.clone());
|
||||||
info.current_pass.object_range.clone());
|
|
||||||
|
|
||||||
let have_solid_tiles = !info.current_pass.solid_tiles.is_empty();
|
let have_solid_tiles = !info.current_pass.solid_tiles.is_empty();
|
||||||
let have_alpha_tiles = !info.current_pass.alpha_tiles.is_empty();
|
let have_alpha_tiles = !info.current_pass.alpha_tiles.is_empty();
|
||||||
|
@ -271,7 +264,7 @@ impl<'a> SceneBuilder<'a> {
|
||||||
pub fn build_sequentially(&mut self, listener: Box<dyn RenderCommandListener>) {
|
pub fn build_sequentially(&mut self, listener: Box<dyn RenderCommandListener>) {
|
||||||
let effective_view_box = self.scene.effective_view_box(self.built_options);
|
let effective_view_box = self.scene.effective_view_box(self.built_options);
|
||||||
let z_buffer = Arc::new(ZBuffer::new(effective_view_box));
|
let z_buffer = Arc::new(ZBuffer::new(effective_view_box));
|
||||||
self.send_new_scene_message_to_assembly_thread(listener, effective_view_box, &z_buffer);
|
self.send_new_scene_message_to_assembly_thread(listener, &z_buffer);
|
||||||
|
|
||||||
for object_index in 0..self.scene.objects.len() {
|
for object_index in 0..self.scene.objects.len() {
|
||||||
build_object(object_index,
|
build_object(object_index,
|
||||||
|
@ -288,7 +281,7 @@ impl<'a> SceneBuilder<'a> {
|
||||||
pub fn build_in_parallel(&mut self, listener: Box<dyn RenderCommandListener>) {
|
pub fn build_in_parallel(&mut self, listener: Box<dyn RenderCommandListener>) {
|
||||||
let effective_view_box = self.scene.effective_view_box(self.built_options);
|
let effective_view_box = self.scene.effective_view_box(self.built_options);
|
||||||
let z_buffer = Arc::new(ZBuffer::new(effective_view_box));
|
let z_buffer = Arc::new(ZBuffer::new(effective_view_box));
|
||||||
self.send_new_scene_message_to_assembly_thread(listener, effective_view_box, &z_buffer);
|
self.send_new_scene_message_to_assembly_thread(listener, &z_buffer);
|
||||||
|
|
||||||
(0..self.scene.objects.len()).into_par_iter().for_each(|object_index| {
|
(0..self.scene.objects.len()).into_par_iter().for_each(|object_index| {
|
||||||
build_object(object_index,
|
build_object(object_index,
|
||||||
|
@ -304,11 +297,9 @@ impl<'a> SceneBuilder<'a> {
|
||||||
|
|
||||||
fn send_new_scene_message_to_assembly_thread(&mut self,
|
fn send_new_scene_message_to_assembly_thread(&mut self,
|
||||||
listener: Box<dyn RenderCommandListener>,
|
listener: Box<dyn RenderCommandListener>,
|
||||||
effective_view_box: RectF32,
|
|
||||||
z_buffer: &Arc<ZBuffer>) {
|
z_buffer: &Arc<ZBuffer>) {
|
||||||
self.context.sender.send(MainToSceneAssemblyMsg::NewScene {
|
self.context.sender.send(MainToSceneAssemblyMsg::NewScene {
|
||||||
listener,
|
listener,
|
||||||
effective_view_box,
|
|
||||||
z_buffer: z_buffer.clone(),
|
z_buffer: z_buffer.clone(),
|
||||||
}).unwrap();
|
}).unwrap();
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@ use crate::gpu_data::SolidTileBatchPrimitive;
|
||||||
use crate::tile_map::DenseTileMap;
|
use crate::tile_map::DenseTileMap;
|
||||||
use crate::tiles;
|
use crate::tiles;
|
||||||
use pathfinder_geometry::basic::point::Point2DI32;
|
use pathfinder_geometry::basic::point::Point2DI32;
|
||||||
use pathfinder_geometry::basic::rect::{RectF32, RectI32};
|
use pathfinder_geometry::basic::rect::RectF32;
|
||||||
use std::ops::Range;
|
use std::ops::Range;
|
||||||
use std::sync::atomic::{AtomicUsize, Ordering as AtomicOrdering};
|
use std::sync::atomic::{AtomicUsize, Ordering as AtomicOrdering};
|
||||||
|
|
||||||
|
@ -52,8 +52,7 @@ impl ZBuffer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn build_solid_tiles(&self, tile_rect: RectI32, object_range: Range<u32>)
|
pub fn build_solid_tiles(&self, object_range: Range<u32>) -> Vec<SolidTileBatchPrimitive> {
|
||||||
-> Vec<SolidTileBatchPrimitive> {
|
|
||||||
let mut solid_tiles = vec![];
|
let mut solid_tiles = vec![];
|
||||||
for tile_index in 0..self.buffer.data.len() {
|
for tile_index in 0..self.buffer.data.len() {
|
||||||
let depth = self.buffer.data[tile_index].load(AtomicOrdering::Relaxed);
|
let depth = self.buffer.data[tile_index].load(AtomicOrdering::Relaxed);
|
||||||
|
@ -67,8 +66,8 @@ impl ZBuffer {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
solid_tiles.push(SolidTileBatchPrimitive {
|
solid_tiles.push(SolidTileBatchPrimitive {
|
||||||
tile_x: (tile_coords.x() + tile_rect.min_x()) as i16,
|
tile_x: (tile_coords.x() + self.buffer.rect.min_x()) as i16,
|
||||||
tile_y: (tile_coords.y() + tile_rect.min_y()) as i16,
|
tile_y: (tile_coords.y() + self.buffer.rect.min_y()) as i16,
|
||||||
object_index: object_index as u16,
|
object_index: object_index as u16,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue