Skip to content

Commit d0f3cbc

Browse files
authored
Add generic transform systems. (#68)
1 parent b4a079e commit d0f3cbc

File tree

10 files changed

+414
-88
lines changed

10 files changed

+414
-88
lines changed

crates/processing_ffi/src/lib.rs

Lines changed: 88 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -558,25 +558,6 @@ pub extern "C" fn processing_mode_2d(graphics_id: u64) {
558558
error::check(|| graphics_mode_2d(graphics_entity));
559559
}
560560

561-
#[unsafe(no_mangle)]
562-
pub extern "C" fn processing_camera_position(graphics_id: u64, x: f32, y: f32, z: f32) {
563-
error::clear_error();
564-
let graphics_entity = Entity::from_bits(graphics_id);
565-
error::check(|| graphics_camera_position(graphics_entity, x, y, z));
566-
}
567-
568-
#[unsafe(no_mangle)]
569-
pub extern "C" fn processing_camera_look_at(
570-
graphics_id: u64,
571-
target_x: f32,
572-
target_y: f32,
573-
target_z: f32,
574-
) {
575-
error::clear_error();
576-
let graphics_entity = Entity::from_bits(graphics_id);
577-
error::check(|| graphics_camera_look_at(graphics_entity, target_x, target_y, target_z));
578-
}
579-
580561
#[unsafe(no_mangle)]
581562
pub extern "C" fn processing_perspective(
582563
graphics_id: u64,
@@ -605,6 +586,94 @@ pub extern "C" fn processing_ortho(
605586
error::check(|| graphics_ortho(graphics_entity, left, right, bottom, top, near, far));
606587
}
607588

589+
#[unsafe(no_mangle)]
590+
pub extern "C" fn processing_transform_set_position(entity_id: u64, x: f32, y: f32, z: f32) {
591+
error::clear_error();
592+
let entity = Entity::from_bits(entity_id);
593+
error::check(|| transform_set_position(entity, x, y, z));
594+
}
595+
596+
#[unsafe(no_mangle)]
597+
pub extern "C" fn processing_transform_translate(entity_id: u64, x: f32, y: f32, z: f32) {
598+
error::clear_error();
599+
let entity = Entity::from_bits(entity_id);
600+
error::check(|| transform_translate(entity, x, y, z));
601+
}
602+
603+
#[unsafe(no_mangle)]
604+
pub extern "C" fn processing_transform_set_rotation(entity_id: u64, x: f32, y: f32, z: f32) {
605+
error::clear_error();
606+
let entity = Entity::from_bits(entity_id);
607+
error::check(|| transform_set_rotation(entity, x, y, z));
608+
}
609+
610+
#[unsafe(no_mangle)]
611+
pub extern "C" fn processing_transform_rotate_x(entity_id: u64, angle: f32) {
612+
error::clear_error();
613+
let entity = Entity::from_bits(entity_id);
614+
error::check(|| transform_rotate_x(entity, angle));
615+
}
616+
617+
#[unsafe(no_mangle)]
618+
pub extern "C" fn processing_transform_rotate_y(entity_id: u64, angle: f32) {
619+
error::clear_error();
620+
let entity = Entity::from_bits(entity_id);
621+
error::check(|| transform_rotate_y(entity, angle));
622+
}
623+
624+
#[unsafe(no_mangle)]
625+
pub extern "C" fn processing_transform_rotate_z(entity_id: u64, angle: f32) {
626+
error::clear_error();
627+
let entity = Entity::from_bits(entity_id);
628+
error::check(|| transform_rotate_z(entity, angle));
629+
}
630+
631+
#[unsafe(no_mangle)]
632+
pub extern "C" fn processing_transform_rotate_axis(
633+
entity_id: u64,
634+
angle: f32,
635+
axis_x: f32,
636+
axis_y: f32,
637+
axis_z: f32,
638+
) {
639+
error::clear_error();
640+
let entity = Entity::from_bits(entity_id);
641+
error::check(|| transform_rotate_axis(entity, angle, axis_x, axis_y, axis_z));
642+
}
643+
644+
#[unsafe(no_mangle)]
645+
pub extern "C" fn processing_transform_set_scale(entity_id: u64, x: f32, y: f32, z: f32) {
646+
error::clear_error();
647+
let entity = Entity::from_bits(entity_id);
648+
error::check(|| transform_set_scale(entity, x, y, z));
649+
}
650+
651+
#[unsafe(no_mangle)]
652+
pub extern "C" fn processing_transform_scale(entity_id: u64, x: f32, y: f32, z: f32) {
653+
error::clear_error();
654+
let entity = Entity::from_bits(entity_id);
655+
error::check(|| transform_scale(entity, x, y, z));
656+
}
657+
658+
#[unsafe(no_mangle)]
659+
pub extern "C" fn processing_transform_look_at(
660+
entity_id: u64,
661+
target_x: f32,
662+
target_y: f32,
663+
target_z: f32,
664+
) {
665+
error::clear_error();
666+
let entity = Entity::from_bits(entity_id);
667+
error::check(|| transform_look_at(entity, target_x, target_y, target_z));
668+
}
669+
670+
#[unsafe(no_mangle)]
671+
pub extern "C" fn processing_transform_reset(entity_id: u64) {
672+
error::clear_error();
673+
let entity = Entity::from_bits(entity_id);
674+
error::check(|| transform_reset(entity));
675+
}
676+
608677
pub const PROCESSING_ATTR_FORMAT_FLOAT: u8 = 1;
609678
pub const PROCESSING_ATTR_FORMAT_FLOAT2: u8 = 2;
610679
pub const PROCESSING_ATTR_FORMAT_FLOAT3: u8 = 3;

crates/processing_pyo3/src/graphics.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -281,12 +281,12 @@ impl Graphics {
281281
}
282282

283283
pub fn camera_position(&self, x: f32, y: f32, z: f32) -> PyResult<()> {
284-
graphics_camera_position(self.entity, x, y, z)
284+
transform_set_position(self.entity, x, y, z)
285285
.map_err(|e| PyRuntimeError::new_err(format!("{e}")))
286286
}
287287

288288
pub fn camera_look_at(&self, target_x: f32, target_y: f32, target_z: f32) -> PyResult<()> {
289-
graphics_camera_look_at(self.entity, target_x, target_y, target_z)
289+
transform_look_at(self.entity, target_x, target_y, target_z)
290290
.map_err(|e| PyRuntimeError::new_err(format!("{e}")))
291291
}
292292

crates/processing_render/src/error.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,6 @@ pub enum ProcessingError {
2828
GeometryNotFound,
2929
#[error("Layout not found")]
3030
LayoutNotFound,
31+
#[error("Transform not found")]
32+
TransformNotFound,
3133
}

crates/processing_render/src/graphics.rs

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -344,35 +344,6 @@ pub fn mode_2d(
344344
Ok(())
345345
}
346346

347-
pub fn camera_position(
348-
In((entity, x, y, z)): In<(Entity, f32, f32, f32)>,
349-
mut transforms: Query<&mut Transform>,
350-
) -> Result<()> {
351-
let mut transform = transforms
352-
.get_mut(entity)
353-
.map_err(|_| ProcessingError::GraphicsNotFound)?;
354-
355-
transform.translation = Vec3::new(x, y, z);
356-
357-
Ok(())
358-
}
359-
360-
pub fn camera_look_at(
361-
In((entity, target_x, target_y, target_z)): In<(Entity, f32, f32, f32)>,
362-
mut transforms: Query<&mut Transform>,
363-
) -> Result<()> {
364-
let mut transform = transforms
365-
.get_mut(entity)
366-
.map_err(|_| ProcessingError::GraphicsNotFound)?;
367-
368-
// TODO: allow specifying up vector?
369-
// does anyone actually use anything other than Vec3::Y here?
370-
let target = Vec3::new(target_x, target_y, target_z);
371-
transform.look_at(target, Vec3::Y);
372-
373-
Ok(())
374-
}
375-
376347
pub fn perspective(
377348
In((
378349
entity,

crates/processing_render/src/lib.rs

Lines changed: 103 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ mod graphics;
55
pub mod image;
66
pub mod render;
77
mod surface;
8+
pub mod transform;
89

910
use std::{cell::RefCell, num::NonZero, path::PathBuf, sync::OnceLock};
1011

@@ -483,37 +484,6 @@ pub fn graphics_mode_2d(graphics_entity: Entity) -> error::Result<()> {
483484
})
484485
}
485486

486-
pub fn graphics_camera_position(
487-
graphics_entity: Entity,
488-
x: f32,
489-
y: f32,
490-
z: f32,
491-
) -> error::Result<()> {
492-
app_mut(|app| {
493-
flush(app, graphics_entity)?;
494-
app.world_mut()
495-
.run_system_cached_with(graphics::camera_position, (graphics_entity, x, y, z))
496-
.unwrap()
497-
})
498-
}
499-
500-
pub fn graphics_camera_look_at(
501-
graphics_entity: Entity,
502-
target_x: f32,
503-
target_y: f32,
504-
target_z: f32,
505-
) -> error::Result<()> {
506-
app_mut(|app| {
507-
flush(app, graphics_entity)?;
508-
app.world_mut()
509-
.run_system_cached_with(
510-
graphics::camera_look_at,
511-
(graphics_entity, target_x, target_y, target_z),
512-
)
513-
.unwrap()
514-
})
515-
}
516-
517487
pub fn graphics_perspective(
518488
graphics_entity: Entity,
519489
fov: f32,
@@ -571,6 +541,108 @@ pub fn graphics_ortho(
571541
})
572542
}
573543

544+
pub fn transform_set_position(entity: Entity, x: f32, y: f32, z: f32) -> error::Result<()> {
545+
app_mut(|app| {
546+
app.world_mut()
547+
.run_system_cached_with(transform::set_position, (entity, x, y, z))
548+
.unwrap()
549+
})
550+
}
551+
552+
pub fn transform_translate(entity: Entity, x: f32, y: f32, z: f32) -> error::Result<()> {
553+
app_mut(|app| {
554+
app.world_mut()
555+
.run_system_cached_with(transform::translate, (entity, x, y, z))
556+
.unwrap()
557+
})
558+
}
559+
560+
pub fn transform_set_rotation(entity: Entity, x: f32, y: f32, z: f32) -> error::Result<()> {
561+
app_mut(|app| {
562+
app.world_mut()
563+
.run_system_cached_with(transform::set_rotation, (entity, x, y, z))
564+
.unwrap()
565+
})
566+
}
567+
568+
pub fn transform_rotate_x(entity: Entity, angle: f32) -> error::Result<()> {
569+
app_mut(|app| {
570+
app.world_mut()
571+
.run_system_cached_with(transform::rotate_x, (entity, angle))
572+
.unwrap()
573+
})
574+
}
575+
576+
pub fn transform_rotate_y(entity: Entity, angle: f32) -> error::Result<()> {
577+
app_mut(|app| {
578+
app.world_mut()
579+
.run_system_cached_with(transform::rotate_y, (entity, angle))
580+
.unwrap()
581+
})
582+
}
583+
584+
pub fn transform_rotate_z(entity: Entity, angle: f32) -> error::Result<()> {
585+
app_mut(|app| {
586+
app.world_mut()
587+
.run_system_cached_with(transform::rotate_z, (entity, angle))
588+
.unwrap()
589+
})
590+
}
591+
592+
pub fn transform_rotate_axis(
593+
entity: Entity,
594+
angle: f32,
595+
axis_x: f32,
596+
axis_y: f32,
597+
axis_z: f32,
598+
) -> error::Result<()> {
599+
app_mut(|app| {
600+
app.world_mut()
601+
.run_system_cached_with(
602+
transform::rotate_axis,
603+
(entity, angle, axis_x, axis_y, axis_z),
604+
)
605+
.unwrap()
606+
})
607+
}
608+
609+
pub fn transform_set_scale(entity: Entity, x: f32, y: f32, z: f32) -> error::Result<()> {
610+
app_mut(|app| {
611+
app.world_mut()
612+
.run_system_cached_with(transform::set_scale, (entity, x, y, z))
613+
.unwrap()
614+
})
615+
}
616+
617+
pub fn transform_scale(entity: Entity, x: f32, y: f32, z: f32) -> error::Result<()> {
618+
app_mut(|app| {
619+
app.world_mut()
620+
.run_system_cached_with(transform::scale, (entity, x, y, z))
621+
.unwrap()
622+
})
623+
}
624+
625+
pub fn transform_look_at(
626+
entity: Entity,
627+
target_x: f32,
628+
target_y: f32,
629+
target_z: f32,
630+
) -> error::Result<()> {
631+
app_mut(|app| {
632+
app.world_mut()
633+
.run_system_cached_with(transform::look_at, (entity, target_x, target_y, target_z))
634+
.unwrap()
635+
})
636+
}
637+
638+
pub fn transform_reset(entity: Entity) -> error::Result<()> {
639+
app_mut(|app| {
640+
app.world_mut()
641+
.run_system_cached_with(transform::reset, entity)
642+
.unwrap()
643+
})
644+
}
645+
574646
/// Create a new image with given size and data.
575647
pub fn image_create(
576648
size: Extent3d,

0 commit comments

Comments
 (0)