Update procedures
[shapes.git] / source / astexpr_arithmetic.cc
blobd56f46e639dff0fdf13318637635dd4d54041707
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
6 * any later version.
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
19 #include <cmath>
21 #include "astexprs.h"
22 #include "shapesexceptions.h"
23 #include "lighttypes.h"
24 #include "globals.h"
26 using namespace Shapes;
27 using namespace std;
30 RefCountPtr< const Lang::Value >
31 Ast::PlusPlusExpr::impl( DUMMYANDREF( const Lang::Float ) arg1, DUMMYANDREF( const Lang::Float ) arg2, const Kernel::PassedDyn & dyn ) const
33 if( arg1->val_ < 0 )
35 throw Exceptions::OutOfRange( expr1_->loc( ), strrefdup( "Arguments to Pythagorean addition must be positive." ) );
37 if( arg2->val_ < 0 )
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( );
49 if( tmp1 < 0 )
51 throw Exceptions::OutOfRange( expr1_->loc( ), strrefdup( "Arguments to Pythagorean addition must be positive." ) );
53 if( tmp2 < 0 )
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
64 if( arg1->val_ < 0 )
66 throw Exceptions::OutOfRange( expr1_->loc( ), strrefdup( "Arguments to Pythagorean subtraction must be positive." ) );
68 if( arg2->val_ < 0 )
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( );
84 if( tmp1 < 0 )
86 throw Exceptions::OutOfRange( expr1_->loc( ), strrefdup( "Arguments to Pythagorean subtraction must be positive." ) );
88 if( tmp2 < 0 )
90 throw Exceptions::OutOfRange( expr2_->loc( ), strrefdup( "Arguments to Pythagorean subtraction must be positive." ) );
92 if( tmp1 < tmp2 )
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 )
394 return arg2;
396 if( arg2 == Lang::THE_NULL_DYNAMIC_BINDINGS )
398 return arg1;
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
408 ( arg2,
409 RefCountPtr< Lang::Group2D >( new Lang::GroupPair2D
410 ( arg1,
411 Lang::THE_NULL2D,
412 metaState ) ),
413 metaState ) );
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
427 ( arg2,
428 RefCountPtr< Lang::Group3D >( new Lang::GroupPair3D
429 ( arg1,
430 Lang::THE_NULL3D,
431 metaState ) ),
432 metaState ) );
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 )
447 return arg2;
449 if( arg2 == Lang::THE_NULL_DYNAMIC_BINDINGS )
451 return arg1;
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 ];
506 strcpy( mem, src1 );
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_;
637 if( tmp > 0 )
639 return RefCountPtr< const Lang::Value >( new Lang::Float( 0 ) );
641 if( tmp < 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( );
652 if( tmp > 0 )
654 return RefCountPtr< const Lang::Value >( new Lang::Float( 0 ) );
656 if( tmp < 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_;
667 if( tmp > 0 )
669 return RefCountPtr< const Lang::Value >( new Lang::Float( 0 ) );
671 if( tmp < 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( );
682 if( tmp > 0 )
684 return RefCountPtr< const Lang::Value >( new Lang::Float( 0 ) );
686 if( tmp < 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);
707 if( cosTmp >= 1 )
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);
732 if( cosTmp >= 1 )
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);
757 if( cosTmp >= 1 )
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);
782 if( cosTmp >= 1 )
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);
809 if( cosTmp >= 1 )
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);
836 if( cosTmp >= 1 )
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);
863 if( cosTmp >= 1 )
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);
890 if( cosTmp >= 1 )
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;
1147 if( norm2_2 == 0 )
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;
1163 if( norm2_2 == 0 )
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;
1179 if( norm2_2 == 0 )
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;
1195 if( norm2_2 == 0 )
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;
1213 if( norm2_2 == 0 )
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;
1231 if( norm2_2 == 0 )
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;
1249 if( norm2_2 == 0 )
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;
1267 if( norm2_2 == 0 )
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 ) );