makepad_live_compiler/
live_eval.rs

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
17/*
18#[derive(Debug)]
19pub enum LiveEval {
20    Float64(f64),
21    Vec2(Vec2),
22    Vec3(Vec3),
23    Vec4(Vec4),
24    Int64(i64),
25    Bool(bool),
26    String(Rc<String>),
27}
28*/
29impl 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 => { // got an animation track. select the last value
79            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) => { // look it up from start on up
103            *index += 1;
104            if let LiveValue::Root(root) = &scope_nodes[0].value {
105                // lets find the id
106                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                            // ok so how do we blend this eh.
146                            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                            // ok so how do we blend this eh.
156                            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                                // ok so how do we blend this eh.
175                                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                                // ok so how do we blend this eh.
184                                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                                    // ok so how do we blend this eh.
210                                    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}