root/OpenSceneGraph/trunk/src/osgParticle/DomainOperator.cpp @ 13041

Revision 13041, 4.2 kB (checked in by robert, 2 years ago)

Ran script to remove trailing spaces and tabs

  • Property svn:eol-style set to native
Line 
1/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2010 Robert Osfield
2 *
3 * This library is open source and may be redistributed and/or modified under
4 * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
5 * (at your option) any later version.  The full license is in LICENSE file
6 * included with this distribution, and on the openscenegraph.org website.
7 *
8 * This library 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 * OpenSceneGraph Public License for more details.
12*/
13// Written by Wang Rui, (C) 2010
14
15#include <osg/Notify>
16#include <osgParticle/ModularProgram>
17#include <osgParticle/DomainOperator>
18
19using namespace osgParticle;
20
21void DomainOperator::operate( Particle* P, double dt )
22{
23    for ( std::vector<Domain>::iterator itr=_domains.begin(); itr!=_domains.end(); ++itr )
24    {
25        switch ( itr->type )
26        {
27        case Domain::POINT_DOMAIN:
28            handlePoint( *itr, P, dt );
29            break;
30        case Domain::LINE_DOMAIN:
31            handleLineSegment( *itr, P, dt );
32            break;
33        case Domain::TRI_DOMAIN:
34            handleTriangle( *itr, P, dt );
35            break;
36        case Domain::RECT_DOMAIN:
37            handleRectangle( *itr, P, dt );
38            break;
39        case Domain::PLANE_DOMAIN:
40            handlePlane( *itr, P, dt );
41            break;
42        case Domain::SPHERE_DOMAIN:
43            handleSphere( *itr, P, dt );
44            break;
45        case Domain::BOX_DOMAIN:
46            handleBox( *itr, P, dt );
47            break;
48        case Domain::DISK_DOMAIN:
49            handleDisk( *itr, P, dt );
50            break;
51        default: break;
52        }
53    }
54}
55
56void DomainOperator::beginOperate( Program* prg )
57{
58    if ( prg->getReferenceFrame()==ModularProgram::RELATIVE_RF )
59    {
60        _backupDomains = _domains;
61        for ( std::vector<Domain>::iterator itr=_domains.begin(); itr!=_domains.end(); ++itr )
62        {
63            Domain& domain = *itr;
64            switch ( domain.type )
65            {
66            case Domain::POINT_DOMAIN:
67                domain.v1 = prg->transformLocalToWorld(domain.v1);
68                break;
69            case Domain::LINE_DOMAIN:
70                domain.v1 = prg->transformLocalToWorld(domain.v1);
71                domain.v2 = prg->transformLocalToWorld(domain.v2);
72                break;
73            case Domain::TRI_DOMAIN:
74                domain.v1 = prg->transformLocalToWorld(domain.v1);
75                domain.v2 = prg->transformLocalToWorld(domain.v2);
76                domain.v3 = prg->transformLocalToWorld(domain.v3);
77                domain.plane.set(domain.v1, domain.v2, domain.v3);
78                computeNewBasis( domain.v2-domain.v1, domain.v3-domain.v1, domain.s1, domain.s2 );
79                break;
80            case Domain::RECT_DOMAIN:
81                domain.v1 = prg->transformLocalToWorld(domain.v1);
82                domain.v2 = prg->rotateLocalToWorld(domain.v2);  // Width vector
83                domain.v3 = prg->rotateLocalToWorld(domain.v3);  // Height vector
84                domain.plane.set(domain.v1, domain.v1+domain.v2, domain.v1+domain.v3);
85                computeNewBasis( domain.v2, domain.v3, domain.s1, domain.s2 );
86                break;
87            case Domain::PLANE_DOMAIN:
88                domain.plane.transformProvidingInverse( prg->getLocalToWorldMatrix() );
89                break;
90            case Domain::SPHERE_DOMAIN:
91                domain.v1 = prg->transformLocalToWorld(domain.v1);
92                break;
93            case Domain::BOX_DOMAIN:
94                domain.v1 = prg->transformLocalToWorld(domain.v1);
95                domain.v2 = prg->transformLocalToWorld(domain.v2);
96                break;
97            case Domain::DISK_DOMAIN:
98                domain.v1 = prg->transformLocalToWorld(domain.v1);
99                domain.v2 = prg->rotateLocalToWorld(domain.v2);
100                domain.v2.normalize();  // Normal
101                break;
102            default: break;
103            }
104        }
105    }
106}
107
108void DomainOperator::endOperate()
109{
110    if ( _backupDomains.size()>0 )
111    {
112        _domains = _backupDomains;
113        _backupDomains.clear();
114    }
115}
Note: See TracBrowser for help on using the browser.