SectrPrototype/code/space.odin
Ed_ f76ba4e9ba Lots of stuff (Big ones are cam and frame initial features)
There is now a 2D camera in the workspace!
We have a basic 'Frame' definition. It doesn't have any interaction yet...

I started to define spacial math, mostly for doing conversion and getting a grounding on pixel/points/cm reference. The world space is in cm.
2024-02-10 03:40:53 -05:00

58 lines
1.4 KiB
Odin

package sectr
import rl "vendor:raylib"
// The points to pixels and pixels to points are our only reference to accurately converting
// an object from world space to screen-space.
// This prototype engine will have all its spacial unit base for distances in centimetres.
Inches_To_Centimetre :: cast(f32) 2.54
Points_Per_Centimetre := cast(f32) 28.3465
Centimetres_Per_Point :: cast(f32) 1.0 / 28.3465 // Precalculated reciprocal for multiplication
DPT_DPC :: cast(f32) 72.0 * Inches_To_Centimetre
when ODIN_OS == OS_Type.Windows {
os_default_dpc :: 96 * Inches_To_Centimetre
// 1 inch = 2.54 cm, 96 inch * 2.54 = 243.84 DPC
}
f32_cm_to_pixels :: proc ( cm : f32 ) -> f32 {
state := get_state(); using state
return cm * screen_dpc
}
vec2_cm_to_pixels :: proc ( v : Vec2 ) -> Vec2 {
state := get_state(); using state
return v * screen_dpc
}
points_to_pixels :: proc ( points : f32 ) -> f32 {
state := get_state(); using state
cm_per_pixel := 1.0 / screen_dpc
return points * DPT_DPC * cm_per_pixel
}
pixels_to_points :: proc ( pixels : f32 ) -> f32 {
state := get_state(); using state
cm_per_pixel := 1.0 / screen_dpc
return pixels * cm_per_pixel * Points_Per_Centimetre
}
Camera :: rl.Camera2D
get_half_screen :: proc() -> AreaSize {
state := get_state(); using state
return {
f32(screen_width) / 2,
f32(screen_height) / 2,
}
}
Bounds2 :: struct {
bottom_left, top_right : Vec2
}
AreaSize :: struct {
width, height : f32
}