Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Oct 4, 2015, 12:16:42 PM (9 years ago)
Author:
landauf
Message:

merged branch SciptableControllerFS15

Location:
code/branches/presentationFS15merge
Files:
7 edited
1 copied

Legend:

Unmodified
Added
Removed
  • code/branches/presentationFS15merge

  • code/branches/presentationFS15merge/data/gui/scripts/testscript.lua

    r10262 r10614  
    2222-- If it worked, call its "movetoposition" function
    2323if ctrl ~= nil then
    24   -- Move to the starting point at (xl+3000,yl,zl) while looking
    25   -- at xl,yl,zl over the time span of 3 seconds
    26   ctrl:eventScheduler("mal", xl+3000,yl,zl, xl,yl,zl, 1, 0)
    2724
    28   -- From there, perform a rotation around the harvester placed there
    29   -- in 100 steps
    30   dt = math.pi/100
    31   for t = 0,math.pi,dt do
    32     xt = math.cos(t)
    33     yt = math.sin(t)
    34 
    35     ctrl:eventScheduler("mal", xl+3000*xt, yl+3000*yt, zl, xl, yl, zl, dt, t+0.9)
    36   end
    37 
    38 
    39   -- Update absolute time
    40   Tabs = math.pi + 0.9
    41 
    42  
    43 
    44   -- Move away again, still looking at the station
    45   ctrl:eventScheduler("mal", 0,0,1000, xl,yl,zl, 3, Tabs+0.4)
    46 
    47 
    48 
    49   -- Update absolute time
    50   Tabs = Tabs + 0.4 + 3
    51 
    52  
    53 
    54  
    55 
    56   -- Transition the look from (xl,yl,zl) to (3500,0,0) in 3 seconds
    57   ctrl:eventScheduler("chl", xl, yl, zl, xr, yr, zr, 2, Tabs+0.2)
    58 
    59   Tabs = Tabs + 2 + 0.2
    60 
    61    ctrl:eventScheduler("mal", xr + 600,yr,zr, xr,yr,zr, 4, Tabs+0)
    62 
    63    Tabs = Tabs + 4
    64 
    65   for t = 0,math.pi,dt do
    66     xt = math.cos(t)
    67     zt = math.sin(t)
    68 
    69     ctrl:eventScheduler("mal", xr+600*xt, yr, zr+600*zt, xr, yr, zr, dt, Tabs+t)
    70   end
    71 
    72   Tabs = Tabs + math.pi
    73 
    74   ctrl:eventScheduler("chl", xr, yr, zr, xl, yl, zl, 3, Tabs+0.2)
    75 
    76   Tabs = Tabs + 3 + 0.2
    77 
    78   ctrl:eventScheduler("mal", xm,ym,zm, xl,yl,zl, 4, Tabs+2.5)
    79 
     25  ctrl:eventScheduler("mal", xl,yl,zl, xl,yl,zl, 2)
     26  ctrl:eventScheduler("idle", 1)
     27  ctrl:eventScheduler("ral", xl, yl, zl, 3, 0, 0, math.pi)
     28  ctrl:eventScheduler("idle", 1)
     29  ctrl:eventScheduler("mal", 0,0,1000, xl,yl,zl, 3)
     30  ctrl:eventScheduler("idle", 1)
     31  ctrl:eventScheduler("chl", xl, yl, zl, xr, yr, zr, 2)
     32  ctrl:eventScheduler("idle", 1)
     33  ctrl:eventScheduler("mal", xr + 600,yr,zr, xr,yr,zr, 4)
     34  ctrl:eventScheduler("idle", 1)
     35  ctrl:eventScheduler("chl", xr, yr, zr, xl, yl, zl, 3)
     36  ctrl:eventScheduler("idle", 1)
     37  ctrl:eventScheduler("spi", xm,ym,zm, 0,0,0, 4)
     38  ctrl:eventScheduler("idle", 600)
    8039
    8140end
    82 
    83 
    84 
    85 -- Output the newctrlid variable we set from the C++ code
    86 if newctrlid ~= nil then
    87   orxonox.execute("orxout message test " .. newctrlid)
    88 end
    89 
    90 --orxonox.execute("setPause 1")
    91 
    92 
  • code/branches/presentationFS15merge/data/levels/scriptController.oxw

    r10262 r10614  
    11<!-- First levelFile of mkronig and samuezu. It was copied from dockingToASpaceStation.oxw and modified a little bit -->
    22<LevelInfo
    3  name = "Fancy orxout tests"
    4  description = "Docking into a spacestation."
     3 name = "Scriptable Controller"
     4 description = "Showcase for Scriptable Controller"
    55 tags = "showcase"
    66 screenshot = "emptylevel.png"
     
    1111  include("HUDTemplates3.oxo")
    1212  include("templates/lodInformation.oxt")
    13   include("templates/pickupRepresentationTemplates.oxt")
    1413?>
    1514
    1615<?lua
    17   include("templates/spaceshipAssff.oxt")
    18   include("templates/spaceshipPirate.oxt")
    1916  include("templates/spaceshipEscort.oxt")
    20   include("templates/bigship.oxt")
    21   include("templates/spaceshipTurret.oxt")
    22   include("templates/spaceshipCollateralDamage.oxt")
    23   include("templates/FPS.oxt")
    2417?>
    2518
     
    4033  >
    4134
    42     <?lua
    43       include("includes/pickups.oxi")
    44     ?>
     35    <Light type=directional position="0,0,0" direction="0.253, 0.593, -0.765" diffuse="1.0,1.0,1.0,0.5" specular="1.0, 0.9, 0.9, 1.0"/>
    4536
    46     <Light type=directional position="0,0,0" direction="0.253, 0.593, -0.765" diffuse="1.0,1.0,1.0,0.5" specular="1.0, 0.9, 0.9, 1.0"/>
    4737    <SpawnPoint team=0 position="3200,0,0" lookat="2800,0,0" spawnclass=SpaceShip pawndesign=spaceshipescort />
    4838
    49     <StaticEntity position  = "2800,0,0" mass=10000 collisionType=static >
     39    <Billboard position="2500,0,0" material="Flares/ringflare2" colour="0.2,0.4,0.8" scale=10 />
     40    <DistanceTrigger position="2500,0,0" distance="200" target="Pawn"
     41      beaconMode="exclude" targetname="bcnDestroyer" name="takeControl"
     42    />
     43
     44    <StaticEntity position  = "2000,500,2000" mass=10000 collisionType=static >
    5045      <attached>
    51         <Model mesh="HydroHarvester.mesh" mass=10 position="0,0,0" scale=50 />
     46        <Model mesh="HydroHarvester.mesh" mass=10 position="0,0,0" scale=10 />
    5247      </attached>
    53       <collisionShapes>
    54         <BoxCollisionShape  position="-560,0,0" halfExtents="115,100,245" /><!-- Three lower boxes -->
    55         <BoxCollisionShape  position="290,0,-480" halfExtents="115,100,245" yaw=-120 />
    56         <BoxCollisionShape  position="290,0,480" halfExtents="115,100,245" yaw=-240 />
    57         <BoxCollisionShape  position="-280,0,0" halfExtents="163,50,50" /><!-- Three lower connections -->
    58         <BoxCollisionShape  position="140,0,-240" halfExtents="163,50,50" yaw=-120 />
    59         <BoxCollisionShape  position="140,0,240" halfExtents="163,50,50" yaw=-240 />
    60         <BoxCollisionShape  position="0,530,0" halfExtents="172,52,298" /><!-- Upper Tower -->
    61         <BoxCollisionShape  position="0,530,0" halfExtents="172,52,298" yaw=-120 />
    62         <BoxCollisionShape  position="0,530,0" halfExtents="172,52,298" yaw=-240 />
    63         <BoxCollisionShape  position="0,400,0" halfExtents="43,110,26" yaw=-30 /><!-- Middle one-->
    64         <BoxCollisionShape  position="-200,100,0" halfExtents="26,50,43" /><!--Three lower legs -->
    65         <BoxCollisionShape  position="100,100,-173" halfExtents="43,50,26" yaw=-30 />
    66         <BoxCollisionShape  position="100,100,-173" halfExtents="43,50,26" yaw=30 />
    67         <BoxCollisionShape  position="-100,264,0" halfExtents="26,105,43" roll=-49 /><!--Three upper legs -->
    68         <BoxCollisionShape  position="50,264,-87" halfExtents="26,105,43" roll=-49 yaw=-120 />
    69         <BoxCollisionShape  position="50,264,87" halfExtents="26,105,43" roll=-49 yaw=-240 />
    70       </collisionShapes>
    7148    </StaticEntity>
    7249
    73 <!-- Docking  -->
    74     <Dock position="2830,20,50" roll=0 yaw=0 >
    75         <animations>
    76             <MoveToDockingTarget target="destroyer" />
    77         </animations>
    78         <effects>
    79             <DockToShip target="spaceShip" />
    80         </effects>
     50    <StaticEntity position  = "-1000,3000,-1000" mass=10000 collisionType=static >
     51      <attached>
     52        <Model mesh="HydroHarvester.mesh" mass=10 position="0,0,0" scale=80 />
     53      </attached>
     54    </StaticEntity>
     55
     56<!-- ControllerDirector waits for the event takeControl to attach a new Controller -->
     57    <ControllerDirector position="0,0,0" scriptname="presentation">
    8158        <events>
    82             <execute>
    83                 <EventListener event="dockMe" />
    84             </execute>
    85 
    86             <undocking>
    87                 <EventListener event="undockMe" />
    88             </undocking>
    89        
    90             <activity>
    91                 <EventListener event=notGameEnd />
    92             </activity>
     59            <takeControl>
     60                <EventListener event="takeControl" />
     61            </takeControl>
    9362        </events>
    94         <attached>
    95         <!-- Trigger for docking with billboard -->
    96 
    97                 <!-- removed -->
    98 
    99         <!-- Trigger for undocking with billboard -->
    100             <!-- <Billboard position="-2630,-19970,150" material="Flares/ringflare2" colour="0.2,0.4,0.8" scale=1 /> -->
    101             <DistanceTrigger position="-2630,-19970,150" distance="50" target="Pawn"
    102                 beaconMode="identify" targetname="bcnDestroyer" name="undockMe"
    103             />
    104         </attached>
    105     </Dock>
    106 
    107     <Billboard position="0,0,0" material="Flares/ringflare2" colour="0.2,0.4,0.8" scale=100 />
    108     <DistanceTrigger position="0,0,0" distance="200" target="Pawn"
    109       beaconMode="exclude" targetname="bcnDestroyer" name="dockMe"
    110     />
    111 
    112 
    113 <!-- Object, which orxouts the message "hello Universe!". EVENT NOT WORKING  -->
    114     <ScriptController position="0,0,0">
    115         <events>
    116             <party>
    117                 <EventListener event="dockMe" />
    118             </party>
    119 
    120         </events>
    121 
    122     </ScriptController>
    123 
    124 
    125 <!-- FPS Player as destination of the dock -->
    126 <FpsPlayer template = "fps" radarname = "First Person Player" position = "0,-19900,0" >
    127       <attached>
    128         <DockingTarget name="spaceShip" />
    129         <DistanceTriggerBeacon name="bcnDestroyer" />
    130         <DockingTarget name="destroyer" />
    131       </attached>
    132 </FpsPlayer>
    133 
    134 
    135 <!-- Cube as test SpaceStation
    136 
    137 The station can either be hidden outside of the skybox, within the hull of the space station if it is big enough or within a planet.
    138 Complex spacestations can be placed very far away from the spaceship so it is rendered at low resolution while the player uses the space ship.
    139 
    140 -->
    141   <StaticEntity position="0,-20000,0" direction="0,-1,0" collisionType=static mass=100000 friction=0.01 >
    142       <attached>
    143         <Model position="0,0,0" mesh="crate.mesh" scale3D="80,80,5" />
    144       </attached>
    145       <collisionShapes>
    146         <BoxCollisionShape position="0,0,0" halfExtents="400,400,25" />
    147       </collisionShapes>
    148   </StaticEntity>
    149 
    150 <!-- Homogenous gravitationfield to simulate local gravity (activating the normal gravity will affect the spaceship terribly) -->
    151 <ForceField position="0,-20000,0" mode="homogen" diameter="2000" forcedirection = "0,-500,0" />
    152 
    153 
    154 <!-- Some more stuff -->
    155 
    156     <!-- triple large belt around the planet  -->
    157     <?lua
    158         dofile("includes/asteroidField.lua")
    159         asteroidBelt(15000, 0, 0, 30, 0, 30, 30, 50, 7190, 7800, 250, 1)
    160     ?>
    161     <?lua
    162         dofile("includes/asteroidField.lua")
    163         asteroidBelt(15000, 0, 0, 30, 0, 30, 30, 50, 10000, 11000, 300, 1)
    164     ?>
    165     <?lua
    166         dofile("includes/asteroidField.lua")
    167         asteroidBelt(15000, 0, 0, 30, 0, 30, 30, 50, 14000, 15000, 350, 1)
    168     ?>
    169 
    170     <Planet
    171       position="15000,0,-1000"
    172       scale="5000"
    173       collisionType="dynamic"
    174       linearDamping="0.8"
    175       angularDamping="0"
    176       mass="10000000"
    177       pitch="0"
    178       mesh="planets/ganymede.mesh"
    179       atmosphere="atmosphere1"
    180       rotationaxis="1,0,0"
    181       rotationrate="1.0"
    182       atmospheresize="80.0f"
    183       imagesize="1024.0f"
    184       collisiondamage = 2
    185       enablecollisiondamage = true
    186     >
    187       <attached>
    188         <ForceField position="5000,0,0" mode="sphere" diameter="10000" velocity="-50" />
    189       </attached>
    190       <collisionShapes>
    191         <SphereCollisionShape radius="5000" position="0,0,0" />
    192       </collisionShapes>
    193     </Planet>
     63    </ControllerDirector>
    19464
    19565  </Scene>
    196 
    19766</Level>
    19867
  • code/branches/presentationFS15merge/src/orxonox/controllers/ControllerDirector.cc

    r10262 r10614  
    4141    {
    4242        SUPER(ControllerDirector, XMLPort, xmlelement, mode);
     43        XMLPortParam(ControllerDirector, "scriptname", setScriptName, getScriptName, xmlelement, mode).defaultValues("testscript");
    4344
    4445        orxout(verbose)<< "ControllerDirector::XMLPort "
     
    8384       else
    8485         return;
    85        
     86
    8687       /* Set up a luastate to use for running the scripts */
    8788       LuaState * ls = new LuaState();
     
    9899        * variable "newctrlid" defined, which means it can make use of it.
    99100        */
    100 
    101        ls->doFile("testscript.lua");
     101       std::string scr = this->scriptname_ + ".lua";
     102       ls->doFile(scr);
    102103
    103104       /* Increase the controller ID so we have a different one for
  • code/branches/presentationFS15merge/src/orxonox/controllers/ControllerDirector.h

    r10262 r10614  
    4747            virtual void XMLEventPort(Element& xmlelement, XMLPort::Mode mode);
    4848
     49            inline void setScriptName(const std::string& name) { this->scriptname_ = name; }
     50            inline const std::string& getScriptName() const { return this->scriptname_; }
     51
    4952
    5053            /* Take over control of a given object */
     
    5558            //void setNewController(Controller * controller);
    5659
    57         private:
     60        protected:
     61            std::string scriptname_;   
    5862            PlayerInfo* player_;
    5963            ControllableEntity* entity_;
  • code/branches/presentationFS15merge/src/orxonox/controllers/ScriptController.cc

    r10262 r10614  
    2121 *
    2222 *   Author:
    23  *      Fabian 'x3n' Landau
     23 *      ...
    2424 *   Co-authors:
    2525 *      ...
    2626 *
    2727 */
     28
     29 /*
     30  * Currently available lua commands:
     31  *
     32  * IMPORTANT: ALL COMMANDS DO REQUIRE 7 PARAMETERS TO BE PROVIDED. FILL UP WITH ZEROES IN UNIMPORTANT PLACES.
     33  *
     34  * Command             | Abbreviation | Parameter 1          | '' 2     | '' 3    | '' 4                 | '' 5     | '' 6     | '' 7
     35  *
     36  * "Move And Look"     | mal          | GoTo X Coordinate    | '' Y ''  | '' Z '' | LookAt X Coordinate  |  '' Y '' |  '' Y '' | Duration
     37  * "Rotate And Look"   | ral          | GoTo X Coordinate    | '' Y ''  | '' Z '' | Axis (1=x, 2=z, 3=z) |     -    |     -    | Duration
     38  * "Spiral"            | spi          | GoTo X Coordinate    | '' Y ''  | '' Z '' |          -           |     -    |     -    | Duration
     39  * "Transition Look"   | chl          | From X Coordinate    | '' Y ''  | '' Z '' | To X Coordinate      |  '' Y '' |  '' Y '' | Duration
     40  * "Idle (Do nothing)" | idle         | Duration
     41  */
    2842
    2943#include "ScriptController.h"
     
    3246#include "worldentities/ControllableEntity.h"
    3347#include "core/LuaState.h"
     48#include "core/LuaState.h"
    3449#include <cmath>
     50
    3551
    3652namespace orxonox
     
    6682        this->eventno = 0;
    6783
     84        /* - First "previous event" scheduled at t=0 */
     85        /* - Needed for automatically updating event times */
     86        this->prevEventTime = 0;
    6887    }
    6988
     
    178197
    179198        /* Get a variable that specifies how far along the trajectory
    180          * we are
     199         * we are currently.
    181200         */
    182201        float dl = eventTime / currentEvent.duration;
    183202
    184         /* Depending */
     203        /* Depending on command */
    185204        /* Do some moving */
    186205        if( this->processing )
    187         {
    188           if( this->currentEvent.fctName == "mal" )
     206        {
     207          // Abbreviation for "spiral" (rotation + translation)
     208          if (this->currentEvent.fctName == "spi") {
     209
     210            // Need to know a perpendicular basis to the translation vector:
     211            // Given (a, b, c) we chose (b, -a, 0)norm and (0, c, -b)norm
     212            // Currently we set a fix rotational radius of 400
     213            // TODO: Add an option to adjust radius of spiral movement
     214            Vector3 direction = this->currentEvent.v1 - startpos;
     215
     216            Vector3* ortho1 = new Vector3(direction.y, -direction.x, 0);
     217            float absOrtho1 = sqrt(direction.y * direction.y + direction.x * direction.x);
     218            *ortho1 = 400 * cos(2 * M_PI * dl) * (*ortho1)/absOrtho1;
     219
     220            Vector3* ortho2 = new Vector3(0, direction.z, -direction.y);
     221            float absOrtho2 = sqrt(direction.y * direction.y + direction.z * direction.z);
     222            *ortho2 = 400 * sin(2 * M_PI * dl) * (*ortho2)/absOrtho2;
     223
     224            this->entity_->setPosition( (1-dl)*startpos + dl * this->currentEvent.v1 + *ortho1 + *ortho2);
     225
     226            delete ortho1;
     227            delete ortho2;
     228          }
     229
     230          // Abbreviation for "rotate and look"
     231          if (this->currentEvent.fctName == "ral")
     232          {
     233            // Specify the axis
     234            Vector3* a;
     235              switch ((int) currentEvent.d) {
     236                case 3:
     237                  a = new Vector3(this->currentEvent.v1.x + this->currentEvent.e*cos(2*M_PI*dl),
     238                                  this->currentEvent.v1.y + this->currentEvent.e*sin(2*M_PI*dl),
     239                                  this->currentEvent.v1.z);
     240                break;
     241                case 2:
     242                  a = new Vector3(this->currentEvent.v1.x + this->currentEvent.e*sin(2*M_PI*dl),
     243                                  this->currentEvent.v1.y,
     244                                  this->currentEvent.v1.z + this->currentEvent.e*cos(2*M_PI*dl));
     245                break;
     246                case 1:
     247                  a = new Vector3(this->currentEvent.v1.x,
     248                                  this->currentEvent.v1.y + this->currentEvent.e*sin(2*M_PI*dl),
     249                                  this->currentEvent.v1.z + this->currentEvent.e*cos(2*M_PI*dl));
     250                break;
     251              }
     252
     253            this->entity_->setPosition(*a);
     254
     255            /* Look at the specified position */
     256            this->entity_->lookAt(this->currentEvent.v1);
     257          }
     258          else if( this->currentEvent.fctName == "mal" )
    189259          {
    190260            /* Set the position to the correct place in the trajectory */
     
    193263            /* Look at the specified position */
    194264            this->entity_->lookAt(this->currentEvent.v2);
    195 
    196             /* Update look at position */
    197             //this->lookAtPosition = this->currentEvent.v2;
    198265          }
    199266          else if( this->currentEvent.fctName == "chl" )
     
    224291      /* Fill the structure with all the provided information */
    225292      tmp.fctName = instruction;
     293
    226294      //tmp.x1 = x1; tmp.y1 = y1; tmp.z1 = z1;
    227295      //tmp.x2 = x2; tmp.y2 = y2; tmp.z2 = z2;
    228296      tmp.v1 = Vector3(x1,y1,z1);
    229297      tmp.v2 = Vector3(x2,y2,z2);
     298
     299      // the parameters are not required to be vector coordinates!
     300      // for convenience they are however stored twice if they have some kind of different meaning
     301      tmp.a = x1;
     302      tmp.b = y1;
     303      tmp.c = z1;
     304      tmp.d = x2;
     305      tmp.e = y2;
     306      tmp.f = z2;
     307
    230308      tmp.duration = duration;
    231       tmp.eventTime = executionTime;
    232 
    233       orxout(verbose) << tmp.fctName << endl;
     309
     310      /* This is kind of a hack. If we hit the function idle all we want to do is
     311         advance event execution time, not schedule anything */
     312      if (instruction == "idle") {
     313        tmp.eventTime = this->prevEventTime;
     314        this->prevEventTime += x1;
     315        return;
     316      } else {
     317        tmp.eventTime = this->prevEventTime;
     318        this->prevEventTime += duration;
     319      }
    234320
    235321      /* Add the created event to the event list */
  • code/branches/presentationFS15merge/src/orxonox/controllers/ScriptController.h

    r10262 r10614  
    2121 *
    2222 *   Author:
    23  *      Fabian 'x3n' Landau
     23 *      ...
    2424 *   Co-authors:
    2525 *      ...
     
    4545        std::string fctName;
    4646
     47        /** Final position we want to be at **/
    4748        Vector3 v1;
     49
     50        /** Where we are looking **/
    4851        Vector3 v2;
     52
     53        /** The parameters are additionally stored as a set of 6 numerical values **/
     54        float a, b, c, d, e, f;
    4955
    5056        /** Time span of the event */
     
    6975            // LUA interface
    7076            // tolua_begin
    71             void eventScheduler(std::string instruction,
    72               float x1, float y1, float z1,
    73               float x2, float y2, float z2,
    74               float duration, float executionTime);
     77            void eventScheduler(std::string instruction = "",
     78              float x1 = 0, float y1 = 0, float z1 = 0,
     79              float x2 = 0, float y2 = 0, float z2 = 0,
     80              float duration = 0, float executionTime = 0);
    7581
    7682            static ScriptController* getScriptController();
     
    116122            Vector3 startpos;
    117123
     124            /* Time of the previously scheduled event */
     125            float prevEventTime;
     126
    118127            /* - Position to look at during that transition */
    119128            //Vector3 lookAtPosition;
Note: See TracChangeset for help on using the changeset viewer.