Ed_
f76ba4e9ba
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.
58 lines
1.4 KiB
Odin
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
|
|
}
|