1pub use {
2 std::{
3 rc::Rc,
4 any::TypeId,
5 },
6 crate::{
7 makepad_math::*,
8 makepad_live_id::*,
9 makepad_live_tokenizer::{LiveErrorOrigin, live_error_origin},
10 live_error::{LiveError},
11 live_node_vec::*,
12 live_registry::{LiveRegistry,LiveScopeTarget},
13 live_node::*
14 }
15};
16
17impl LiveError {
30 fn eval_error_wrong_value_in_expression(origin: LiveErrorOrigin, index: usize, nodes: &[LiveNode], ty: &str) ->Self{
31 Self::eval_error(origin, index, nodes, format!("wrong value in expression of type {} value: {:?}", ty, nodes[index].value))
32 }
33
34 fn eval_error_binop_undefined_in_expression(origin: LiveErrorOrigin, index: usize, nodes: &[LiveNode], op: LiveBinOp, a: LiveValue, b: LiveValue)->Self {
35 Self::eval_error(origin, index, nodes, format!("Operation {:?} undefined between {:?} and {:?}", op, a, b))
36 }
37
38 fn eval_error_unop_undefined_in_expression(origin: LiveErrorOrigin, index: usize, nodes: &[LiveNode], op: LiveUnOp, a: LiveValue)->Self {
39 Self::eval_error(origin, index, nodes, format!("Operation {:?} undefined for {:?}", op, a))
40 }
41
42 fn eval_error_expression_call_not_implemented(origin: LiveErrorOrigin, index: usize, nodes: &[LiveNode], ident: LiveId, args: usize)->Self {
43 Self::eval_error(origin, index, nodes, format!("Expression call not implemented ident:{} with number of args: {}", ident, args))
44 }
45
46 fn eval_error_cant_find_target(origin: LiveErrorOrigin, index: usize, nodes: &[LiveNode], id: LiveId)->Self {
47 Self::eval_error(origin, index, nodes, format!("cant find target: {}", id))
48 }
49
50 fn eval_error(origin: LiveErrorOrigin, index: usize, nodes: &[LiveNode], message: String)->Self{
51 LiveError {
52 origin,
53 message,
54 span: nodes[index].origin.token_id().unwrap().into()
55 }
56 }
57}
58
59pub fn live_eval_value(live_registry: &LiveRegistry, index: &mut usize, nodes: &[LiveNode], scope_nodes: &[LiveNode]) -> Result<LiveValue,LiveError> {
60 let v = &nodes[*index].value;
61 Ok(match v {
62 LiveValue::Str(_) |
63 LiveValue::InlineString(_) |
64 LiveValue::Dependency(_) |
65 LiveValue::String(_) |
66 LiveValue::Float32(_) |
67 LiveValue::Float64(_) |
68 LiveValue::Uint64(_) |
69 LiveValue::Int64(_) |
70 LiveValue::Vec2(_) |
71 LiveValue::Vec3(_) |
72 LiveValue::Vec4(_) |
73 LiveValue::Color(_) |
74 LiveValue::Bool(_) =>{
75 *index += 1;
76 return Ok(v.clone())
77 }
78 LiveValue::Array => { fn last_keyframe_value_from_array(index: usize, nodes: &[LiveNode]) -> Option<usize> {
80 if let Some(index) = nodes.last_child(index) {
81 if nodes[index].value.is_object() {
82 return nodes.child_by_name(index, live_id!(value).as_field());
83 }
84 else {
85 return Some(index)
86 }
87 }
88 None
89 }
90 if let Some(keyframe) = last_keyframe_value_from_array(*index, nodes) {
91 *index = nodes.skip_node(*index);
92 return Ok(nodes[keyframe].value.clone())
93 }
94 else {
95 return Err(LiveError::eval_error_wrong_value_in_expression(live_error_origin!(), *index, nodes, "Animation array"))
96 }
97 },
98 LiveValue::Expr=>{
99 *index += 1;
100 return live_eval_value(live_registry, index, nodes, scope_nodes)
101 }
102 LiveValue::Id(id) => { *index += 1;
104 if let LiveValue::Root(root) = &scope_nodes[0].value {
105 if let Some(ptr) = root.locals.get(&id){
107 match ptr{
108 LiveScopeTarget::LivePtr(ptr)=>{
109 let doc = live_registry.ptr_to_doc(*ptr);
110 let mut index = ptr.index as usize;
111 return live_eval_value(live_registry, &mut index, &doc.nodes, &doc.nodes)
112 }
113 LiveScopeTarget::LocalPtr(ptr)=>{
114 let mut index = *ptr;
115 return live_eval_value(live_registry, &mut index, &scope_nodes, &scope_nodes)
116 }
117 }
118 }
119 }
120 return Err(LiveError::eval_error_cant_find_target(live_error_origin!(), *index, nodes, *id))
121 },
122 LiveValue::ExprUnOp(op) => {
123 *index += 1;
124 let a = live_eval_value(live_registry, index, nodes, scope_nodes)?;
125 match op {
126 LiveUnOp::Not => match a {
127 LiveValue::Bool(va) => LiveValue::Bool(!va),
128 _ => return Err(LiveError::eval_error_unop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a))
129 }
130 LiveUnOp::Neg => match a {
131 LiveValue::Float64(va) => LiveValue::Float64(-va),
132 LiveValue::Int64(va) => LiveValue::Int64(-va),
133 _ => return Err(LiveError::eval_error_unop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a))
134 }
135 }
136 }
137 LiveValue::ExprCall {ident, args} => {
138 *index += 1;
139 match ident {
140 live_id!(pow) if *args == 2 => {
141 let a = live_eval_value(live_registry, index, nodes, scope_nodes)?;
142 let b = live_eval_value(live_registry, index, nodes, scope_nodes)?;
143 if let LiveValue::Float64(va) = a {
144 if let LiveValue::Float64(vb) = b {
145 return Ok(LiveValue::Float64(va.powf(vb)))
147 }
148 }
149 }
150 live_id!(blend) if *args == 2 => {
151 let a = live_eval_value(live_registry, index, nodes, scope_nodes)?;
152 let b = live_eval_value(live_registry, index, nodes, scope_nodes)?;
153 if let Some(va) = a.as_vec4() {
154 if let Some(vb) = b.as_vec4() {
155 return Ok(LiveValue::Vec4(vec4(
157 va.x + (vb.x - va.x) * vb.w,
158 va.y + (vb.y - va.y) * vb.w,
159 va.z + (vb.z - va.z) * vb.w,
160 va.w
161 )))
162 }
163 }
164 }
165 live_id!(mix) if *args == 3 => {
166 let a = live_eval_value(live_registry, index, nodes, scope_nodes)?;
167 let b = live_eval_value(live_registry, index, nodes, scope_nodes)?;
168 let c = live_eval_value(live_registry, index, nodes, scope_nodes)?;
169
170 if let Some(va) = a.as_vec4() {
171 if let Some(vb) = b.as_vec4() {
172 if let LiveValue::Float64(vc) = c {
173 let vc = vc as f32;
174 return Ok(LiveValue::Vec4(vec4(
176 va.x + (vb.x - va.x) * vc,
177 va.y + (vb.y - va.y) * vc,
178 va.z + (vb.z - va.z) * vc,
179 va.w + (vb.w - va.w) * vc
180 )))
181 }
182 if let Some(vc) = c.as_vec4() {
183 return Ok(LiveValue::Vec4(vec4(
185 va.x + (vb.x - va.x) * vc.x,
186 va.y + (vb.y - va.y) * vc.y,
187 va.z + (vb.z - va.z) * vc.z,
188 va.w + (vb.w - va.w) * vc.w
189 )))
190 }
191 }
192 }
193 }
194 live_id!(hsvmod) if *args == 4 => {
195 let orig = live_eval_value(live_registry, index, nodes, scope_nodes)?;
196 let hmod = live_eval_value(live_registry, index, nodes, scope_nodes)?;
197 let smod = live_eval_value(live_registry, index, nodes, scope_nodes)?;
198 let vmod = live_eval_value(live_registry, index, nodes, scope_nodes)?;
199 if let Some(vorig) = orig.as_vec4() {
200 if let LiveValue::Float64(hm) = hmod {
201 if let LiveValue::Float64(sm) = smod {
202 if let LiveValue::Float64(vm) = vmod {
203
204 let mut hsv = vorig.to_hsva();
205 hsv.x = (hsv.x + (hm as f32)/360.0 + 360.0).rem_euclid(360.);
206 hsv.z = hsv.z + vm as f32;
207 hsv.y = hsv.y + sm as f32;
208
209 return Ok(LiveValue::Vec4(Vec4::from_hsva(hsv)))
211 }
212 }
213 }
214 }
215 }
216 _ => {}
217 }
218
219 return Err(LiveError::eval_error_expression_call_not_implemented(live_error_origin!(), *index, nodes, *ident, *args))
220 }
221 LiveValue::ExprBinOp(op) => {
222 *index += 1;
223 let a = live_eval_value(live_registry, index, nodes, scope_nodes)?;
224 let b = live_eval_value(live_registry, index, nodes, scope_nodes)?;
225
226 match op {
227 LiveBinOp::Or => match a {
228 LiveValue::Bool(va) => match b {
229 LiveValue::Bool(vb) => LiveValue::Bool(va || vb),
230 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
231 }
232 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
233 }
234 LiveBinOp::And => match a {
235 LiveValue::Bool(va) => match b {
236 LiveValue::Bool(vb) => LiveValue::Bool(va && vb),
237 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
238 }
239 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
240 },
241 LiveBinOp::Eq => match a {
242 LiveValue::Bool(va) => match b {
243 LiveValue::Bool(vb) => LiveValue::Bool(va == vb),
244 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
245 }
246 LiveValue::Int64(va) => match b {
247 LiveValue::Int64(vb) => LiveValue::Bool(va == vb),
248 LiveValue::Float64(vb) => LiveValue::Bool(va as f64 == vb),
249 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
250 }
251 LiveValue::Float64(va) => match b {
252 LiveValue::Int64(vb) => LiveValue::Bool(va == vb as f64),
253 LiveValue::Float64(vb) => LiveValue::Bool(va == vb),
254 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
255 }
256 LiveValue::Vec2(va) => match b {
257 LiveValue::Vec2(vb) => LiveValue::Bool(va == vb),
258 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
259 }
260 LiveValue::Vec3(va) => match b {
261 LiveValue::Vec3(vb) => LiveValue::Bool(va == vb),
262 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
263 }
264 LiveValue::Vec4(va) => match b {
265 LiveValue::Vec4(vb) => LiveValue::Bool(va == vb),
266 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
267 }
268 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
269 },
270 LiveBinOp::Ne => match a {
271 LiveValue::Bool(va) => match b {
272 LiveValue::Bool(vb) => LiveValue::Bool(va != vb),
273 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
274 }
275 LiveValue::Int64(va) => match b {
276 LiveValue::Int64(vb) => LiveValue::Bool(va != vb),
277 LiveValue::Float64(vb) => LiveValue::Bool(va as f64 != vb),
278 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
279 }
280 LiveValue::Float64(va) => match b {
281 LiveValue::Int64(vb) => LiveValue::Bool(va != vb as f64),
282 LiveValue::Float64(vb) => LiveValue::Bool(va != vb),
283 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
284 }
285 LiveValue::Vec2(va) => match b {
286 LiveValue::Vec2(vb) => LiveValue::Bool(va != vb),
287 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
288 }
289 LiveValue::Vec3(va) => match b {
290 LiveValue::Vec3(vb) => LiveValue::Bool(va != vb),
291 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
292 }
293 LiveValue::Vec4(va) => match b {
294 LiveValue::Vec4(vb) => LiveValue::Bool(va != vb),
295 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
296 }
297 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
298 },
299 LiveBinOp::Lt => match a {
300 LiveValue::Int64(va) => match b {
301 LiveValue::Int64(vb) => LiveValue::Bool(va < vb),
302 LiveValue::Float64(vb) => LiveValue::Bool((va as f64) < vb),
303 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
304 }
305 LiveValue::Float64(va) => match b {
306 LiveValue::Int64(vb) => LiveValue::Bool(va < vb as f64),
307 LiveValue::Float64(vb) => LiveValue::Bool(va < vb),
308 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
309 }
310 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
311 },
312 LiveBinOp::Le => match a {
313 LiveValue::Int64(va) => match b {
314 LiveValue::Int64(vb) => LiveValue::Bool(va <= vb),
315 LiveValue::Float64(vb) => LiveValue::Bool((va as f64) <= vb),
316 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
317 }
318 LiveValue::Float64(va) => match b {
319 LiveValue::Int64(vb) => LiveValue::Bool(va <= vb as f64),
320 LiveValue::Float64(vb) => LiveValue::Bool(va <= vb),
321 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
322 }
323 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
324 },
325 LiveBinOp::Gt => match a {
326 LiveValue::Int64(va) => match b {
327 LiveValue::Int64(vb) => LiveValue::Bool(va > vb),
328 LiveValue::Float64(vb) => LiveValue::Bool((va as f64) > vb),
329 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
330 }
331 LiveValue::Float64(va) => match b {
332 LiveValue::Int64(vb) => LiveValue::Bool(va > vb as f64),
333 LiveValue::Float64(vb) => LiveValue::Bool(va > vb),
334 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
335 }
336 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
337 },
338 LiveBinOp::Ge => match a {
339 LiveValue::Int64(va) => match b {
340 LiveValue::Int64(vb) => LiveValue::Bool(va >= vb),
341 LiveValue::Float64(vb) => LiveValue::Bool((va as f64) >= vb),
342 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
343 }
344 LiveValue::Float64(va) => match b {
345 LiveValue::Int64(vb) => LiveValue::Bool(va >= vb as f64),
346 LiveValue::Float64(vb) => LiveValue::Bool(va >= vb),
347 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
348 }
349 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
350 },
351 LiveBinOp::Add => match a {
352 LiveValue::Int64(va) => match b {
353 LiveValue::Int64(vb) => LiveValue::Int64(va + vb),
354 LiveValue::Float64(vb) => LiveValue::Float64((va as f64) + vb),
355 LiveValue::Vec2(vb) => LiveValue::Vec2(vb + va as f32),
356 LiveValue::Vec3(vb) => LiveValue::Vec3(vb + va as f32),
357 LiveValue::Vec4(vb) => LiveValue::Vec4(vb + va as f32),
358 LiveValue::Color(vb) => LiveValue::Vec4(va as f32 + Vec4::from_u32(vb)),
359 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
360 }
361 LiveValue::Float64(va) => match b {
362 LiveValue::Int64(vb) => LiveValue::Float64(va + vb as f64),
363 LiveValue::Float64(vb) => LiveValue::Float64(va + vb),
364 LiveValue::Vec2(vb) => LiveValue::Vec2(va as f32 + vb),
365 LiveValue::Vec3(vb) => LiveValue::Vec3(va as f32 + vb),
366 LiveValue::Vec4(vb) => LiveValue::Vec4(va as f32 + vb),
367 LiveValue::Color(vb) => LiveValue::Vec4(va as f32 + Vec4::from_u32(vb)),
368 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
369 }
370 LiveValue::Vec2(va) => match b {
371 LiveValue::Vec2(vb) => LiveValue::Vec2(va + vb),
372 LiveValue::Int64(vb) => LiveValue::Vec2(va + vb as f32),
373 LiveValue::Float64(vb) => LiveValue::Vec2(va + vb as f32),
374 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
375 }
376 LiveValue::Vec3(va) => match b {
377 LiveValue::Vec3(vb) => LiveValue::Vec3(va + vb),
378 LiveValue::Int64(vb) => LiveValue::Vec3(va + vb as f32),
379 LiveValue::Float64(vb) => LiveValue::Vec3(va + vb as f32),
380 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
381 }
382 LiveValue::Vec4(va) => match b {
383 LiveValue::Vec4(vb) => LiveValue::Vec4(va + vb),
384 LiveValue::Int64(vb) => LiveValue::Vec4(va + vb as f32),
385 LiveValue::Float64(vb) => LiveValue::Vec4(va + vb as f32),
386 LiveValue::Color(vb) => LiveValue::Vec4(va + Vec4::from_u32(vb)),
387 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
388 }
389 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
390 },
391 LiveBinOp::Sub => match a {
392 LiveValue::Int64(va) => match b {
393 LiveValue::Int64(vb) => LiveValue::Int64(va - vb),
394 LiveValue::Float64(vb) => LiveValue::Float64((va as f64) - vb),
395 LiveValue::Vec2(vb) => LiveValue::Vec2(va as f32 - vb),
396 LiveValue::Vec3(vb) => LiveValue::Vec3(va as f32 - vb),
397 LiveValue::Vec4(vb) => LiveValue::Vec4(va as f32 - vb),
398 LiveValue::Color(vb) => LiveValue::Vec4(va as f32 - Vec4::from_u32(vb)),
399 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
400 }
401 LiveValue::Float64(va) => match b {
402 LiveValue::Int64(vb) => LiveValue::Float64(va - vb as f64),
403 LiveValue::Float64(vb) => LiveValue::Float64(va - vb),
404 LiveValue::Vec2(vb) => LiveValue::Vec2(va as f32 - vb),
405 LiveValue::Vec3(vb) => LiveValue::Vec3(va as f32 - vb),
406 LiveValue::Vec4(vb) => LiveValue::Vec4(va as f32 - vb),
407 LiveValue::Color(vb) => LiveValue::Vec4(va as f32 - Vec4::from_u32(vb)),
408 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
409 }
410 LiveValue::Vec2(va) => match b {
411 LiveValue::Vec2(vb) => LiveValue::Vec2(va - vb),
412 LiveValue::Int64(vb) => LiveValue::Vec2(va - vb as f32),
413 LiveValue::Float64(vb) => LiveValue::Vec2(va - vb as f32),
414 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
415 }
416 LiveValue::Vec3(va) => match b {
417 LiveValue::Vec3(vb) => LiveValue::Vec3(va - vb),
418 LiveValue::Int64(vb) => LiveValue::Vec3(va - vb as f32),
419 LiveValue::Float64(vb) => LiveValue::Vec3(va - vb as f32),
420 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
421 }
422 LiveValue::Vec4(va) => match b {
423 LiveValue::Vec4(vb) => LiveValue::Vec4(va - vb),
424 LiveValue::Int64(vb) => LiveValue::Vec4(va - vb as f32),
425 LiveValue::Float64(vb) => LiveValue::Vec4(va - vb as f32),
426 LiveValue::Color(vb) => LiveValue::Vec4(va - Vec4::from_u32(vb)),
427 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
428 }
429 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
430 },
431 LiveBinOp::Mul => match a {
432 LiveValue::Int64(va) => match b {
433 LiveValue::Int64(vb) => LiveValue::Int64(va * vb),
434 LiveValue::Float64(vb) => LiveValue::Float64((va as f64) * vb),
435 LiveValue::Vec2(vb) => LiveValue::Vec2(va as f32 * vb),
436 LiveValue::Vec3(vb) => LiveValue::Vec3(va as f32 * vb),
437 LiveValue::Vec4(vb) => LiveValue::Vec4(va as f32 * vb),
438 LiveValue::Color(vb) => LiveValue::Vec4(va as f32 * Vec4::from_u32(vb)),
439 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
440 }
441 LiveValue::Float64(va) => match b {
442 LiveValue::Int64(vb) => LiveValue::Float64(va * vb as f64),
443 LiveValue::Float64(vb) => LiveValue::Float64(va * vb),
444 LiveValue::Vec2(vb) => LiveValue::Vec2(va as f32 * vb),
445 LiveValue::Vec3(vb) => LiveValue::Vec3(va as f32 * vb),
446 LiveValue::Vec4(vb) => LiveValue::Vec4(va as f32 * vb),
447 LiveValue::Color(vb) => LiveValue::Vec4(va as f32 * Vec4::from_u32(vb)),
448 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
449 }
450 LiveValue::Vec2(va) => match b {
451 LiveValue::Vec2(vb) => LiveValue::Vec2(va * vb),
452 LiveValue::Int64(vb) => LiveValue::Vec2(va * vb as f32),
453 LiveValue::Float64(vb) => LiveValue::Vec2(va * vb as f32),
454 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
455 }
456 LiveValue::Vec3(va) => match b {
457 LiveValue::Vec3(vb) => LiveValue::Vec3(va * vb),
458 LiveValue::Int64(vb) => LiveValue::Vec3(va * vb as f32),
459 LiveValue::Float64(vb) => LiveValue::Vec3(va * vb as f32),
460 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
461 }
462 LiveValue::Vec4(va) => match b {
463 LiveValue::Vec4(vb) => LiveValue::Vec4(va * vb),
464 LiveValue::Int64(vb) => LiveValue::Vec4(va * vb as f32),
465 LiveValue::Float64(vb) => LiveValue::Vec4(va * vb as f32),
466 LiveValue::Color(vb) => LiveValue::Vec4(va * Vec4::from_u32(vb)),
467 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
468 }
469 LiveValue::Color(va) => match b {
470 LiveValue::Vec4(vb) => LiveValue::Vec4(Vec4::from_u32(va) * vb),
471 LiveValue::Int64(vb) => LiveValue::Vec4(Vec4::from_u32(va) * vb as f32),
472 LiveValue::Float64(vb) => LiveValue::Vec4(Vec4::from_u32(va) * vb as f32),
473 LiveValue::Color(vb) => LiveValue::Vec4(Vec4::from_u32(va) * Vec4::from_u32(vb)),
474 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
475 }
476 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
477 },
478 LiveBinOp::Div => match a {
479 LiveValue::Int64(va) => match b {
480 LiveValue::Int64(vb) => LiveValue::Float64(va as f64 / vb as f64),
481 LiveValue::Float64(vb) => LiveValue::Float64((va as f64) / vb),
482 LiveValue::Vec2(vb) => LiveValue::Vec2(va as f32 / vb),
483 LiveValue::Vec3(vb) => LiveValue::Vec3(va as f32 / vb),
484 LiveValue::Vec4(vb) => LiveValue::Vec4(va as f32 / vb),
485 LiveValue::Color(vb) => LiveValue::Vec4(va as f32 / Vec4::from_u32(vb)),
486 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
487 }
488 LiveValue::Float64(va) => match b {
489 LiveValue::Int64(vb) => LiveValue::Float64(va / vb as f64),
490 LiveValue::Float64(vb) => LiveValue::Float64(va / vb),
491 LiveValue::Vec2(vb) => LiveValue::Vec2(va as f32 / vb),
492 LiveValue::Vec3(vb) => LiveValue::Vec3(va as f32 / vb),
493 LiveValue::Vec4(vb) => LiveValue::Vec4(va as f32 / vb),
494 LiveValue::Color(vb) => LiveValue::Vec4(va as f32 / Vec4::from_u32(vb)),
495 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
496 }
497 LiveValue::Vec2(va) => match b {
498 LiveValue::Vec2(vb) => LiveValue::Vec2(va / vb),
499 LiveValue::Int64(vb) => LiveValue::Vec2(va / vb as f32),
500 LiveValue::Float64(vb) => LiveValue::Vec2(va / vb as f32),
501 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
502 }
503 LiveValue::Vec3(va) => match b {
504 LiveValue::Vec3(vb) => LiveValue::Vec3(va / vb),
505 LiveValue::Int64(vb) => LiveValue::Vec3(va / vb as f32),
506 LiveValue::Float64(vb) => LiveValue::Vec3(va / vb as f32),
507 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
508 }
509 LiveValue::Vec4(va) => match b {
510 LiveValue::Vec4(vb) => LiveValue::Vec4(va / vb),
511 LiveValue::Int64(vb) => LiveValue::Vec4(va / vb as f32),
512 LiveValue::Float64(vb) => LiveValue::Vec4(va / vb as f32),
513 LiveValue::Color(vb) => LiveValue::Vec4(va / Vec4::from_u32(vb)),
514 _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
515 } _ => return Err(LiveError::eval_error_binop_undefined_in_expression(live_error_origin!(), *index, nodes, *op, a, b))
516 },
517 }
518 }
519 _ => {
520 return Err(LiveError::eval_error_wrong_value_in_expression(live_error_origin!(), *index, nodes, ""))
521 }
522 })
523}