1 /* This file is part of Shapes.
3 * Shapes is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 3 of the License, or
8 * Shapes is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with Shapes. If not, see <http://www.gnu.org/licenses/>.
16 * Copyright 2008 Henrik Tidefelt
22 #include "shapesexceptions.h"
23 #include "lighttypes.h"
26 using namespace Shapes
;
30 RefCountPtr
< const Lang::Value
>
31 Ast::PlusPlusExpr::impl( DUMMYANDREF( const Lang::Float
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
35 throw Exceptions::OutOfRange( expr1_
->loc( ), strrefdup( "Arguments to Pythagorean addition must be positive." ) );
39 throw Exceptions::OutOfRange( expr2_
->loc( ), strrefdup( "Arguments to Pythagorean addition must be positive." ) );
41 return RefCountPtr
< const Lang::Value
>( new Lang::Float( sqrt( (arg1
->val_
)*(arg1
->val_
) + (arg2
->val_
)*(arg2
->val_
) ) ) );
44 RefCountPtr
< const Lang::Value
>
45 Ast::PlusPlusExpr::impl( DUMMYANDREF( const Lang::Length
) arg1
, DUMMYANDREF( const Lang::Length
) arg2
, const Kernel::PassedDyn
& dyn
) const
47 Concrete::Length tmp1
= arg1
->get( );
48 Concrete::Length tmp2
= arg2
->get( );
51 throw Exceptions::OutOfRange( expr1_
->loc( ), strrefdup( "Arguments to Pythagorean addition must be positive." ) );
55 throw Exceptions::OutOfRange( expr2_
->loc( ), strrefdup( "Arguments to Pythagorean addition must be positive." ) );
57 return RefCountPtr
< const Lang::Value
>( new Lang::Length( hypotPhysical( tmp1
, tmp2
) ) );
61 RefCountPtr
< const Lang::Value
>
62 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::Float
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
66 throw Exceptions::OutOfRange( expr1_
->loc( ), strrefdup( "Arguments to Pythagorean subtraction must be positive." ) );
70 throw Exceptions::OutOfRange( expr2_
->loc( ), strrefdup( "Arguments to Pythagorean subtraction must be positive." ) );
72 if( arg1
->val_
< arg2
->val_
)
74 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "The first argument bust be greater than the second one in Pythagorean subtraction." ) );
76 return RefCountPtr
< const Lang::Value
>( new Lang::Float( sqrt( (arg1
->val_
)*(arg1
->val_
) - (arg2
->val_
)*(arg2
->val_
) ) ) );
79 RefCountPtr
< const Lang::Value
>
80 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::Length
) arg1
, DUMMYANDREF( const Lang::Length
) arg2
, const Kernel::PassedDyn
& dyn
) const
82 Concrete::Length tmp1
= arg1
->get( );
83 Concrete::Length tmp2
= arg2
->get( );
86 throw Exceptions::OutOfRange( expr1_
->loc( ), strrefdup( "Arguments to Pythagorean subtraction must be positive." ) );
90 throw Exceptions::OutOfRange( expr2_
->loc( ), strrefdup( "Arguments to Pythagorean subtraction must be positive." ) );
94 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "The first argument bust be greater than the second one in Pythagorean subtraction." ) );
96 return RefCountPtr
< const Lang::Value
>( new Lang::Length( sqrtPhysical( tmp1
*tmp1
- tmp2
*tmp2
) ) );
99 RefCountPtr
< const Lang::Value
>
100 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::Coords2D
) arg1
, DUMMYANDREF( const Lang::Coords2D
) arg2
, const Kernel::PassedDyn
& dyn
) const
102 return Kernel::ValueRef( new Lang::Connection2D( arg1
, arg2
) );
105 RefCountPtr
< const Lang::Value
>
106 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::Coords2D
) arg1
, DUMMYANDREF( const Lang::PathPoint2D
) arg2
, const Kernel::PassedDyn
& dyn
) const
108 return Kernel::ValueRef( new Lang::Connection2D( arg1
, arg2
) );
111 RefCountPtr
< const Lang::Value
>
112 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::PathPoint2D
) arg1
, DUMMYANDREF( const Lang::Coords2D
) arg2
, const Kernel::PassedDyn
& dyn
) const
114 return Kernel::ValueRef( new Lang::Connection2D( arg1
, arg2
) );
117 RefCountPtr
< const Lang::Value
>
118 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::Coords2D
) arg1
, DUMMYANDREF( const Lang::Path2D
) arg2
, const Kernel::PassedDyn
& dyn
) const
120 if( arg2
->isClosed( ) )
122 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Closed subpaths cannot be connected with." ) );
124 return Kernel::ValueRef( new Lang::Connection2D( arg1
, arg2
) );
127 RefCountPtr
< const Lang::Value
>
128 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::Path2D
) arg1
, DUMMYANDREF( const Lang::Coords2D
) arg2
, const Kernel::PassedDyn
& dyn
) const
130 if( arg1
->isClosed( ) )
132 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Closed subpaths cannot be connected with." ) );
134 return Kernel::ValueRef( new Lang::Connection2D( arg1
, arg2
) );
137 RefCountPtr
< const Lang::Value
>
138 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::PathPoint2D
) arg1
, DUMMYANDREF( const Lang::PathPoint2D
) arg2
, const Kernel::PassedDyn
& dyn
) const
140 return Kernel::ValueRef( new Lang::Connection2D( arg1
, arg2
) );
143 RefCountPtr
< const Lang::Value
>
144 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::PathPoint2D
) arg1
, DUMMYANDREF( const Lang::Path2D
) arg2
, const Kernel::PassedDyn
& dyn
) const
146 if( arg2
->isClosed( ) )
148 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Closed subpaths cannot be connected with." ) );
150 return Kernel::ValueRef( new Lang::Connection2D( arg1
, arg2
) );
153 RefCountPtr
< const Lang::Value
>
154 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::Path2D
) arg1
, DUMMYANDREF( const Lang::PathPoint2D
) arg2
, const Kernel::PassedDyn
& dyn
) const
156 if( arg1
->isClosed( ) )
158 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Closed subpaths cannot be connected with." ) );
160 return Kernel::ValueRef( new Lang::Connection2D( arg1
, arg2
) );
163 RefCountPtr
< const Lang::Value
>
164 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::Path2D
) arg1
, DUMMYANDREF( const Lang::Path2D
) arg2
, const Kernel::PassedDyn
& dyn
) const
166 if( arg1
->isClosed( ) )
168 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Closed subpaths cannot be connected with." ) );
170 if( arg2
->isClosed( ) )
172 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Closed subpaths cannot be connected with." ) );
174 return Kernel::ValueRef( new Lang::Connection2D( arg1
, arg2
) );
177 RefCountPtr
< const Lang::Value
>
178 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::Coords3D
) arg1
, DUMMYANDREF( const Lang::Coords3D
) arg2
, const Kernel::PassedDyn
& dyn
) const
180 return Kernel::ValueRef( new Lang::Connection3D( RefCountPtr
< Lang::Path3D
>( new Lang::SinglePointPath3D( arg1
) ),
181 RefCountPtr
< Lang::Path3D
>( new Lang::SinglePointPath3D( arg2
) ) ) );
184 RefCountPtr
< const Lang::Value
>
185 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::Coords3D
) arg1
, DUMMYANDREF( const Lang::PathPoint3D
) arg2
, const Kernel::PassedDyn
& dyn
) const
187 return Kernel::ValueRef( new Lang::Connection3D( RefCountPtr
< Lang::Path3D
>( new Lang::SinglePointPath3D( arg1
) ),
188 RefCountPtr
< Lang::Path3D
>( new Lang::SinglePointPath3D( arg2
) ) ) );
191 RefCountPtr
< const Lang::Value
>
192 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::PathPoint3D
) arg1
, DUMMYANDREF( const Lang::Coords3D
) arg2
, const Kernel::PassedDyn
& dyn
) const
194 return Kernel::ValueRef( new Lang::Connection3D( RefCountPtr
< Lang::Path3D
>( new Lang::SinglePointPath3D( arg1
) ),
195 RefCountPtr
< Lang::Path3D
>( new Lang::SinglePointPath3D( arg2
) ) ) );
198 RefCountPtr
< const Lang::Value
>
199 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::Coords3D
) arg1
, DUMMYANDREF( const Lang::Path3D
) arg2
, const Kernel::PassedDyn
& dyn
) const
201 if( arg2
->isClosed( ) )
203 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Closed subpaths cannot be connected with." ) );
205 return Kernel::ValueRef( new Lang::Connection3D( RefCountPtr
< Lang::Path3D
>( new Lang::SinglePointPath3D( arg1
) ), arg2
) );
208 RefCountPtr
< const Lang::Value
>
209 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::Path3D
) arg1
, DUMMYANDREF( const Lang::Coords3D
) arg2
, const Kernel::PassedDyn
& dyn
) const
211 if( arg1
->isClosed( ) )
213 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Closed subpaths cannot be connected with." ) );
215 return Kernel::ValueRef( new Lang::Connection3D( arg1
, RefCountPtr
< Lang::Path3D
>( new Lang::SinglePointPath3D( arg2
) ) ) );
218 RefCountPtr
< const Lang::Value
>
219 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::PathPoint3D
) arg1
, DUMMYANDREF( const Lang::PathPoint3D
) arg2
, const Kernel::PassedDyn
& dyn
) const
221 return Kernel::ValueRef( new Lang::Connection3D( RefCountPtr
< Lang::Path3D
>( new Lang::SinglePointPath3D( arg1
) ),
222 RefCountPtr
< Lang::Path3D
>( new Lang::SinglePointPath3D( arg2
) ) ) );
225 RefCountPtr
< const Lang::Value
>
226 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::PathPoint3D
) arg1
, DUMMYANDREF( const Lang::Path3D
) arg2
, const Kernel::PassedDyn
& dyn
) const
228 if( arg2
->isClosed( ) )
230 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Closed subpaths cannot be connected with." ) );
232 return Kernel::ValueRef( new Lang::Connection3D( RefCountPtr
< Lang::Path3D
>( new Lang::SinglePointPath3D( arg1
) ), arg2
) );
235 RefCountPtr
< const Lang::Value
>
236 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::Path3D
) arg1
, DUMMYANDREF( const Lang::PathPoint3D
) arg2
, const Kernel::PassedDyn
& dyn
) const
238 if( arg1
->isClosed( ) )
240 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Closed subpaths cannot be connected with." ) );
242 return Kernel::ValueRef( new Lang::Connection3D( arg1
, RefCountPtr
< Lang::Path3D
>( new Lang::SinglePointPath3D( arg2
) ) ) );
245 RefCountPtr
< const Lang::Value
>
246 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::Path3D
) arg1
, DUMMYANDREF( const Lang::Path3D
) arg2
, const Kernel::PassedDyn
& dyn
) const
248 if( arg1
->isClosed( ) )
250 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Closed subpaths cannot be connected with." ) );
252 if( arg2
->isClosed( ) )
254 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Closed subpaths cannot be connected with." ) );
256 return Kernel::ValueRef( new Lang::Connection3D( arg1
, arg2
) );
259 RefCountPtr
< const Lang::Value
>
260 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::PathSlider2D
) arg1
, DUMMYANDREF( const Lang::PathSlider2D
) arg2
, const Kernel::PassedDyn
& dyn
) const
262 RefCountPtr
< const Lang::ElementaryPath2D
> path
= arg1
->getPath( );
263 if( path
!= arg2
->getPath( ) )
265 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Cannot connect sliders that belong to different paths." ) );
268 if( arg1
->getFront( ) != NullPtr
< const Lang::Value
>( ) )
270 throw Exceptions::OutOfRange( expr1_
->loc( ), strrefdup( "When connecting sliders, the rear slider cannot have a front handle." ) );
272 if( arg2
->getRear( ) != NullPtr
< const Lang::Value
>( ) )
274 throw Exceptions::OutOfRange( expr2_
->loc( ), strrefdup( "When connecting sliders, the front slider cannot have a rear handle." ) );
277 if( arg1
->getRear( ) == NullPtr
< const Lang::Value
>( ) &&
278 arg2
->getFront( ) == NullPtr
< const Lang::Value
>( ) )
280 return path
->subpath( arg1
->getTime( ), arg2
->getTime( ) );
283 return Kernel::ValueRef( new Lang::HeadedPath2D( arg1
->getRear( ), path
->subpath( arg1
->getTime( ), arg2
->getTime( ) ), arg2
->getFront( ) ) );
286 RefCountPtr
< const Lang::Value
>
287 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::PathSlider3D
) arg1
, DUMMYANDREF( const Lang::PathSlider3D
) arg2
, const Kernel::PassedDyn
& dyn
) const
289 RefCountPtr
< const Lang::ElementaryPath3D
> path
= arg1
->getPath( );
290 if( path
!= arg2
->getPath( ) )
292 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Cannot connect sliders that belong to different paths." ) );
295 if( arg1
->getFront( ) != NullPtr
< const Lang::Value
>( ) )
297 throw Exceptions::OutOfRange( expr1_
->loc( ), strrefdup( "When connecting sliders, the rear slider cannot have a front handle." ) );
299 if( arg2
->getRear( ) != NullPtr
< const Lang::Value
>( ) )
301 throw Exceptions::OutOfRange( expr2_
->loc( ), strrefdup( "When connecting sliders, the front slider cannot have a rear handle." ) );
304 if( arg1
->getRear( ) == NullPtr
< const Lang::Value
>( ) &&
305 arg2
->getFront( ) == NullPtr
< const Lang::Value
>( ) )
307 return path
->subpath( arg1
->getTime( ), arg2
->getTime( ) );
310 return Kernel::ValueRef( new Lang::HeadedPath3D( arg1
->getRear( ), path
->subpath( arg1
->getTime( ), arg2
->getTime( ) ), arg2
->getFront( ) ) );
315 RefCountPtr
< const Lang::Value
>
316 Ast::AmpersandExpr::impl( DUMMYANDREF( const Lang::Path2D
) arg1
, DUMMYANDREF( const Lang::Path2D
) arg2
, const Kernel::PassedDyn
& dyn
) const
318 Lang::MultiPath2D
* res
= new Lang::MultiPath2D
;
319 res
->push_back( arg1
);
320 res
->push_back( arg2
);
321 return RefCountPtr
< Lang::Value
>( res
);
324 RefCountPtr
< const Lang::Value
>
325 Ast::AmpersandExpr::impl( DUMMYANDREF( const Lang::MultiPath2D
) arg1
, DUMMYANDREF( const Lang::Path2D
) arg2
, const Kernel::PassedDyn
& dyn
) const
327 Lang::MultiPath2D
* res
= arg1
->clone( );
328 res
->push_back( arg2
);
329 return RefCountPtr
< Lang::Value
>( res
);
332 RefCountPtr
< const Lang::Value
>
333 Ast::AmpersandExpr::impl( DUMMYANDREF( const Lang::Path2D
) arg1
, DUMMYANDREF( const Lang::MultiPath2D
) arg2
, const Kernel::PassedDyn
& dyn
) const
335 Lang::MultiPath2D
* res
= arg2
->clone( );
336 res
->push_front( arg1
);
337 return RefCountPtr
< Lang::Value
>( res
);
340 RefCountPtr
< const Lang::Value
>
341 Ast::AmpersandExpr::impl( DUMMYANDREF( const Lang::MultiPath2D
) arg1
, DUMMYANDREF( const Lang::MultiPath2D
) arg2
, const Kernel::PassedDyn
& dyn
) const
343 Lang::MultiPath2D
* res
= arg1
->clone( );
344 typedef typeof( *arg2
) ListType
;
345 for( ListType::const_iterator i
= arg2
->begin( ); i
!= arg2
->end( ); ++i
)
347 res
->push_back( *i
);
349 return RefCountPtr
< Lang::Value
>( res
);
352 RefCountPtr
< const Lang::Value
>
353 Ast::AmpersandExpr::impl( DUMMYANDREF( const Lang::Path3D
) arg1
, DUMMYANDREF( const Lang::Path3D
) arg2
, const Kernel::PassedDyn
& dyn
) const
355 Lang::MultiPath3D
* res
= new Lang::MultiPath3D
;
356 res
->push_back( arg1
);
357 res
->push_back( arg2
);
358 return RefCountPtr
< Lang::Value
>( res
);
361 RefCountPtr
< const Lang::Value
>
362 Ast::AmpersandExpr::impl( DUMMYANDREF( const Lang::MultiPath3D
) arg1
, DUMMYANDREF( const Lang::Path3D
) arg2
, const Kernel::PassedDyn
& dyn
) const
364 Lang::MultiPath3D
* res
= arg1
->clone( );
365 res
->push_back( arg2
);
366 return RefCountPtr
< Lang::Value
>( res
);
369 RefCountPtr
< const Lang::Value
>
370 Ast::AmpersandExpr::impl( DUMMYANDREF( const Lang::Path3D
) arg1
, DUMMYANDREF( const Lang::MultiPath3D
) arg2
, const Kernel::PassedDyn
& dyn
) const
372 Lang::MultiPath3D
* res
= arg2
->clone( );
373 res
->push_front( arg1
);
374 return RefCountPtr
< Lang::Value
>( res
);
377 RefCountPtr
< const Lang::Value
>
378 Ast::AmpersandExpr::impl( DUMMYANDREF( const Lang::MultiPath3D
) arg1
, DUMMYANDREF( const Lang::MultiPath3D
) arg2
, const Kernel::PassedDyn
& dyn
) const
380 Lang::MultiPath3D
* res
= arg1
->clone( );
381 typedef typeof( *arg2
) ListType
;
382 for( ListType::const_iterator i
= arg2
->begin( ); i
!= arg2
->end( ); ++i
)
384 res
->push_back( *i
);
386 return RefCountPtr
< Lang::Value
>( res
);
389 RefCountPtr
< const Lang::Value
>
390 Ast::AmpersandExpr::impl( DUMMYANDREF( const Lang::DynamicBindings
) arg1
, DUMMYANDREF( const Lang::DynamicBindings
) arg2
, const Kernel::PassedDyn
& dyn
) const
392 if( arg1
== Lang::THE_NULL_DYNAMIC_BINDINGS
)
396 if( arg2
== Lang::THE_NULL_DYNAMIC_BINDINGS
)
400 return RefCountPtr
< Lang::DynamicBindings
>( new Lang::DynamicBindingsPair( arg1
, arg2
) );
403 RefCountPtr
< const Lang::Value
>
404 Ast::AmpersandExpr::impl( DUMMYANDREF( const Lang::Drawable2D
) arg1
, DUMMYANDREF( const Lang::Drawable2D
) arg2
, const Kernel::PassedDyn
& dyn
) const
406 RefCountPtr
< const Kernel::GraphicsState
> metaState
= dyn
->getGraphicsState( );
407 return RefCountPtr
< Lang::Group2D
>( new Lang::GroupPair2D
409 RefCountPtr
< Lang::Group2D
>( new Lang::GroupPair2D
416 RefCountPtr
< const Lang::Value
>
417 Ast::AmpersandExpr::impl( DUMMYANDREF( const Lang::Group2D
) arg1
, DUMMYANDREF( const Lang::Drawable2D
) arg2
, const Kernel::PassedDyn
& dyn
) const
419 return RefCountPtr
< Lang::Group2D
>( new Lang::GroupPair2D( arg2
, arg1
, dyn
->getGraphicsState( ) ) );
422 RefCountPtr
< const Lang::Value
>
423 Ast::AmpersandExpr::impl( DUMMYANDREF( const Lang::Drawable3D
) arg1
, DUMMYANDREF( const Lang::Drawable3D
) arg2
, const Kernel::PassedDyn
& dyn
) const
425 RefCountPtr
< const Kernel::GraphicsState
> metaState
= dyn
->getGraphicsState( );
426 return RefCountPtr
< Lang::Group3D
>( new Lang::GroupPair3D
428 RefCountPtr
< Lang::Group3D
>( new Lang::GroupPair3D
435 RefCountPtr
< const Lang::Value
>
436 Ast::AmpersandExpr::impl( DUMMYANDREF( const Lang::Group3D
) arg1
, DUMMYANDREF( const Lang::Drawable3D
) arg2
, const Kernel::PassedDyn
& dyn
) const
438 return RefCountPtr
< Lang::Group3D
>( new Lang::GroupPair3D( arg2
, arg1
, dyn
->getGraphicsState( ) ) );
442 RefCountPtr
< const Lang::Value
>
443 Ast::AmpersandMoreExpr::impl( DUMMYANDREF( const Lang::DynamicBindings
) arg1
, DUMMYANDREF( const Lang::DynamicBindings
) arg2
, const Kernel::PassedDyn
& dyn
) const
445 if( arg1
== Lang::THE_NULL_DYNAMIC_BINDINGS
)
449 if( arg2
== Lang::THE_NULL_DYNAMIC_BINDINGS
)
453 return RefCountPtr
< Lang::DynamicBindings
>( new Lang::DynamicBindingsPair( arg1
, arg2
, true ) ); /* True means "second overrides first" */
457 RefCountPtr
< const Lang::Value
>
458 Ast::PlusExpr::impl( DUMMYANDREF( const Lang::Float
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
460 return RefCountPtr
< const Lang::Value
>( new Lang::Float( arg1
->val_
+ arg2
->val_
) );
463 RefCountPtr
< const Lang::Value
>
464 Ast::PlusExpr::impl( DUMMYANDREF( const Lang::Integer
) arg1
, DUMMYANDREF( const Lang::Integer
) arg2
, const Kernel::PassedDyn
& dyn
) const
466 return RefCountPtr
< const Lang::Value
>( new Lang::Integer( arg1
->val_
+ arg2
->val_
) );
469 RefCountPtr
< const Lang::Value
>
470 Ast::PlusExpr::impl( DUMMYANDREF( const Lang::Length
) arg1
, DUMMYANDREF( const Lang::Length
) arg2
, const Kernel::PassedDyn
& dyn
) const
472 return RefCountPtr
< const Lang::Value
>( new Lang::Length( *arg1
+ *arg2
) );
475 RefCountPtr
< const Lang::Value
>
476 Ast::PlusExpr::impl( DUMMYANDREF( const Lang::FloatPair
) arg1
, DUMMYANDREF( const Lang::FloatPair
) arg2
, const Kernel::PassedDyn
& dyn
) const
478 return RefCountPtr
< const Lang::Value
>( new Lang::FloatPair( arg1
->x_
+ arg2
->x_
, arg1
->y_
+ arg2
->y_
) );
481 RefCountPtr
< const Lang::Value
>
482 Ast::PlusExpr::impl( DUMMYANDREF( const Lang::Coords2D
) arg1
, DUMMYANDREF( const Lang::Coords2D
) arg2
, const Kernel::PassedDyn
& dyn
) const
484 return RefCountPtr
< const Lang::Value
>( new Lang::Coords2D( arg1
->x_
+ arg2
->x_
, arg1
->y_
+ arg2
->y_
) );
487 RefCountPtr
< const Lang::Value
>
488 Ast::PlusExpr::impl( DUMMYANDREF( const Lang::FloatTriple
) arg1
, DUMMYANDREF( const Lang::FloatTriple
) arg2
, const Kernel::PassedDyn
& dyn
) const
490 return RefCountPtr
< const Lang::Value
>( new Lang::FloatTriple( arg1
->x_
+ arg2
->x_
, arg1
->y_
+ arg2
->y_
, arg1
->z_
+ arg2
->z_
) );
493 RefCountPtr
< const Lang::Value
>
494 Ast::PlusExpr::impl( DUMMYANDREF( const Lang::Coords3D
) arg1
, DUMMYANDREF( const Lang::Coords3D
) arg2
, const Kernel::PassedDyn
& dyn
) const
496 return RefCountPtr
< const Lang::Value
>( new Lang::Coords3D( arg1
->x_
+ arg2
->x_
, arg1
->y_
+ arg2
->y_
, arg1
->z_
+ arg2
->z_
) );
499 RefCountPtr
< const Lang::Value
>
500 Ast::PlusExpr::impl( DUMMYANDREF( const Lang::String
) arg1
, DUMMYANDREF( const Lang::String
) arg2
, const Kernel::PassedDyn
& dyn
) const
502 const char * src1
= arg1
->val_
.getPtr( );
503 const char * src2
= arg2
->val_
.getPtr( );
504 int l1
= strlen( src1
);
505 char * mem
= new char[ l1
+ strlen( src2
) + 1 ];
507 strcpy( mem
+ l1
, src2
);
508 return RefCountPtr
< const Lang::Value
>( new Lang::String( mem
, false ) );
511 RefCountPtr
< const Lang::Value
>
512 Ast::PlusExpr::impl( DUMMYANDREF( const Lang::Dash
) arg1
, DUMMYANDREF( const Lang::Length
) arg2
, const Kernel::PassedDyn
& dyn
) const
514 return arg1
->shifted( arg2
->get( ) );
517 RefCountPtr
< const Lang::Value
>
518 Ast::PlusExpr::impl( DUMMYANDREF( const Lang::Length
) arg1
, DUMMYANDREF( const Lang::Dash
) arg2
, const Kernel::PassedDyn
& dyn
) const
520 return arg2
->shifted( arg1
->get( ) );
523 RefCountPtr
< const Lang::Value
>
524 Ast::PlusExpr::impl( DUMMYANDREF( const Lang::PathSlider2D
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
526 return arg1
->move_time( Concrete::Time( arg2
->val_
) );
529 RefCountPtr
< const Lang::Value
>
530 Ast::PlusExpr::impl( DUMMYANDREF( const Lang::PathSlider2D
) arg1
, DUMMYANDREF( const Lang::Length
) arg2
, const Kernel::PassedDyn
& dyn
) const
532 return arg1
->move_length( arg2
->get( ) );
535 RefCountPtr
< const Lang::Value
>
536 Ast::PlusExpr::impl( DUMMYANDREF( const Lang::PathSlider3D
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
538 return arg1
->move_time( Concrete::Time( arg2
->val_
) );
541 RefCountPtr
< const Lang::Value
>
542 Ast::PlusExpr::impl( DUMMYANDREF( const Lang::PathSlider3D
) arg1
, DUMMYANDREF( const Lang::Length
) arg2
, const Kernel::PassedDyn
& dyn
) const
544 return arg1
->move_length( arg2
->get( ) );
547 RefCountPtr
< const Lang::Value
>
548 Ast::PlusExpr::impl( DUMMYANDREF( const Lang::RGB
) arg1
, DUMMYANDREF( const Lang::RGB
) arg2
, const Kernel::PassedDyn
& dyn
) const
550 return RefCountPtr
< const Lang::Value
>( new Lang::RGB( arg1
->components( ).add( arg2
->components( ), loc( ) ) ) );
553 RefCountPtr
< const Lang::Value
>
554 Ast::PlusExpr::impl( DUMMYANDREF( const Lang::Gray
) arg1
, DUMMYANDREF( const Lang::Gray
) arg2
, const Kernel::PassedDyn
& dyn
) const
556 return RefCountPtr
< const Lang::Value
>( new Lang::Gray( arg1
->components( ).add( arg2
->components( ), loc( ) ) ) );
559 RefCountPtr
< const Lang::Value
>
560 Ast::PlusExpr::impl( DUMMYANDREF( const Lang::SpecularReflection
) arg1
, DUMMYANDREF( const Lang::SpecularReflection
) arg2
, const Kernel::PassedDyn
& dyn
) const
562 return RefCountPtr
< const Lang::Value
>( new Lang::SpecularReflectionPair( arg1
, arg2
) );
566 RefCountPtr
< const Lang::Value
>
567 Ast::MinusExpr::impl( DUMMYANDREF( const Lang::Float
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
569 return RefCountPtr
< const Lang::Value
>( new Lang::Float( arg1
->val_
- arg2
->val_
) );
572 RefCountPtr
< const Lang::Value
>
573 Ast::MinusExpr::impl( DUMMYANDREF( const Lang::Integer
) arg1
, DUMMYANDREF( const Lang::Integer
) arg2
, const Kernel::PassedDyn
& dyn
) const
575 return RefCountPtr
< const Lang::Value
>( new Lang::Integer( arg1
->val_
- arg2
->val_
) );
578 RefCountPtr
< const Lang::Value
>
579 Ast::MinusExpr::impl( DUMMYANDREF( const Lang::Length
) arg1
, DUMMYANDREF( const Lang::Length
) arg2
, const Kernel::PassedDyn
& dyn
) const
581 return RefCountPtr
< const Lang::Value
>( new Lang::Length( *arg1
- *arg2
) );
584 RefCountPtr
< const Lang::Value
>
585 Ast::MinusExpr::impl( DUMMYANDREF( const Lang::FloatPair
) arg1
, DUMMYANDREF( const Lang::FloatPair
) arg2
, const Kernel::PassedDyn
& dyn
) const
587 return RefCountPtr
< const Lang::Value
>( new Lang::FloatPair( arg1
->x_
- arg2
->x_
, arg1
->y_
- arg2
->y_
) );
590 RefCountPtr
< const Lang::Value
>
591 Ast::MinusExpr::impl( DUMMYANDREF( const Lang::Coords2D
) arg1
, DUMMYANDREF( const Lang::Coords2D
) arg2
, const Kernel::PassedDyn
& dyn
) const
593 return RefCountPtr
< const Lang::Value
>( new Lang::Coords2D( arg1
->x_
- arg2
->x_
, arg1
->y_
- arg2
->y_
) );
596 RefCountPtr
< const Lang::Value
>
597 Ast::MinusExpr::impl( DUMMYANDREF( const Lang::FloatTriple
) arg1
, DUMMYANDREF( const Lang::FloatTriple
) arg2
, const Kernel::PassedDyn
& dyn
) const
599 return RefCountPtr
< const Lang::Value
>( new Lang::FloatTriple( arg1
->x_
- arg2
->x_
, arg1
->y_
- arg2
->y_
, arg1
->z_
- arg2
->z_
) );
602 RefCountPtr
< const Lang::Value
>
603 Ast::MinusExpr::impl( DUMMYANDREF( const Lang::Coords3D
) arg1
, DUMMYANDREF( const Lang::Coords3D
) arg2
, const Kernel::PassedDyn
& dyn
) const
605 return RefCountPtr
< const Lang::Value
>( new Lang::Coords3D( arg1
->x_
- arg2
->x_
, arg1
->y_
- arg2
->y_
, arg1
->z_
- arg2
->z_
) );
608 RefCountPtr
< const Lang::Value
>
609 Ast::MinusExpr::impl( DUMMYANDREF( const Lang::PathSlider2D
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
611 return arg1
->move_time( Concrete::Time( - arg2
->val_
) );
614 RefCountPtr
< const Lang::Value
>
615 Ast::MinusExpr::impl( DUMMYANDREF( const Lang::PathSlider2D
) arg1
, DUMMYANDREF( const Lang::Length
) arg2
, const Kernel::PassedDyn
& dyn
) const
617 return arg1
->move_length( - arg2
->get( ) );
620 RefCountPtr
< const Lang::Value
>
621 Ast::MinusExpr::impl( DUMMYANDREF( const Lang::PathSlider3D
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
623 return arg1
->move_time( Concrete::Time( - arg2
->val_
) );
626 RefCountPtr
< const Lang::Value
>
627 Ast::MinusExpr::impl( DUMMYANDREF( const Lang::PathSlider3D
) arg1
, DUMMYANDREF( const Lang::Length
) arg2
, const Kernel::PassedDyn
& dyn
) const
629 return arg1
->move_length( - arg2
->get( ) );
633 RefCountPtr
< const Lang::Value
>
634 Ast::AngleExpr::impl( DUMMYANDREF( const Lang::Float
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
636 double tmp
= arg1
->val_
* arg2
->val_
;
639 return RefCountPtr
< const Lang::Value
>( new Lang::Float( 0 ) );
643 return RefCountPtr
< const Lang::Value
>( new Lang::Float( M_PI
) );
645 return RefCountPtr
< const Lang::Value
>( new Lang::Float( M_PI_2
) );
648 RefCountPtr
< const Lang::Value
>
649 Ast::AngleExpr::impl( DUMMYANDREF( const Lang::Float
) arg1
, DUMMYANDREF( const Lang::Length
) arg2
, const Kernel::PassedDyn
& dyn
) const
651 Concrete::Length tmp
= arg1
->val_
* arg2
->get( );
654 return RefCountPtr
< const Lang::Value
>( new Lang::Float( 0 ) );
658 return RefCountPtr
< const Lang::Value
>( new Lang::Float( M_PI
) );
660 return RefCountPtr
< const Lang::Value
>( new Lang::Float( M_PI_2
) );
663 RefCountPtr
< const Lang::Value
>
664 Ast::AngleExpr::impl( DUMMYANDREF( const Lang::Length
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
666 Concrete::Length tmp
= arg1
->get( ) * arg2
->val_
;
669 return RefCountPtr
< const Lang::Value
>( new Lang::Float( 0 ) );
673 return RefCountPtr
< const Lang::Value
>( new Lang::Float( M_PI
) );
675 return RefCountPtr
< const Lang::Value
>( new Lang::Float( M_PI_2
) );
678 RefCountPtr
< const Lang::Value
>
679 Ast::AngleExpr::impl( DUMMYANDREF( const Lang::Length
) arg1
, DUMMYANDREF( const Lang::Length
) arg2
, const Kernel::PassedDyn
& dyn
) const
681 Concrete::LengthSquared tmp
= arg1
->get( ) * arg2
->get( );
684 return RefCountPtr
< const Lang::Value
>( new Lang::Float( 0 ) );
688 return RefCountPtr
< const Lang::Value
>( new Lang::Float( M_PI
) );
690 return RefCountPtr
< const Lang::Value
>( new Lang::Float( M_PI_2
) );
693 RefCountPtr
< const Lang::Value
>
694 Ast::AngleExpr::impl( DUMMYANDREF( const Lang::FloatPair
) arg1
, DUMMYANDREF( const Lang::FloatPair
) arg2
, const Kernel::PassedDyn
& dyn
) const
696 const double x1
= arg1
->x_
;
697 const double y1
= arg1
->y_
;
698 const double x2
= arg2
->x_
;
699 const double y2
= arg2
->y_
;
700 double norm1
= hypot( x1
, y1
);
701 double norm2
= hypot( x2
, y2
);
702 if( norm1
== 0 || norm2
== 0 )
704 return RefCountPtr
< const Lang::Value
>( new Lang::Float( M_PI_2
) );
706 return RefCountPtr
< const Lang::Value
>( new Lang::Float( acos( ( (x1
/norm1
) * (x2
/norm2
) + (y1
/norm1
) * (y2
/norm2
) ) ) ) );
709 RefCountPtr
< const Lang::Value
>
710 Ast::AngleExpr::impl( DUMMYANDREF( const Lang::FloatPair
) arg1
, DUMMYANDREF( const Lang::Coords2D
) arg2
, const Kernel::PassedDyn
& dyn
) const
712 const double x1
= arg1
->x_
;
713 const double y1
= arg1
->y_
;
714 const Concrete::Length x2
= arg2
->x_
.get( );
715 const Concrete::Length y2
= arg2
->y_
.get( );
716 double norm1
= hypot( x1
, y1
);
717 Concrete::Length norm2
= hypotPhysical( x2
, y2
);
718 if( norm1
== 0 || norm2
== 0 )
720 return RefCountPtr
< const Lang::Value
>( new Lang::Float( M_PI_2
) );
722 return RefCountPtr
< const Lang::Value
>( new Lang::Float( acos( ( (x1
/norm1
) * (x2
/norm2
) + (y1
/norm1
) * (y2
/norm2
) ) ) ) );
725 RefCountPtr
< const Lang::Value
>
726 Ast::AngleExpr::impl( DUMMYANDREF( const Lang::Coords2D
) arg1
, DUMMYANDREF( const Lang::FloatPair
) arg2
, const Kernel::PassedDyn
& dyn
) const
728 const Concrete::Length x1
= arg1
->x_
.get( );
729 const Concrete::Length y1
= arg1
->y_
.get( );
730 const double x2
= arg2
->x_
;
731 const double y2
= arg2
->y_
;
732 Concrete::Length norm1
= hypotPhysical( x1
, y1
);
733 double norm2
= hypot( x2
, y2
);
734 if( norm1
== 0 || norm2
== 0 )
736 return RefCountPtr
< const Lang::Value
>( new Lang::Float( M_PI_2
) );
738 return RefCountPtr
< const Lang::Value
>( new Lang::Float( acos( ( (x1
/norm1
) * (x2
/norm2
) + (y1
/norm1
) * (y2
/norm2
) ) ) ) );
741 RefCountPtr
< const Lang::Value
>
742 Ast::AngleExpr::impl( DUMMYANDREF( const Lang::Coords2D
) arg1
, DUMMYANDREF( const Lang::Coords2D
) arg2
, const Kernel::PassedDyn
& dyn
) const
744 const Concrete::Length x1
= arg1
->x_
.get( );
745 const Concrete::Length y1
= arg1
->y_
.get( );
746 const Concrete::Length x2
= arg2
->x_
.get( );
747 const Concrete::Length y2
= arg2
->y_
.get( );
748 Concrete::Length norm1
= hypotPhysical( x1
, y1
);
749 Concrete::Length norm2
= hypotPhysical( x2
, y2
);
750 if( norm1
== 0 || norm2
== 0 )
752 return RefCountPtr
< const Lang::Value
>( new Lang::Float( M_PI_2
) );
754 return RefCountPtr
< const Lang::Value
>( new Lang::Float( acos( ( (x1
/norm1
) * (x2
/norm2
) + (y1
/norm1
) * (y2
/norm2
) ) ) ) );
757 RefCountPtr
< const Lang::Value
>
758 Ast::AngleExpr::impl( DUMMYANDREF( const Lang::FloatTriple
) arg1
, DUMMYANDREF( const Lang::FloatTriple
) arg2
, const Kernel::PassedDyn
& dyn
) const
760 const double x1
= arg1
->x_
;
761 const double y1
= arg1
->y_
;
762 const double z1
= arg1
->z_
;
763 const double x2
= arg2
->x_
;
764 const double y2
= arg2
->y_
;
765 const double z2
= arg2
->z_
;
766 double norm1
= Concrete::Scalar::hypot3( x1
, y1
, z1
);
767 double norm2
= Concrete::Scalar::hypot3( x2
, y2
, z2
);
768 if( norm1
== 0 || norm2
== 0 )
770 return RefCountPtr
< const Lang::Value
>( new Lang::Float( M_PI_2
) );
772 return RefCountPtr
< const Lang::Value
>( new Lang::Float( acos( ( (x1
/norm1
) * (x2
/norm2
) + (y1
/norm1
) * (y2
/norm2
) + (z1
/norm1
) * (z2
/norm2
) ) ) ) );
775 RefCountPtr
< const Lang::Value
>
776 Ast::AngleExpr::impl( DUMMYANDREF( const Lang::FloatTriple
) arg1
, DUMMYANDREF( const Lang::Coords3D
) arg2
, const Kernel::PassedDyn
& dyn
) const
778 const double x1
= arg1
->x_
;
779 const double y1
= arg1
->y_
;
780 const double z1
= arg1
->z_
;
781 const Concrete::Length x2
= arg2
->x_
.get( );
782 const Concrete::Length y2
= arg2
->y_
.get( );
783 const Concrete::Length z2
= arg2
->z_
.get( );
784 double norm1
= Concrete::Scalar::hypot3( x1
, y1
, z1
);
785 Concrete::Length norm2
= hypotPhysical( x2
, y2
, z2
);
786 if( norm1
== 0 || norm2
== 0 )
788 return RefCountPtr
< const Lang::Value
>( new Lang::Float( M_PI_2
) );
790 return RefCountPtr
< const Lang::Value
>( new Lang::Float( acos( ( (x1
/norm1
) * (x2
/norm2
) + (y1
/norm1
) * (y2
/norm2
) + (z1
/norm1
) * (z2
/norm2
) ) ) ) );
793 RefCountPtr
< const Lang::Value
>
794 Ast::AngleExpr::impl( DUMMYANDREF( const Lang::Coords3D
) arg1
, DUMMYANDREF( const Lang::FloatTriple
) arg2
, const Kernel::PassedDyn
& dyn
) const
796 const Concrete::Length x1
= arg1
->x_
.get( );
797 const Concrete::Length y1
= arg1
->y_
.get( );
798 const Concrete::Length z1
= arg1
->z_
.get( );
799 const double x2
= arg2
->x_
;
800 const double y2
= arg2
->y_
;
801 const double z2
= arg2
->z_
;
802 Concrete::Length norm1
= hypotPhysical( x1
, y1
, z1
);
803 double norm2
= Concrete::Scalar::hypot3( x2
, y2
, z2
);
804 if( norm1
== 0 || norm2
== 0 )
806 return RefCountPtr
< const Lang::Value
>( new Lang::Float( M_PI_2
) );
808 return RefCountPtr
< const Lang::Value
>( new Lang::Float( acos( ( (x1
/norm1
) * (x2
/norm2
) + (y1
/norm1
) * (y2
/norm2
) + (z1
/norm1
) * (z2
/norm2
) ) ) ) );
811 RefCountPtr
< const Lang::Value
>
812 Ast::AngleExpr::impl( DUMMYANDREF( const Lang::Coords3D
) arg1
, DUMMYANDREF( const Lang::Coords3D
) arg2
, const Kernel::PassedDyn
& dyn
) const
814 const Concrete::Length x1
= arg1
->x_
.get( );
815 const Concrete::Length y1
= arg1
->y_
.get( );
816 const Concrete::Length z1
= arg1
->z_
.get( );
817 const Concrete::Length x2
= arg2
->x_
.get( );
818 const Concrete::Length y2
= arg2
->y_
.get( );
819 const Concrete::Length z2
= arg2
->z_
.get( );
820 Concrete::Length norm1
= hypotPhysical( x1
, y1
, z1
);
821 Concrete::Length norm2
= hypotPhysical( x2
, y2
, z2
);
822 if( norm1
== 0 || norm2
== 0 )
824 return RefCountPtr
< const Lang::Value
>( new Lang::Float( M_PI_2
) );
826 return RefCountPtr
< const Lang::Value
>( new Lang::Float( acos( ( (x1
/norm1
) * (x2
/norm2
) + (y1
/norm1
) * (y2
/norm2
) + (z1
/norm1
) * (z2
/norm2
) ) ) ) );
830 RefCountPtr
< const Lang::Value
>
831 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Float
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
833 return RefCountPtr
< const Lang::Value
>( new Lang::Float( arg1
->val_
* arg2
->val_
) );
836 RefCountPtr
< const Lang::Value
>
837 Ast::StarExpr::impl( DUMMYANDREF( const Lang::FloatPair
) arg1
, DUMMYANDREF( const Lang::FloatPair
) arg2
, const Kernel::PassedDyn
& dyn
) const
839 return RefCountPtr
< const Lang::Value
>( new Lang::Float( arg1
->x_
* arg2
->x_
+ arg1
->y_
* arg2
->y_
) );
842 RefCountPtr
< const Lang::Value
>
843 Ast::StarExpr::impl( DUMMYANDREF( const Lang::FloatPair
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
845 return RefCountPtr
< const Lang::Value
>( new Lang::FloatPair( arg1
->x_
* arg2
->val_
, arg1
->y_
* arg2
->val_
) );
848 RefCountPtr
< const Lang::Value
>
849 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Float
) arg1
, DUMMYANDREF( const Lang::FloatPair
) arg2
, const Kernel::PassedDyn
& dyn
) const
851 return RefCountPtr
< const Lang::Value
>( new Lang::FloatPair( arg1
->val_
* arg2
->x_
, arg1
->val_
* arg2
->y_
) );
854 RefCountPtr
< const Lang::Value
>
855 Ast::StarExpr::impl( DUMMYANDREF( const Lang::FloatTriple
) arg1
, DUMMYANDREF( const Lang::FloatTriple
) arg2
, const Kernel::PassedDyn
& dyn
) const
857 return RefCountPtr
< const Lang::Value
>( new Lang::Float( arg1
->x_
* arg2
->x_
+ arg1
->y_
* arg2
->y_
+ arg1
->z_
* arg2
->z_
) );
860 RefCountPtr
< const Lang::Value
>
861 Ast::StarExpr::impl( DUMMYANDREF( const Lang::FloatTriple
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
863 return RefCountPtr
< const Lang::Value
>( new Lang::FloatTriple( arg1
->x_
* arg2
->val_
, arg1
->y_
* arg2
->val_
, arg1
->z_
* arg2
->val_
) );
866 RefCountPtr
< const Lang::Value
>
867 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Float
) arg1
, DUMMYANDREF( const Lang::FloatTriple
) arg2
, const Kernel::PassedDyn
& dyn
) const
869 return RefCountPtr
< const Lang::Value
>( new Lang::FloatTriple( arg1
->val_
* arg2
->x_
, arg1
->val_
* arg2
->y_
, arg1
->val_
* arg2
->z_
) );
872 RefCountPtr
< const Lang::Value
>
873 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Length
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
875 return RefCountPtr
< const Lang::Value
>( new Lang::Length( arg1
->get( ) * arg2
->val_
) );
878 RefCountPtr
< const Lang::Value
>
879 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Float
) arg1
, DUMMYANDREF( const Lang::Length
) arg2
, const Kernel::PassedDyn
& dyn
) const
881 return RefCountPtr
< const Lang::Value
>( new Lang::Length( arg1
->val_
* arg2
->get( ) ) );
884 RefCountPtr
< const Lang::Value
>
885 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Coords2D
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
887 return RefCountPtr
< const Lang::Value
>( new Lang::Coords2D( arg1
->x_
.get( ) * arg2
->val_
, arg1
->y_
.get( ) * arg2
->val_
) );
890 RefCountPtr
< const Lang::Value
>
891 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Float
) arg1
, DUMMYANDREF( const Lang::Coords2D
) arg2
, const Kernel::PassedDyn
& dyn
) const
893 return RefCountPtr
< const Lang::Value
>( new Lang::Coords2D( arg1
->val_
* arg2
->x_
.get( ), arg1
->val_
* arg2
->y_
.get( ) ) );
896 RefCountPtr
< const Lang::Value
>
897 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Coords2D
) arg1
, DUMMYANDREF( const Lang::FloatPair
) arg2
, const Kernel::PassedDyn
& dyn
) const
899 return RefCountPtr
< const Lang::Value
>( new Lang::Length( arg1
->x_
.get( ) * arg2
->x_
+ arg1
->y_
.get( ) * arg2
->y_
) );
902 RefCountPtr
< const Lang::Value
>
903 Ast::StarExpr::impl( DUMMYANDREF( const Lang::FloatPair
) arg1
, DUMMYANDREF( const Lang::Coords2D
) arg2
, const Kernel::PassedDyn
& dyn
) const
905 return RefCountPtr
< const Lang::Value
>( new Lang::Length( arg1
->x_
* arg2
->x_
.get( ) + arg1
->y_
* arg2
->y_
.get( ) ) );
908 RefCountPtr
< const Lang::Value
>
909 Ast::StarExpr::impl( DUMMYANDREF( const Lang::FloatPair
) arg1
, DUMMYANDREF( const Lang::Length
) arg2
, const Kernel::PassedDyn
& dyn
) const
911 return RefCountPtr
< const Lang::Value
>( new Lang::Coords2D( arg1
->x_
* arg2
->get( ), arg1
->y_
* arg2
->get( ) ) );
914 RefCountPtr
< const Lang::Value
>
915 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Length
) arg1
, DUMMYANDREF( const Lang::FloatPair
) arg2
, const Kernel::PassedDyn
& dyn
) const
917 return RefCountPtr
< const Lang::Value
>( new Lang::Coords2D( arg1
->get( ) * arg2
->x_
, arg1
->get( ) * arg2
->y_
) );
920 RefCountPtr
< const Lang::Value
>
921 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Coords3D
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
923 return RefCountPtr
< const Lang::Value
>( new Lang::Coords3D( arg1
->x_
.get( ) * arg2
->val_
, arg1
->y_
.get( ) * arg2
->val_
, arg1
->z_
.get( ) * arg2
->val_
) );
926 RefCountPtr
< const Lang::Value
>
927 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Float
) arg1
, DUMMYANDREF( const Lang::Coords3D
) arg2
, const Kernel::PassedDyn
& dyn
) const
929 return RefCountPtr
< const Lang::Value
>( new Lang::Coords3D( arg1
->val_
* arg2
->x_
.get( ), arg1
->val_
* arg2
->y_
.get( ), arg1
->val_
* arg2
->z_
.get( ) ) );
932 RefCountPtr
< const Lang::Value
>
933 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Coords3D
) arg1
, DUMMYANDREF( const Lang::FloatTriple
) arg2
, const Kernel::PassedDyn
& dyn
) const
935 return RefCountPtr
< const Lang::Value
>( new Lang::Length( arg1
->x_
.get( ) * arg2
->x_
+ arg1
->y_
.get( ) * arg2
->y_
+ arg1
->z_
.get( ) * arg2
->z_
) );
938 RefCountPtr
< const Lang::Value
>
939 Ast::StarExpr::impl( DUMMYANDREF( const Lang::FloatTriple
) arg1
, DUMMYANDREF( const Lang::Coords3D
) arg2
, const Kernel::PassedDyn
& dyn
) const
941 return RefCountPtr
< const Lang::Value
>( new Lang::Length( arg1
->x_
* arg2
->x_
.get( ) + arg1
->y_
* arg2
->y_
.get( ) + arg1
->z_
* arg2
->z_
.get( ) ) );
944 RefCountPtr
< const Lang::Value
>
945 Ast::StarExpr::impl( DUMMYANDREF( const Lang::FloatTriple
) arg1
, DUMMYANDREF( const Lang::Length
) arg2
, const Kernel::PassedDyn
& dyn
) const
947 return RefCountPtr
< const Lang::Value
>( new Lang::Coords3D( arg1
->x_
* arg2
->get( ), arg1
->y_
* arg2
->get( ), arg1
->z_
* arg2
->get( ) ) );
950 RefCountPtr
< const Lang::Value
>
951 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Length
) arg1
, DUMMYANDREF( const Lang::FloatTriple
) arg2
, const Kernel::PassedDyn
& dyn
) const
953 return RefCountPtr
< const Lang::Value
>( new Lang::Coords3D( arg1
->get( ) * arg2
->x_
, arg1
->get( ) * arg2
->y_
, arg1
->get( ) * arg2
->z_
) );
956 RefCountPtr
< const Lang::Value
>
957 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Dash
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
959 if( arg2
->val_
<= 0 )
961 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Dashpatterns can only be scaled by positive values" ) );
964 return arg1
->scaled( arg2
->val_
);
967 RefCountPtr
< const Lang::Value
>
968 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Float
) arg1
, DUMMYANDREF( const Lang::Dash
) arg2
, const Kernel::PassedDyn
& dyn
) const
970 if( arg1
->val_
<= 0 )
972 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Dashpatterns can only be scaled by positive values" ) );
975 return arg2
->scaled( arg1
->val_
);
978 RefCountPtr
< const Lang::Value
>
979 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Transform2D
) arg1
, DUMMYANDREF( const Lang::Transform2D
) arg2
, const Kernel::PassedDyn
& dyn
) const
981 return RefCountPtr
< const Lang::Value
>( new Lang::Transform2D( *arg1
, *arg2
) );
984 RefCountPtr
< const Lang::Value
>
985 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Transform3D
) arg1
, DUMMYANDREF( const Lang::Transform3D
) arg2
, const Kernel::PassedDyn
& dyn
) const
987 return RefCountPtr
< const Lang::Value
>( new Lang::Transform3D( *arg1
, *arg2
) );
990 RefCountPtr
< const Lang::Value
>
991 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Float
) arg1
, DUMMYANDREF( const Lang::RGB
) arg2
, const Kernel::PassedDyn
& dyn
) const
993 return RefCountPtr
< const Lang::Value
>( new Lang::RGB( arg2
->components( ).mul( arg1
->val_
, expr1_
->loc( ) ) ) );
996 RefCountPtr
< const Lang::Value
>
997 Ast::StarExpr::impl( DUMMYANDREF( const Lang::RGB
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
999 return RefCountPtr
< const Lang::Value
>( new Lang::RGB( arg1
->components( ).mul( arg2
->val_
, expr1_
->loc( ) ) ) );
1002 RefCountPtr
< const Lang::Value
>
1003 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Float
) arg1
, DUMMYANDREF( const Lang::Gray
) arg2
, const Kernel::PassedDyn
& dyn
) const
1005 return RefCountPtr
< const Lang::Value
>( new Lang::Gray( arg2
->components( ).mul( arg1
->val_
, expr1_
->loc( ) ) ) );
1008 RefCountPtr
< const Lang::Value
>
1009 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Gray
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
1011 return RefCountPtr
< const Lang::Value
>( new Lang::Gray( arg1
->components( ).mul( arg2
->val_
, expr1_
->loc( ) ) ) );
1014 RefCountPtr
< const Lang::Value
>
1015 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Float
) arg1
, DUMMYANDREF( const Lang::SpecularReflection
) arg2
, const Kernel::PassedDyn
& dyn
) const
1017 double scalar
= arg1
->val_
;
1018 if( scalar
< 0 || scalar
> 1 )
1020 throw Exceptions::OutOfRange( expr1_
->loc( ), strrefdup( "The scalar must be in the interval [ 0, 1 ]." ) );
1022 return arg2
->multiply( scalar
);
1025 RefCountPtr
< const Lang::Value
>
1026 Ast::StarExpr::impl( DUMMYANDREF( const Lang::SpecularReflection
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
1028 double scalar
= arg2
->val_
;
1029 if( scalar
< 0 || scalar
> 1 )
1031 throw Exceptions::OutOfRange( expr2_
->loc( ), strrefdup( "The scalar must be in the interval [ 0, 1 ]." ) );
1033 return arg1
->multiply( scalar
);
1036 RefCountPtr
< const Lang::Value
>
1037 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Integer
) arg1
, DUMMYANDREF( const Lang::Integer
) arg2
, const Kernel::PassedDyn
& dyn
) const
1039 return RefCountPtr
< const Lang::Value
>( new Lang::Integer( arg1
->val_
* arg2
->val_
) );
1042 RefCountPtr
< const Lang::Value
>
1043 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Float
) arg1
, DUMMYANDREF( const Lang::Integer
) arg2
, const Kernel::PassedDyn
& dyn
) const
1045 return RefCountPtr
< const Lang::Value
>( new Lang::Float( arg1
->val_
* arg2
->val_
) );
1048 RefCountPtr
< const Lang::Value
>
1049 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Integer
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
1051 return RefCountPtr
< const Lang::Value
>( new Lang::Float( arg1
->val_
* arg2
->val_
) );
1054 RefCountPtr
< const Lang::Value
>
1055 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Length
) arg1
, DUMMYANDREF( const Lang::Integer
) arg2
, const Kernel::PassedDyn
& dyn
) const
1057 return RefCountPtr
< const Lang::Value
>( new Lang::Length( arg1
->get( ) * arg2
->val_
) );
1060 RefCountPtr
< const Lang::Value
>
1061 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Integer
) arg1
, DUMMYANDREF( const Lang::Length
) arg2
, const Kernel::PassedDyn
& dyn
) const
1063 return RefCountPtr
< const Lang::Value
>( new Lang::Length( arg1
->val_
* arg2
->get( ) ) );
1067 RefCountPtr
< const Lang::Value
>
1068 Ast::ProjectionExpr::impl( DUMMYANDREF( const Lang::FloatPair
) arg1
, DUMMYANDREF( const Lang::FloatPair
) arg2
, const Kernel::PassedDyn
& dyn
) const
1070 const double x1
= arg1
->x_
;
1071 const double y1
= arg1
->y_
;
1072 const double x2
= arg2
->x_
;
1073 const double y2
= arg2
->y_
;
1074 double norm2_2
= x2
* x2
+ y2
* y2
;
1077 throw Exceptions::OutOfRange( expr2_
->loc( ), strrefdup( "Projection on zero length vector." ) );
1079 double s
= ( x1
* x2
+ y1
* y2
) / norm2_2
;
1080 return RefCountPtr
< const Lang::Value
>( new Lang::FloatPair( s
* x2
, s
* y2
) );
1083 RefCountPtr
< const Lang::Value
>
1084 Ast::ProjectionExpr::impl( DUMMYANDREF( const Lang::FloatPair
) arg1
, DUMMYANDREF( const Lang::Coords2D
) arg2
, const Kernel::PassedDyn
& dyn
) const
1086 const double x1
= arg1
->x_
;
1087 const double y1
= arg1
->y_
;
1088 const Concrete::Length x2
= arg2
->x_
.get( );
1089 const Concrete::Length y2
= arg2
->y_
.get( );
1090 Concrete::LengthSquared norm2_2
= x2
* x2
+ y2
* y2
;
1093 throw Exceptions::OutOfRange( expr2_
->loc( ), strrefdup( "Projection on zero length vector." ) );
1095 Physical
< -1, 0 > s
= ( x1
* x2
+ y1
* y2
) / norm2_2
;
1096 return RefCountPtr
< const Lang::Value
>( new Lang::FloatPair( s
* x2
, s
* y2
) );
1099 RefCountPtr
< const Lang::Value
>
1100 Ast::ProjectionExpr::impl( DUMMYANDREF( const Lang::Coords2D
) arg1
, DUMMYANDREF( const Lang::FloatPair
) arg2
, const Kernel::PassedDyn
& dyn
) const
1102 const Concrete::Length x1
= arg1
->x_
.get( );
1103 const Concrete::Length y1
= arg1
->y_
.get( );
1104 const double x2
= arg2
->x_
;
1105 const double y2
= arg2
->y_
;
1106 const double norm2_2
= x2
* x2
+ y2
* y2
;
1109 throw Exceptions::OutOfRange( expr2_
->loc( ), strrefdup( "Projection on zero length vector." ) );
1111 Concrete::Length s
= ( x1
* x2
+ y1
* y2
) / norm2_2
;
1112 return RefCountPtr
< const Lang::Value
>( new Lang::Coords2D( s
* x2
, s
* y2
) );
1115 RefCountPtr
< const Lang::Value
>
1116 Ast::ProjectionExpr::impl( DUMMYANDREF( const Lang::Coords2D
) arg1
, DUMMYANDREF( const Lang::Coords2D
) arg2
, const Kernel::PassedDyn
& dyn
) const
1118 const Concrete::Length x1
= arg1
->x_
.get( );
1119 const Concrete::Length y1
= arg1
->y_
.get( );
1120 const Concrete::Length x2
= arg2
->x_
.get( );
1121 const Concrete::Length y2
= arg2
->y_
.get( );
1122 Concrete::LengthSquared norm2_2
= x2
* x2
+ y2
* y2
;
1125 throw Exceptions::OutOfRange( expr2_
->loc( ), strrefdup( "Projection on zero length vector." ) );
1127 double s
= ( x1
* x2
+ y1
* y2
) / norm2_2
;
1128 return RefCountPtr
< const Lang::Value
>( new Lang::Coords2D( s
* x2
, s
* y2
) );
1131 RefCountPtr
< const Lang::Value
>
1132 Ast::ProjectionExpr::impl( DUMMYANDREF( const Lang::FloatTriple
) arg1
, DUMMYANDREF( const Lang::FloatTriple
) arg2
, const Kernel::PassedDyn
& dyn
) const
1134 const double x1
= arg1
->x_
;
1135 const double y1
= arg1
->y_
;
1136 const double z1
= arg1
->z_
;
1137 const double x2
= arg2
->x_
;
1138 const double y2
= arg2
->y_
;
1139 const double z2
= arg2
->z_
;
1140 double norm2_2
= x2
* x2
+ y2
* y2
+ z2
* z2
;
1143 throw Exceptions::OutOfRange( expr2_
->loc( ), strrefdup( "Projection on zero length vector." ) );
1145 double s
= ( x1
* x2
+ y1
* y2
+ z1
* z2
) / norm2_2
;
1146 return RefCountPtr
< const Lang::Value
>( new Lang::FloatTriple( s
* x2
, s
* y2
, s
* z2
) );
1149 RefCountPtr
< const Lang::Value
>
1150 Ast::ProjectionExpr::impl( DUMMYANDREF( const Lang::FloatTriple
) arg1
, DUMMYANDREF( const Lang::Coords3D
) arg2
, const Kernel::PassedDyn
& dyn
) const
1152 const double x1
= arg1
->x_
;
1153 const double y1
= arg1
->y_
;
1154 const double z1
= arg1
->z_
;
1155 const Concrete::Length x2
= arg2
->x_
.get( );
1156 const Concrete::Length y2
= arg2
->y_
.get( );
1157 const Concrete::Length z2
= arg2
->z_
.get( );
1158 Concrete::LengthSquared norm2_2
= x2
* x2
+ y2
* y2
+ z2
* z2
;
1161 throw Exceptions::OutOfRange( expr2_
->loc( ), strrefdup( "Projection on zero length vector." ) );
1163 Physical
< -1, 0 > s
= ( x1
* x2
+ y1
* y2
+ z1
* z2
) / norm2_2
;
1164 return RefCountPtr
< const Lang::Value
>( new Lang::FloatTriple( s
* x2
, s
* y2
, s
* z2
) );
1167 RefCountPtr
< const Lang::Value
>
1168 Ast::ProjectionExpr::impl( DUMMYANDREF( const Lang::Coords3D
) arg1
, DUMMYANDREF( const Lang::FloatTriple
) arg2
, const Kernel::PassedDyn
& dyn
) const
1170 const Concrete::Length x1
= arg1
->x_
.get( );
1171 const Concrete::Length y1
= arg1
->y_
.get( );
1172 const Concrete::Length z1
= arg1
->z_
.get( );
1173 const double x2
= arg2
->x_
;
1174 const double y2
= arg2
->y_
;
1175 const double z2
= arg2
->z_
;
1176 const double norm2_2
= x2
* x2
+ y2
* y2
+ z2
* z2
;
1179 throw Exceptions::OutOfRange( expr2_
->loc( ), strrefdup( "Projection on zero length vector." ) );
1181 Concrete::Length s
= ( x1
* x2
+ y1
* y2
+ z1
* z2
) / norm2_2
;
1182 return RefCountPtr
< const Lang::Value
>( new Lang::Coords3D( s
* x2
, s
* y2
, s
* z2
) );
1185 RefCountPtr
< const Lang::Value
>
1186 Ast::ProjectionExpr::impl( DUMMYANDREF( const Lang::Coords3D
) arg1
, DUMMYANDREF( const Lang::Coords3D
) arg2
, const Kernel::PassedDyn
& dyn
) const
1188 const Concrete::Length x1
= arg1
->x_
.get( );
1189 const Concrete::Length y1
= arg1
->y_
.get( );
1190 const Concrete::Length z1
= arg1
->z_
.get( );
1191 const Concrete::Length x2
= arg2
->x_
.get( );
1192 const Concrete::Length y2
= arg2
->y_
.get( );
1193 const Concrete::Length z2
= arg2
->z_
.get( );
1194 Concrete::LengthSquared norm2_2
= x2
* x2
+ y2
* y2
+ z2
* z2
;
1197 throw Exceptions::OutOfRange( expr2_
->loc( ), strrefdup( "Projection on zero length vector." ) );
1199 double s
= ( x1
* x2
+ y1
* y2
+ z1
* z2
) / norm2_2
;
1200 return RefCountPtr
< const Lang::Value
>( new Lang::Coords3D( s
* x2
, s
* y2
, s
* z2
) );
1204 RefCountPtr
< const Lang::Value
>
1205 Ast::SlashExpr::impl( DUMMYANDREF( const Lang::Float
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
1207 return RefCountPtr
< const Lang::Value
>( new Lang::Float( arg1
->val_
/ arg2
->val_
) );
1210 RefCountPtr
< const Lang::Value
>
1211 Ast::SlashExpr::impl( DUMMYANDREF( const Lang::Length
) arg1
, DUMMYANDREF( const Lang::Length
) arg2
, const Kernel::PassedDyn
& dyn
) const
1213 return RefCountPtr
< const Lang::Value
>( new Lang::Float( arg1
->get( ) / arg2
->get( ) ) );
1216 RefCountPtr
< const Lang::Value
>
1217 Ast::SlashExpr::impl( DUMMYANDREF( const Lang::Length
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
1219 return RefCountPtr
< const Lang::Value
>( new Lang::Length( arg1
->get( ) / arg2
->val_
) );
1222 RefCountPtr
< const Lang::Value
>
1223 Ast::SlashExpr::impl( DUMMYANDREF( const Lang::FloatPair
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
1225 return RefCountPtr
< const Lang::Value
>( new Lang::FloatPair( arg1
->x_
/ arg2
->val_
, arg1
->y_
/ arg2
->val_
) );
1228 RefCountPtr
< const Lang::Value
>
1229 Ast::SlashExpr::impl( DUMMYANDREF( const Lang::Coords2D
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
1231 return RefCountPtr
< const Lang::Value
>( new Lang::Coords2D( arg1
->x_
.get( ) / arg2
->val_
, arg1
->y_
.get( ) / arg2
->val_
) );
1234 RefCountPtr
< const Lang::Value
>
1235 Ast::SlashExpr::impl( DUMMYANDREF( const Lang::Coords2D
) arg1
, DUMMYANDREF( const Lang::Length
) arg2
, const Kernel::PassedDyn
& dyn
) const
1237 return RefCountPtr
< const Lang::Value
>( new Lang::FloatPair( arg1
->x_
.get( ) / arg2
->get( ), arg1
->y_
.get( ) / arg2
->get( ) ) );
1240 RefCountPtr
< const Lang::Value
>
1241 Ast::SlashExpr::impl( DUMMYANDREF( const Lang::FloatTriple
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
1243 return RefCountPtr
< const Lang::Value
>( new Lang::FloatTriple( arg1
->x_
/ arg2
->val_
, arg1
->y_
/ arg2
->val_
, arg1
->z_
/ arg2
->val_
) );
1246 RefCountPtr
< const Lang::Value
>
1247 Ast::SlashExpr::impl( DUMMYANDREF( const Lang::Coords3D
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
1249 return RefCountPtr
< const Lang::Value
>( new Lang::Coords3D( arg1
->x_
.get( ) / arg2
->val_
, arg1
->y_
.get( ) / arg2
->val_
, arg1
->z_
.get( ) / arg2
->val_
) );
1252 RefCountPtr
< const Lang::Value
>
1253 Ast::SlashExpr::impl( DUMMYANDREF( const Lang::Coords3D
) arg1
, DUMMYANDREF( const Lang::Length
) arg2
, const Kernel::PassedDyn
& dyn
) const
1255 return RefCountPtr
< const Lang::Value
>( new Lang::FloatTriple( arg1
->x_
.get( ) / arg2
->get( ), arg1
->y_
.get( ) / arg2
->get( ), arg1
->z_
.get( ) / arg2
->get( ) ) );
1258 RefCountPtr
< const Lang::Value
>
1259 Ast::SlashExpr::impl( DUMMYANDREF( const Lang::Integer
) arg1
, DUMMYANDREF( const Lang::Integer
) arg2
, const Kernel::PassedDyn
& dyn
) const
1261 return RefCountPtr
< const Lang::Value
>( new Lang::Integer( arg1
->val_
/ arg2
->val_
) );
1264 RefCountPtr
< const Lang::Value
>
1265 Ast::SlashExpr::impl( DUMMYANDREF( const Lang::Float
) arg1
, DUMMYANDREF( const Lang::Integer
) arg2
, const Kernel::PassedDyn
& dyn
) const
1267 return RefCountPtr
< const Lang::Value
>( new Lang::Float( arg1
->val_
/ arg2
->val_
) );
1270 RefCountPtr
< const Lang::Value
>
1271 Ast::SlashExpr::impl( DUMMYANDREF( const Lang::Length
) arg1
, DUMMYANDREF( const Lang::Integer
) arg2
, const Kernel::PassedDyn
& dyn
) const
1273 return RefCountPtr
< const Lang::Value
>( new Lang::Length( arg1
->get( ) / static_cast< double >( arg2
->val_
) ) );
1277 RefCountPtr
< const Lang::Value
>
1278 Ast::ComposeExpr::impl( DUMMYANDREF( const Lang::Transform2D
) arg1
, DUMMYANDREF( const Lang::Transform2D
) arg2
, const Kernel::PassedDyn
& dyn
) const
1280 return RefCountPtr
< const Lang::Value
>( new Lang::Transform2D( *arg1
, *arg2
) );
1283 RefCountPtr
< const Lang::Value
>
1284 Ast::ComposeExpr::impl( DUMMYANDREF( const Lang::Transform3D
) arg1
, DUMMYANDREF( const Lang::Transform3D
) arg2
, const Kernel::PassedDyn
& dyn
) const
1286 return RefCountPtr
< const Lang::Value
>( new Lang::Transform3D( *arg1
, *arg2
) );
1289 RefCountPtr
< const Lang::Value
>
1290 Ast::ComposeExpr::impl( DUMMYANDREF( const Lang::Function
) arg1
, DUMMYANDREF( const Lang::Function
) arg2
, const Kernel::PassedDyn
& dyn
) const
1292 return RefCountPtr
< const Lang::Value
>( new Lang::ComposedFunction( arg1
, arg2
) );