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 double cosTmp
= (x1
/norm1
) * (x2
/norm2
) + (y1
/norm1
) * (y2
/norm2
);
709 return RefCountPtr
< const Lang::Value
>( new Lang::Float( 0 ) );
711 else if( cosTmp
<= -1 )
713 return RefCountPtr
< const Lang::Value
>( new Lang::Float( M_PI
) );
715 return RefCountPtr
< const Lang::Value
>( new Lang::Float( acos( cosTmp
) ) );
718 RefCountPtr
< const Lang::Value
>
719 Ast::AngleExpr::impl( DUMMYANDREF( const Lang::FloatPair
) arg1
, DUMMYANDREF( const Lang::Coords2D
) arg2
, const Kernel::PassedDyn
& dyn
) const
721 const double x1
= arg1
->x_
;
722 const double y1
= arg1
->y_
;
723 const Concrete::Length x2
= arg2
->x_
.get( );
724 const Concrete::Length y2
= arg2
->y_
.get( );
725 double norm1
= hypot( x1
, y1
);
726 Concrete::Length norm2
= hypotPhysical( x2
, y2
);
727 if( norm1
== 0 || norm2
== 0 )
729 return RefCountPtr
< const Lang::Value
>( new Lang::Float( M_PI_2
) );
731 double cosTmp
= (x1
/norm1
) * (x2
/norm2
) + (y1
/norm1
) * (y2
/norm2
);
734 return RefCountPtr
< const Lang::Value
>( new Lang::Float( 0 ) );
736 else if( cosTmp
<= -1 )
738 return RefCountPtr
< const Lang::Value
>( new Lang::Float( M_PI
) );
740 return RefCountPtr
< const Lang::Value
>( new Lang::Float( acos( cosTmp
) ) );
743 RefCountPtr
< const Lang::Value
>
744 Ast::AngleExpr::impl( DUMMYANDREF( const Lang::Coords2D
) arg1
, DUMMYANDREF( const Lang::FloatPair
) arg2
, const Kernel::PassedDyn
& dyn
) const
746 const Concrete::Length x1
= arg1
->x_
.get( );
747 const Concrete::Length y1
= arg1
->y_
.get( );
748 const double x2
= arg2
->x_
;
749 const double y2
= arg2
->y_
;
750 Concrete::Length norm1
= hypotPhysical( x1
, y1
);
751 double norm2
= hypot( x2
, y2
);
752 if( norm1
== 0 || norm2
== 0 )
754 return RefCountPtr
< const Lang::Value
>( new Lang::Float( M_PI_2
) );
756 double cosTmp
= (x1
/norm1
) * (x2
/norm2
) + (y1
/norm1
) * (y2
/norm2
);
759 return RefCountPtr
< const Lang::Value
>( new Lang::Float( 0 ) );
761 else if( cosTmp
<= -1 )
763 return RefCountPtr
< const Lang::Value
>( new Lang::Float( M_PI
) );
765 return RefCountPtr
< const Lang::Value
>( new Lang::Float( acos( cosTmp
) ) );
768 RefCountPtr
< const Lang::Value
>
769 Ast::AngleExpr::impl( DUMMYANDREF( const Lang::Coords2D
) arg1
, DUMMYANDREF( const Lang::Coords2D
) arg2
, const Kernel::PassedDyn
& dyn
) const
771 const Concrete::Length x1
= arg1
->x_
.get( );
772 const Concrete::Length y1
= arg1
->y_
.get( );
773 const Concrete::Length x2
= arg2
->x_
.get( );
774 const Concrete::Length y2
= arg2
->y_
.get( );
775 Concrete::Length norm1
= hypotPhysical( x1
, y1
);
776 Concrete::Length norm2
= hypotPhysical( x2
, y2
);
777 if( norm1
== 0 || norm2
== 0 )
779 return RefCountPtr
< const Lang::Value
>( new Lang::Float( M_PI_2
) );
781 double cosTmp
= (x1
/norm1
) * (x2
/norm2
) + (y1
/norm1
) * (y2
/norm2
);
784 return RefCountPtr
< const Lang::Value
>( new Lang::Float( 0 ) );
786 else if( cosTmp
<= -1 )
788 return RefCountPtr
< const Lang::Value
>( new Lang::Float( M_PI
) );
790 return RefCountPtr
< const Lang::Value
>( new Lang::Float( acos( cosTmp
) ) );
793 RefCountPtr
< const Lang::Value
>
794 Ast::AngleExpr::impl( DUMMYANDREF( const Lang::FloatTriple
) arg1
, DUMMYANDREF( const Lang::FloatTriple
) arg2
, const Kernel::PassedDyn
& dyn
) const
796 const double x1
= arg1
->x_
;
797 const double y1
= arg1
->y_
;
798 const double z1
= arg1
->z_
;
799 const double x2
= arg2
->x_
;
800 const double y2
= arg2
->y_
;
801 const double z2
= arg2
->z_
;
802 double norm1
= Concrete::Scalar::hypot3( 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 double cosTmp
= (x1
/norm1
) * (x2
/norm2
) + (y1
/norm1
) * (y2
/norm2
) + (z1
/norm1
) * (z2
/norm2
);
811 return RefCountPtr
< const Lang::Value
>( new Lang::Float( 0 ) );
813 else if( cosTmp
<= -1 )
815 return RefCountPtr
< const Lang::Value
>( new Lang::Float( M_PI
) );
817 return RefCountPtr
< const Lang::Value
>( new Lang::Float( acos( cosTmp
) ) );
820 RefCountPtr
< const Lang::Value
>
821 Ast::AngleExpr::impl( DUMMYANDREF( const Lang::FloatTriple
) arg1
, DUMMYANDREF( const Lang::Coords3D
) arg2
, const Kernel::PassedDyn
& dyn
) const
823 const double x1
= arg1
->x_
;
824 const double y1
= arg1
->y_
;
825 const double z1
= arg1
->z_
;
826 const Concrete::Length x2
= arg2
->x_
.get( );
827 const Concrete::Length y2
= arg2
->y_
.get( );
828 const Concrete::Length z2
= arg2
->z_
.get( );
829 double norm1
= Concrete::Scalar::hypot3( x1
, y1
, z1
);
830 Concrete::Length norm2
= hypotPhysical( x2
, y2
, z2
);
831 if( norm1
== 0 || norm2
== 0 )
833 return RefCountPtr
< const Lang::Value
>( new Lang::Float( M_PI_2
) );
835 double cosTmp
= (x1
/norm1
) * (x2
/norm2
) + (y1
/norm1
) * (y2
/norm2
) + (z1
/norm1
) * (z2
/norm2
);
838 return RefCountPtr
< const Lang::Value
>( new Lang::Float( 0 ) );
840 else if( cosTmp
<= -1 )
842 return RefCountPtr
< const Lang::Value
>( new Lang::Float( M_PI
) );
844 return RefCountPtr
< const Lang::Value
>( new Lang::Float( acos( cosTmp
) ) );
847 RefCountPtr
< const Lang::Value
>
848 Ast::AngleExpr::impl( DUMMYANDREF( const Lang::Coords3D
) arg1
, DUMMYANDREF( const Lang::FloatTriple
) arg2
, const Kernel::PassedDyn
& dyn
) const
850 const Concrete::Length x1
= arg1
->x_
.get( );
851 const Concrete::Length y1
= arg1
->y_
.get( );
852 const Concrete::Length z1
= arg1
->z_
.get( );
853 const double x2
= arg2
->x_
;
854 const double y2
= arg2
->y_
;
855 const double z2
= arg2
->z_
;
856 Concrete::Length norm1
= hypotPhysical( x1
, y1
, z1
);
857 double norm2
= Concrete::Scalar::hypot3( x2
, y2
, z2
);
858 if( norm1
== 0 || norm2
== 0 )
860 return RefCountPtr
< const Lang::Value
>( new Lang::Float( M_PI_2
) );
862 double cosTmp
= (x1
/norm1
) * (x2
/norm2
) + (y1
/norm1
) * (y2
/norm2
) + (z1
/norm1
) * (z2
/norm2
);
865 return RefCountPtr
< const Lang::Value
>( new Lang::Float( 0 ) );
867 else if( cosTmp
<= -1 )
869 return RefCountPtr
< const Lang::Value
>( new Lang::Float( M_PI
) );
871 return RefCountPtr
< const Lang::Value
>( new Lang::Float( acos( cosTmp
) ) );
874 RefCountPtr
< const Lang::Value
>
875 Ast::AngleExpr::impl( DUMMYANDREF( const Lang::Coords3D
) arg1
, DUMMYANDREF( const Lang::Coords3D
) arg2
, const Kernel::PassedDyn
& dyn
) const
877 const Concrete::Length x1
= arg1
->x_
.get( );
878 const Concrete::Length y1
= arg1
->y_
.get( );
879 const Concrete::Length z1
= arg1
->z_
.get( );
880 const Concrete::Length x2
= arg2
->x_
.get( );
881 const Concrete::Length y2
= arg2
->y_
.get( );
882 const Concrete::Length z2
= arg2
->z_
.get( );
883 Concrete::Length norm1
= hypotPhysical( x1
, y1
, z1
);
884 Concrete::Length norm2
= hypotPhysical( x2
, y2
, z2
);
885 if( norm1
== 0 || norm2
== 0 )
887 return RefCountPtr
< const Lang::Value
>( new Lang::Float( M_PI_2
) );
889 double cosTmp
= (x1
/norm1
) * (x2
/norm2
) + (y1
/norm1
) * (y2
/norm2
) + (z1
/norm1
) * (z2
/norm2
);
892 return RefCountPtr
< const Lang::Value
>( new Lang::Float( 0 ) );
894 else if( cosTmp
<= -1 )
896 return RefCountPtr
< const Lang::Value
>( new Lang::Float( M_PI
) );
898 return RefCountPtr
< const Lang::Value
>( new Lang::Float( acos( cosTmp
) ) );
902 RefCountPtr
< const Lang::Value
>
903 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Float
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
905 return RefCountPtr
< const Lang::Value
>( new Lang::Float( arg1
->val_
* arg2
->val_
) );
908 RefCountPtr
< const Lang::Value
>
909 Ast::StarExpr::impl( DUMMYANDREF( const Lang::FloatPair
) arg1
, DUMMYANDREF( const Lang::FloatPair
) arg2
, const Kernel::PassedDyn
& dyn
) const
911 return RefCountPtr
< const Lang::Value
>( new Lang::Float( arg1
->x_
* arg2
->x_
+ arg1
->y_
* arg2
->y_
) );
914 RefCountPtr
< const Lang::Value
>
915 Ast::StarExpr::impl( DUMMYANDREF( const Lang::FloatPair
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
917 return RefCountPtr
< const Lang::Value
>( new Lang::FloatPair( arg1
->x_
* arg2
->val_
, arg1
->y_
* arg2
->val_
) );
920 RefCountPtr
< const Lang::Value
>
921 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Float
) arg1
, DUMMYANDREF( const Lang::FloatPair
) arg2
, const Kernel::PassedDyn
& dyn
) const
923 return RefCountPtr
< const Lang::Value
>( new Lang::FloatPair( arg1
->val_
* arg2
->x_
, arg1
->val_
* arg2
->y_
) );
926 RefCountPtr
< const Lang::Value
>
927 Ast::StarExpr::impl( DUMMYANDREF( const Lang::FloatTriple
) arg1
, DUMMYANDREF( const Lang::FloatTriple
) arg2
, const Kernel::PassedDyn
& dyn
) const
929 return RefCountPtr
< const Lang::Value
>( new Lang::Float( arg1
->x_
* arg2
->x_
+ arg1
->y_
* arg2
->y_
+ arg1
->z_
* arg2
->z_
) );
932 RefCountPtr
< const Lang::Value
>
933 Ast::StarExpr::impl( DUMMYANDREF( const Lang::FloatTriple
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
935 return RefCountPtr
< const Lang::Value
>( new Lang::FloatTriple( arg1
->x_
* arg2
->val_
, arg1
->y_
* arg2
->val_
, arg1
->z_
* arg2
->val_
) );
938 RefCountPtr
< const Lang::Value
>
939 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Float
) arg1
, DUMMYANDREF( const Lang::FloatTriple
) arg2
, const Kernel::PassedDyn
& dyn
) const
941 return RefCountPtr
< const Lang::Value
>( new Lang::FloatTriple( arg1
->val_
* arg2
->x_
, arg1
->val_
* arg2
->y_
, arg1
->val_
* arg2
->z_
) );
944 RefCountPtr
< const Lang::Value
>
945 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Length
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
947 return RefCountPtr
< const Lang::Value
>( new Lang::Length( arg1
->get( ) * arg2
->val_
) );
950 RefCountPtr
< const Lang::Value
>
951 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Float
) arg1
, DUMMYANDREF( const Lang::Length
) arg2
, const Kernel::PassedDyn
& dyn
) const
953 return RefCountPtr
< const Lang::Value
>( new Lang::Length( arg1
->val_
* arg2
->get( ) ) );
956 RefCountPtr
< const Lang::Value
>
957 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Coords2D
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
959 return RefCountPtr
< const Lang::Value
>( new Lang::Coords2D( arg1
->x_
.get( ) * arg2
->val_
, arg1
->y_
.get( ) * arg2
->val_
) );
962 RefCountPtr
< const Lang::Value
>
963 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Float
) arg1
, DUMMYANDREF( const Lang::Coords2D
) arg2
, const Kernel::PassedDyn
& dyn
) const
965 return RefCountPtr
< const Lang::Value
>( new Lang::Coords2D( arg1
->val_
* arg2
->x_
.get( ), arg1
->val_
* arg2
->y_
.get( ) ) );
968 RefCountPtr
< const Lang::Value
>
969 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Coords2D
) arg1
, DUMMYANDREF( const Lang::FloatPair
) arg2
, const Kernel::PassedDyn
& dyn
) const
971 return RefCountPtr
< const Lang::Value
>( new Lang::Length( arg1
->x_
.get( ) * arg2
->x_
+ arg1
->y_
.get( ) * arg2
->y_
) );
974 RefCountPtr
< const Lang::Value
>
975 Ast::StarExpr::impl( DUMMYANDREF( const Lang::FloatPair
) arg1
, DUMMYANDREF( const Lang::Coords2D
) arg2
, const Kernel::PassedDyn
& dyn
) const
977 return RefCountPtr
< const Lang::Value
>( new Lang::Length( arg1
->x_
* arg2
->x_
.get( ) + arg1
->y_
* arg2
->y_
.get( ) ) );
980 RefCountPtr
< const Lang::Value
>
981 Ast::StarExpr::impl( DUMMYANDREF( const Lang::FloatPair
) arg1
, DUMMYANDREF( const Lang::Length
) arg2
, const Kernel::PassedDyn
& dyn
) const
983 return RefCountPtr
< const Lang::Value
>( new Lang::Coords2D( arg1
->x_
* arg2
->get( ), arg1
->y_
* arg2
->get( ) ) );
986 RefCountPtr
< const Lang::Value
>
987 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Length
) arg1
, DUMMYANDREF( const Lang::FloatPair
) arg2
, const Kernel::PassedDyn
& dyn
) const
989 return RefCountPtr
< const Lang::Value
>( new Lang::Coords2D( arg1
->get( ) * arg2
->x_
, arg1
->get( ) * arg2
->y_
) );
992 RefCountPtr
< const Lang::Value
>
993 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Coords3D
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
995 return RefCountPtr
< const Lang::Value
>( new Lang::Coords3D( arg1
->x_
.get( ) * arg2
->val_
, arg1
->y_
.get( ) * arg2
->val_
, arg1
->z_
.get( ) * arg2
->val_
) );
998 RefCountPtr
< const Lang::Value
>
999 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Float
) arg1
, DUMMYANDREF( const Lang::Coords3D
) arg2
, const Kernel::PassedDyn
& dyn
) const
1001 return RefCountPtr
< const Lang::Value
>( new Lang::Coords3D( arg1
->val_
* arg2
->x_
.get( ), arg1
->val_
* arg2
->y_
.get( ), arg1
->val_
* arg2
->z_
.get( ) ) );
1004 RefCountPtr
< const Lang::Value
>
1005 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Coords3D
) arg1
, DUMMYANDREF( const Lang::FloatTriple
) arg2
, const Kernel::PassedDyn
& dyn
) const
1007 return RefCountPtr
< const Lang::Value
>( new Lang::Length( arg1
->x_
.get( ) * arg2
->x_
+ arg1
->y_
.get( ) * arg2
->y_
+ arg1
->z_
.get( ) * arg2
->z_
) );
1010 RefCountPtr
< const Lang::Value
>
1011 Ast::StarExpr::impl( DUMMYANDREF( const Lang::FloatTriple
) arg1
, DUMMYANDREF( const Lang::Coords3D
) arg2
, const Kernel::PassedDyn
& dyn
) const
1013 return RefCountPtr
< const Lang::Value
>( new Lang::Length( arg1
->x_
* arg2
->x_
.get( ) + arg1
->y_
* arg2
->y_
.get( ) + arg1
->z_
* arg2
->z_
.get( ) ) );
1016 RefCountPtr
< const Lang::Value
>
1017 Ast::StarExpr::impl( DUMMYANDREF( const Lang::FloatTriple
) arg1
, DUMMYANDREF( const Lang::Length
) arg2
, const Kernel::PassedDyn
& dyn
) const
1019 return RefCountPtr
< const Lang::Value
>( new Lang::Coords3D( arg1
->x_
* arg2
->get( ), arg1
->y_
* arg2
->get( ), arg1
->z_
* arg2
->get( ) ) );
1022 RefCountPtr
< const Lang::Value
>
1023 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Length
) arg1
, DUMMYANDREF( const Lang::FloatTriple
) arg2
, const Kernel::PassedDyn
& dyn
) const
1025 return RefCountPtr
< const Lang::Value
>( new Lang::Coords3D( arg1
->get( ) * arg2
->x_
, arg1
->get( ) * arg2
->y_
, arg1
->get( ) * arg2
->z_
) );
1028 RefCountPtr
< const Lang::Value
>
1029 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Dash
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
1031 if( arg2
->val_
<= 0 )
1033 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Dashpatterns can only be scaled by positive values" ) );
1036 return arg1
->scaled( arg2
->val_
);
1039 RefCountPtr
< const Lang::Value
>
1040 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Float
) arg1
, DUMMYANDREF( const Lang::Dash
) arg2
, const Kernel::PassedDyn
& dyn
) const
1042 if( arg1
->val_
<= 0 )
1044 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Dashpatterns can only be scaled by positive values" ) );
1047 return arg2
->scaled( arg1
->val_
);
1050 RefCountPtr
< const Lang::Value
>
1051 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Transform2D
) arg1
, DUMMYANDREF( const Lang::Transform2D
) arg2
, const Kernel::PassedDyn
& dyn
) const
1053 return RefCountPtr
< const Lang::Value
>( new Lang::Transform2D( *arg1
, *arg2
) );
1056 RefCountPtr
< const Lang::Value
>
1057 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Transform3D
) arg1
, DUMMYANDREF( const Lang::Transform3D
) arg2
, const Kernel::PassedDyn
& dyn
) const
1059 return RefCountPtr
< const Lang::Value
>( new Lang::Transform3D( *arg1
, *arg2
) );
1062 RefCountPtr
< const Lang::Value
>
1063 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Float
) arg1
, DUMMYANDREF( const Lang::RGB
) arg2
, const Kernel::PassedDyn
& dyn
) const
1065 return RefCountPtr
< const Lang::Value
>( new Lang::RGB( arg2
->components( ).mul( arg1
->val_
, expr1_
->loc( ) ) ) );
1068 RefCountPtr
< const Lang::Value
>
1069 Ast::StarExpr::impl( DUMMYANDREF( const Lang::RGB
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
1071 return RefCountPtr
< const Lang::Value
>( new Lang::RGB( arg1
->components( ).mul( arg2
->val_
, expr1_
->loc( ) ) ) );
1074 RefCountPtr
< const Lang::Value
>
1075 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Float
) arg1
, DUMMYANDREF( const Lang::Gray
) arg2
, const Kernel::PassedDyn
& dyn
) const
1077 return RefCountPtr
< const Lang::Value
>( new Lang::Gray( arg2
->components( ).mul( arg1
->val_
, expr1_
->loc( ) ) ) );
1080 RefCountPtr
< const Lang::Value
>
1081 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Gray
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
1083 return RefCountPtr
< const Lang::Value
>( new Lang::Gray( arg1
->components( ).mul( arg2
->val_
, expr1_
->loc( ) ) ) );
1086 RefCountPtr
< const Lang::Value
>
1087 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Float
) arg1
, DUMMYANDREF( const Lang::SpecularReflection
) arg2
, const Kernel::PassedDyn
& dyn
) const
1089 double scalar
= arg1
->val_
;
1090 if( scalar
< 0 || scalar
> 1 )
1092 throw Exceptions::OutOfRange( expr1_
->loc( ), strrefdup( "The scalar must be in the interval [ 0, 1 ]." ) );
1094 return arg2
->multiply( scalar
);
1097 RefCountPtr
< const Lang::Value
>
1098 Ast::StarExpr::impl( DUMMYANDREF( const Lang::SpecularReflection
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
1100 double scalar
= arg2
->val_
;
1101 if( scalar
< 0 || scalar
> 1 )
1103 throw Exceptions::OutOfRange( expr2_
->loc( ), strrefdup( "The scalar must be in the interval [ 0, 1 ]." ) );
1105 return arg1
->multiply( scalar
);
1108 RefCountPtr
< const Lang::Value
>
1109 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Integer
) arg1
, DUMMYANDREF( const Lang::Integer
) arg2
, const Kernel::PassedDyn
& dyn
) const
1111 return RefCountPtr
< const Lang::Value
>( new Lang::Integer( arg1
->val_
* arg2
->val_
) );
1114 RefCountPtr
< const Lang::Value
>
1115 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Float
) arg1
, DUMMYANDREF( const Lang::Integer
) arg2
, const Kernel::PassedDyn
& dyn
) const
1117 return RefCountPtr
< const Lang::Value
>( new Lang::Float( arg1
->val_
* arg2
->val_
) );
1120 RefCountPtr
< const Lang::Value
>
1121 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Integer
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
1123 return RefCountPtr
< const Lang::Value
>( new Lang::Float( arg1
->val_
* arg2
->val_
) );
1126 RefCountPtr
< const Lang::Value
>
1127 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Length
) arg1
, DUMMYANDREF( const Lang::Integer
) arg2
, const Kernel::PassedDyn
& dyn
) const
1129 return RefCountPtr
< const Lang::Value
>( new Lang::Length( arg1
->get( ) * arg2
->val_
) );
1132 RefCountPtr
< const Lang::Value
>
1133 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Integer
) arg1
, DUMMYANDREF( const Lang::Length
) arg2
, const Kernel::PassedDyn
& dyn
) const
1135 return RefCountPtr
< const Lang::Value
>( new Lang::Length( arg1
->val_
* arg2
->get( ) ) );
1139 RefCountPtr
< const Lang::Value
>
1140 Ast::ProjectionExpr::impl( DUMMYANDREF( const Lang::FloatPair
) arg1
, DUMMYANDREF( const Lang::FloatPair
) arg2
, const Kernel::PassedDyn
& dyn
) const
1142 const double x1
= arg1
->x_
;
1143 const double y1
= arg1
->y_
;
1144 const double x2
= arg2
->x_
;
1145 const double y2
= arg2
->y_
;
1146 double norm2_2
= x2
* x2
+ y2
* y2
;
1149 throw Exceptions::OutOfRange( expr2_
->loc( ), strrefdup( "Projection on zero length vector." ) );
1151 double s
= ( x1
* x2
+ y1
* y2
) / norm2_2
;
1152 return RefCountPtr
< const Lang::Value
>( new Lang::FloatPair( s
* x2
, s
* y2
) );
1155 RefCountPtr
< const Lang::Value
>
1156 Ast::ProjectionExpr::impl( DUMMYANDREF( const Lang::FloatPair
) arg1
, DUMMYANDREF( const Lang::Coords2D
) arg2
, const Kernel::PassedDyn
& dyn
) const
1158 const double x1
= arg1
->x_
;
1159 const double y1
= arg1
->y_
;
1160 const Concrete::Length x2
= arg2
->x_
.get( );
1161 const Concrete::Length y2
= arg2
->y_
.get( );
1162 Concrete::LengthSquared norm2_2
= x2
* x2
+ y2
* y2
;
1165 throw Exceptions::OutOfRange( expr2_
->loc( ), strrefdup( "Projection on zero length vector." ) );
1167 Physical
< -1, 0 > s
= ( x1
* x2
+ y1
* y2
) / norm2_2
;
1168 return RefCountPtr
< const Lang::Value
>( new Lang::FloatPair( s
* x2
, s
* y2
) );
1171 RefCountPtr
< const Lang::Value
>
1172 Ast::ProjectionExpr::impl( DUMMYANDREF( const Lang::Coords2D
) arg1
, DUMMYANDREF( const Lang::FloatPair
) arg2
, const Kernel::PassedDyn
& dyn
) const
1174 const Concrete::Length x1
= arg1
->x_
.get( );
1175 const Concrete::Length y1
= arg1
->y_
.get( );
1176 const double x2
= arg2
->x_
;
1177 const double y2
= arg2
->y_
;
1178 const double norm2_2
= x2
* x2
+ y2
* y2
;
1181 throw Exceptions::OutOfRange( expr2_
->loc( ), strrefdup( "Projection on zero length vector." ) );
1183 Concrete::Length s
= ( x1
* x2
+ y1
* y2
) / norm2_2
;
1184 return RefCountPtr
< const Lang::Value
>( new Lang::Coords2D( s
* x2
, s
* y2
) );
1187 RefCountPtr
< const Lang::Value
>
1188 Ast::ProjectionExpr::impl( DUMMYANDREF( const Lang::Coords2D
) arg1
, DUMMYANDREF( const Lang::Coords2D
) arg2
, const Kernel::PassedDyn
& dyn
) const
1190 const Concrete::Length x1
= arg1
->x_
.get( );
1191 const Concrete::Length y1
= arg1
->y_
.get( );
1192 const Concrete::Length x2
= arg2
->x_
.get( );
1193 const Concrete::Length y2
= arg2
->y_
.get( );
1194 Concrete::LengthSquared norm2_2
= x2
* x2
+ y2
* y2
;
1197 throw Exceptions::OutOfRange( expr2_
->loc( ), strrefdup( "Projection on zero length vector." ) );
1199 double s
= ( x1
* x2
+ y1
* y2
) / norm2_2
;
1200 return RefCountPtr
< const Lang::Value
>( new Lang::Coords2D( s
* x2
, s
* y2
) );
1203 RefCountPtr
< const Lang::Value
>
1204 Ast::ProjectionExpr::impl( DUMMYANDREF( const Lang::FloatTriple
) arg1
, DUMMYANDREF( const Lang::FloatTriple
) arg2
, const Kernel::PassedDyn
& dyn
) const
1206 const double x1
= arg1
->x_
;
1207 const double y1
= arg1
->y_
;
1208 const double z1
= arg1
->z_
;
1209 const double x2
= arg2
->x_
;
1210 const double y2
= arg2
->y_
;
1211 const double z2
= arg2
->z_
;
1212 double norm2_2
= x2
* x2
+ y2
* y2
+ z2
* z2
;
1215 throw Exceptions::OutOfRange( expr2_
->loc( ), strrefdup( "Projection on zero length vector." ) );
1217 double s
= ( x1
* x2
+ y1
* y2
+ z1
* z2
) / norm2_2
;
1218 return RefCountPtr
< const Lang::Value
>( new Lang::FloatTriple( s
* x2
, s
* y2
, s
* z2
) );
1221 RefCountPtr
< const Lang::Value
>
1222 Ast::ProjectionExpr::impl( DUMMYANDREF( const Lang::FloatTriple
) arg1
, DUMMYANDREF( const Lang::Coords3D
) arg2
, const Kernel::PassedDyn
& dyn
) const
1224 const double x1
= arg1
->x_
;
1225 const double y1
= arg1
->y_
;
1226 const double z1
= arg1
->z_
;
1227 const Concrete::Length x2
= arg2
->x_
.get( );
1228 const Concrete::Length y2
= arg2
->y_
.get( );
1229 const Concrete::Length z2
= arg2
->z_
.get( );
1230 Concrete::LengthSquared norm2_2
= x2
* x2
+ y2
* y2
+ z2
* z2
;
1233 throw Exceptions::OutOfRange( expr2_
->loc( ), strrefdup( "Projection on zero length vector." ) );
1235 Physical
< -1, 0 > s
= ( x1
* x2
+ y1
* y2
+ z1
* z2
) / norm2_2
;
1236 return RefCountPtr
< const Lang::Value
>( new Lang::FloatTriple( s
* x2
, s
* y2
, s
* z2
) );
1239 RefCountPtr
< const Lang::Value
>
1240 Ast::ProjectionExpr::impl( DUMMYANDREF( const Lang::Coords3D
) arg1
, DUMMYANDREF( const Lang::FloatTriple
) arg2
, const Kernel::PassedDyn
& dyn
) const
1242 const Concrete::Length x1
= arg1
->x_
.get( );
1243 const Concrete::Length y1
= arg1
->y_
.get( );
1244 const Concrete::Length z1
= arg1
->z_
.get( );
1245 const double x2
= arg2
->x_
;
1246 const double y2
= arg2
->y_
;
1247 const double z2
= arg2
->z_
;
1248 const double norm2_2
= x2
* x2
+ y2
* y2
+ z2
* z2
;
1251 throw Exceptions::OutOfRange( expr2_
->loc( ), strrefdup( "Projection on zero length vector." ) );
1253 Concrete::Length s
= ( x1
* x2
+ y1
* y2
+ z1
* z2
) / norm2_2
;
1254 return RefCountPtr
< const Lang::Value
>( new Lang::Coords3D( s
* x2
, s
* y2
, s
* z2
) );
1257 RefCountPtr
< const Lang::Value
>
1258 Ast::ProjectionExpr::impl( DUMMYANDREF( const Lang::Coords3D
) arg1
, DUMMYANDREF( const Lang::Coords3D
) arg2
, const Kernel::PassedDyn
& dyn
) const
1260 const Concrete::Length x1
= arg1
->x_
.get( );
1261 const Concrete::Length y1
= arg1
->y_
.get( );
1262 const Concrete::Length z1
= arg1
->z_
.get( );
1263 const Concrete::Length x2
= arg2
->x_
.get( );
1264 const Concrete::Length y2
= arg2
->y_
.get( );
1265 const Concrete::Length z2
= arg2
->z_
.get( );
1266 Concrete::LengthSquared norm2_2
= x2
* x2
+ y2
* y2
+ z2
* z2
;
1269 throw Exceptions::OutOfRange( expr2_
->loc( ), strrefdup( "Projection on zero length vector." ) );
1271 double s
= ( x1
* x2
+ y1
* y2
+ z1
* z2
) / norm2_2
;
1272 return RefCountPtr
< const Lang::Value
>( new Lang::Coords3D( s
* x2
, s
* y2
, s
* z2
) );
1276 RefCountPtr
< const Lang::Value
>
1277 Ast::SlashExpr::impl( DUMMYANDREF( const Lang::Float
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
1279 return RefCountPtr
< const Lang::Value
>( new Lang::Float( arg1
->val_
/ arg2
->val_
) );
1282 RefCountPtr
< const Lang::Value
>
1283 Ast::SlashExpr::impl( DUMMYANDREF( const Lang::Length
) arg1
, DUMMYANDREF( const Lang::Length
) arg2
, const Kernel::PassedDyn
& dyn
) const
1285 return RefCountPtr
< const Lang::Value
>( new Lang::Float( arg1
->get( ) / arg2
->get( ) ) );
1288 RefCountPtr
< const Lang::Value
>
1289 Ast::SlashExpr::impl( DUMMYANDREF( const Lang::Length
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
1291 return RefCountPtr
< const Lang::Value
>( new Lang::Length( arg1
->get( ) / arg2
->val_
) );
1294 RefCountPtr
< const Lang::Value
>
1295 Ast::SlashExpr::impl( DUMMYANDREF( const Lang::FloatPair
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
1297 return RefCountPtr
< const Lang::Value
>( new Lang::FloatPair( arg1
->x_
/ arg2
->val_
, arg1
->y_
/ arg2
->val_
) );
1300 RefCountPtr
< const Lang::Value
>
1301 Ast::SlashExpr::impl( DUMMYANDREF( const Lang::Coords2D
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
1303 return RefCountPtr
< const Lang::Value
>( new Lang::Coords2D( arg1
->x_
.get( ) / arg2
->val_
, arg1
->y_
.get( ) / arg2
->val_
) );
1306 RefCountPtr
< const Lang::Value
>
1307 Ast::SlashExpr::impl( DUMMYANDREF( const Lang::Coords2D
) arg1
, DUMMYANDREF( const Lang::Length
) arg2
, const Kernel::PassedDyn
& dyn
) const
1309 return RefCountPtr
< const Lang::Value
>( new Lang::FloatPair( arg1
->x_
.get( ) / arg2
->get( ), arg1
->y_
.get( ) / arg2
->get( ) ) );
1312 RefCountPtr
< const Lang::Value
>
1313 Ast::SlashExpr::impl( DUMMYANDREF( const Lang::FloatTriple
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
1315 return RefCountPtr
< const Lang::Value
>( new Lang::FloatTriple( arg1
->x_
/ arg2
->val_
, arg1
->y_
/ arg2
->val_
, arg1
->z_
/ arg2
->val_
) );
1318 RefCountPtr
< const Lang::Value
>
1319 Ast::SlashExpr::impl( DUMMYANDREF( const Lang::Coords3D
) arg1
, DUMMYANDREF( const Lang::Float
) arg2
, const Kernel::PassedDyn
& dyn
) const
1321 return RefCountPtr
< const Lang::Value
>( new Lang::Coords3D( arg1
->x_
.get( ) / arg2
->val_
, arg1
->y_
.get( ) / arg2
->val_
, arg1
->z_
.get( ) / arg2
->val_
) );
1324 RefCountPtr
< const Lang::Value
>
1325 Ast::SlashExpr::impl( DUMMYANDREF( const Lang::Coords3D
) arg1
, DUMMYANDREF( const Lang::Length
) arg2
, const Kernel::PassedDyn
& dyn
) const
1327 return RefCountPtr
< const Lang::Value
>( new Lang::FloatTriple( arg1
->x_
.get( ) / arg2
->get( ), arg1
->y_
.get( ) / arg2
->get( ), arg1
->z_
.get( ) / arg2
->get( ) ) );
1330 RefCountPtr
< const Lang::Value
>
1331 Ast::SlashExpr::impl( DUMMYANDREF( const Lang::Integer
) arg1
, DUMMYANDREF( const Lang::Integer
) arg2
, const Kernel::PassedDyn
& dyn
) const
1333 return RefCountPtr
< const Lang::Value
>( new Lang::Integer( arg1
->val_
/ arg2
->val_
) );
1336 RefCountPtr
< const Lang::Value
>
1337 Ast::SlashExpr::impl( DUMMYANDREF( const Lang::Float
) arg1
, DUMMYANDREF( const Lang::Integer
) arg2
, const Kernel::PassedDyn
& dyn
) const
1339 return RefCountPtr
< const Lang::Value
>( new Lang::Float( arg1
->val_
/ arg2
->val_
) );
1342 RefCountPtr
< const Lang::Value
>
1343 Ast::SlashExpr::impl( DUMMYANDREF( const Lang::Length
) arg1
, DUMMYANDREF( const Lang::Integer
) arg2
, const Kernel::PassedDyn
& dyn
) const
1345 return RefCountPtr
< const Lang::Value
>( new Lang::Length( arg1
->get( ) / static_cast< double >( arg2
->val_
) ) );
1349 RefCountPtr
< const Lang::Value
>
1350 Ast::ComposeExpr::impl( DUMMYANDREF( const Lang::Transform2D
) arg1
, DUMMYANDREF( const Lang::Transform2D
) arg2
, const Kernel::PassedDyn
& dyn
) const
1352 return RefCountPtr
< const Lang::Value
>( new Lang::Transform2D( *arg1
, *arg2
) );
1355 RefCountPtr
< const Lang::Value
>
1356 Ast::ComposeExpr::impl( DUMMYANDREF( const Lang::Transform3D
) arg1
, DUMMYANDREF( const Lang::Transform3D
) arg2
, const Kernel::PassedDyn
& dyn
) const
1358 return RefCountPtr
< const Lang::Value
>( new Lang::Transform3D( *arg1
, *arg2
) );
1361 RefCountPtr
< const Lang::Value
>
1362 Ast::ComposeExpr::impl( DUMMYANDREF( const Lang::Function
) arg1
, DUMMYANDREF( const Lang::Function
) arg2
, const Kernel::PassedDyn
& dyn
) const
1364 return RefCountPtr
< const Lang::Value
>( new Lang::ComposedFunction( arg1
, arg2
) );