comparison src/th06/anm0_vm.rs @ 643:01849ffd0180

Add an anmrenderer binary.
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Fri, 02 Aug 2019 20:24:45 +0200
parents 9e40bd5cc26d
children 7bde50132735
comparison
equal deleted inserted replaced
642:9e40bd5cc26d 643:01849ffd0180
5 Anm0, 5 Anm0,
6 Call, 6 Call,
7 Instruction, 7 Instruction,
8 }; 8 };
9 use crate::th06::interpolator::{Interpolator1, Interpolator2, Interpolator3, Formula}; 9 use crate::th06::interpolator::{Interpolator1, Interpolator2, Interpolator3, Formula};
10 use crate::util::math::Mat4;
10 use std::cell::RefCell; 11 use std::cell::RefCell;
11 use std::rc::Rc; 12 use std::rc::Rc;
13
14 /// TODO
15 #[repr(C)]
16 #[derive(Debug)]
17 pub struct Vertex {
18 /// XXX
19 pub pos: [i16; 3],
20 /// XXX
21 pub uv: [f32; 2],
22 /// XXX
23 pub color: [u8; 4],
24 }
12 25
13 /// Base visual element. 26 /// Base visual element.
14 #[derive(Debug, Clone, Default)] 27 #[derive(Debug, Clone, Default)]
15 pub struct Sprite { 28 pub struct Sprite {
16 blendfunc: u32, 29 blendfunc: u32,
59 color: [255, 255, 255, 255], 72 color: [255, 255, 255, 255],
60 ..Default::default() 73 ..Default::default()
61 } 74 }
62 } 75 }
63 76
77 /// TODO
78 pub fn fill_vertices(&self, vertices: &mut [Vertex; 4]) {
79 let mut mat = Mat4::new([[-0.5, 0.5, 0.5, -0.5],
80 [-0.5, -0.5, 0.5, 0.5],
81 [0., 0., 0., 0.],
82 [1., 1., 1., 1.]]);
83
84 let [tx, ty, tw, th] = self.texcoords;
85 let [sx, sy] = self.rescale;
86 let width = if self.width_override > 0. { self.width_override } else { tw * sx };
87 let height = if self.height_override > 0. { self.height_override } else { th * sy };
88
89 mat.scale2d(width, height);
90 if self.mirrored {
91 mat.flip();
92 }
93
94 let [rx, ry, mut rz] = self.rotations_3d;
95 if self.automatic_orientation {
96 rz += std::f32::consts::PI / 2. - self.angle;
97 } else if self.force_rotation {
98 rz += self.angle;
99 }
100
101 if rx != 0. {
102 mat.rotate_x(-rx);
103 }
104 if ry != 0. {
105 mat.rotate_y(ry);
106 }
107 if rz != 0. {
108 mat.rotate_z(-rz);
109 }
110
111 if self.allow_dest_offset {
112 mat.translate(self.dest_offset);
113 }
114 if self.corner_relative_placement {
115 mat.translate_2d(width / 2., height / 2.);
116 }
117
118 let mat = mat.borrow_inner();
119 vertices[0].pos[0] = mat[0][0] as i16;
120 vertices[0].pos[1] = mat[1][0] as i16;
121 vertices[0].pos[2] = mat[2][0] as i16;
122 vertices[1].pos[0] = mat[0][1] as i16;
123 vertices[1].pos[1] = mat[1][1] as i16;
124 vertices[1].pos[2] = mat[2][1] as i16;
125 vertices[2].pos[0] = mat[0][2] as i16;
126 vertices[2].pos[1] = mat[1][2] as i16;
127 vertices[2].pos[2] = mat[2][2] as i16;
128 vertices[3].pos[0] = mat[0][3] as i16;
129 vertices[3].pos[1] = mat[1][3] as i16;
130 vertices[3].pos[2] = mat[2][3] as i16;
131
132 // XXX: don’t clone here.
133 let (x_1, y_1) = self.anm.clone().unwrap().inv_size();
134 let [tox, toy] = self.texoffsets;
135 let left = tx * x_1 + tox;
136 let right = (tx + tw) * x_1 + tox;
137 let bottom = ty * y_1 + toy;
138 let top = (ty + th) * y_1 + toy;
139
140 vertices[0].uv[0] = left;
141 vertices[0].uv[1] = bottom;
142 vertices[1].uv[0] = right;
143 vertices[1].uv[1] = bottom;
144 vertices[2].uv[0] = right;
145 vertices[2].uv[1] = top;
146 vertices[3].uv[0] = left;
147 vertices[3].uv[1] = top;
148
149 vertices[0].color = self.color;
150 vertices[1].color = self.color;
151 vertices[2].color = self.color;
152 vertices[3].color = self.color;
153 }
154
64 /// Update sprite values from the interpolators. 155 /// Update sprite values from the interpolators.
65 pub fn update(&mut self) { 156 pub fn update(&mut self) {
66 self.frame += 1; 157 self.frame += 1;
158 self.corner_relative_placement = true;
67 159
68 let [sax, say, saz] = self.rotations_speed_3d; 160 let [sax, say, saz] = self.rotations_speed_3d;
69 if sax != 0. || say != 0. || saz != 0. { 161 if sax != 0. || say != 0. || saz != 0. {
70 let [ax, ay, az] = self.rotations_3d; 162 let [ax, ay, az] = self.rotations_3d;
71 self.rotations_3d = [ax + sax, ay + say, az + saz]; 163 self.rotations_3d = [ax + sax, ay + say, az + saz];