コード例 #1
0
ファイル: dmzNetPluginRemoteDR.cpp プロジェクト: Andais/dmz
// TimeSlice Interface
void
dmz::NetPluginRemoteDR::update_time_slice (const Float64 TimeDelta) {

   if (_objMod && _lnvHandle && _defaultHandle) {

      const Float64 CurrentTime (_time.get_frame_time ());

      HashTableHandleIterator it;

      for (
            NetPluginRemoteDR *current = _objTable.get_first (it);
            current;
            current = _objTable.get_next (it)) {

         const Handle ObjectHandle (it.get_hash_key ());

         Vector lnvPos;
         Vector vel;
         Float64 timestamp (0.0);

         if (_objMod->lookup_position (ObjectHandle, _lnvHandle, lnvPos) &&
               _objMod->lookup_velocity (ObjectHandle, _defaultHandle, vel) &&
               _objMod->lookup_time_stamp (ObjectHandle, _lnvHandle, timestamp)) {

            const Vector Pos (lnvPos + (vel * (CurrentTime - timestamp)));
            _objMod->store_position (ObjectHandle, _defaultHandle, Pos);
         }
      }
   }
}
コード例 #2
0
void
dmz::RenderPluginObjectLoaderOSG::discover_plugin (
      const PluginDiscoverEnum Mode,
      const Plugin *PluginPtr) {

   if (Mode == PluginDiscoverAdd) {

      if (!_core) { _core = RenderModuleCoreOSG::cast (PluginPtr); }
   }
   else if (Mode == PluginDiscoverRemove) {

      if (_core && (_core == RenderModuleCoreOSG::cast (PluginPtr))) {
      
         HashTableHandleIterator it;
         ObjectStruct *os (0);

         while (_objectTable.get_next (it, os)) {

            osg::Group *group (_core->lookup_dynamic_object (it.get_hash_key ()));

            if (os->model.valid () && group) { group->removeChild (os->model.get ()); }
         }
         
         _core = 0;
      }
   }
}
コード例 #3
0
// TimeSlice Interface
void
dmz::RenderPluginEventOSG::update_time_slice (const Float64 TimeDelta) {

   HashTableHandleIterator it;
   EventStruct *event (0);
   osg::Group *group = _core ? _core->get_dynamic_objects () : 0;

   while (_eventTable.get_next (it, event)) {

      event->scalar += event->Type.Rate * TimeDelta;

//_log.warn << "Processing: " << it.get_hash_key () << " " << event->scalar << " " << event->Type.Scale << endl;

      if (event->scalar > event->Type.Scale) {

         if (group) { group->removeChild (event->root.get ()); }

         event = _eventTable.remove (it.get_hash_key ());

         if (event) { delete event; event = 0; }
      }
      else {

         const Float64 Value = event->scalar;
         osg::Matrix mat;
         mat.makeScale (osg::Vec3 (Value, Value, Value));
         event->scale->setMatrix (mat);
      }
   }
}
コード例 #4
0
ファイル: dmzJsExtV8Archive.cpp プロジェクト: ben-sangster/js
void
dmz::JsExtV8Archive::create_archive (
      const Handle ArchiveHandle,
      const Int32 Version,
      Config &local,
      Config &global) {

   CallbackTable *ct = _createTable.lookup (ArchiveHandle);

   if (ct && (_v8Context.IsEmpty () == false) && _runtime) {

      v8::Context::Scope cscope (_v8Context);
      v8::HandleScope scope;

      const int Argc = 5;
      V8Value argv[Argc];
      argv[1] = v8::Integer::New (Version);
      argv[2] = v8::Integer::NewFromUnsigned (ArchiveHandle);
      argv[3] = _runtime->create_v8_config (&global);

      HashTableHandleIterator it;
      CallbackStruct *cb (0);

      while (ct->table.get_next (it, cb)) {

         if ((cb->self.IsEmpty () == false) && (cb->func.IsEmpty () == false)) {

            // Copy self and func onto stack because CallbackStruct  may not be valid
            // after the callback is made.
            V8Object localSelf = v8::Local<v8::Object>::New (cb->self);
            V8Function localFunc = v8::Local<v8::Function>::New (cb->func);
            const Handle Instance = cb->is.Instance;

            v8::TryCatch tc;

            Config data (cb->is.Name);
            argv[0] = _runtime->create_v8_config (&data);
            argv[Argc - 1] = localSelf;
            // CallbackStruct cs may not be valid after this call and should not be
            // referenced after this point.
            localFunc->Call (localSelf, Argc, argv);

            global.add_config (data);

            if (tc.HasCaught ()) {

               if (_core) { _core->handle_v8_exception (it.get_hash_key (), tc); }

               cb = ct->table.lookup (Instance);

               if (cb) { delete cb; cb = 0; }
            }
         }
      }
   }
}
コード例 #5
0
ファイル: dmzRuntimeData.cpp プロジェクト: ashok/dmz
/*!

\brief Relational "equal to" operator.
\details Compares the attribute handles and element values.
\param[in] Value Data object to compare values.
\return Returns dmz::True if the two data object contain the same values for
their attributes.

*/
dmz::Boolean
dmz::Data::operator== (const Data &Value) const {

   Boolean result (False);

   if (_state.dataTable.get_count () == Value._state.dataTable.get_count ()) {

      result = True;
      HashTableHandleIterator it;

      dataStruct *ds (_state.dataTable.get_first (it));

      while (result && ds) {

         dataStruct *compareDs (Value._state.dataTable.lookup (it.get_hash_key ()));

         if (compareDs) {

            if (compareDs->Attr.Type == ds->Attr.Type) {

               if (ds->Attr.Type == BaseTypeString) {

                  const Int32 ElementCount (ds->get_element_count ());
                  Int32 elCount (0);
                  Boolean keepChecking (True);

                  while (keepChecking) {

                     if (elCount >= ElementCount) { keepChecking = False; }
                     else {

                        String str1, str2;

                        _state.to_string (*ds, elCount, str1);
                        Value._state.to_string (*compareDs, elCount, str2);

                        if (str1 != str2) { keepChecking = False; result = False; }
                        else { elCount++; }
                     }
                  }
               }
               else if (*ds != *compareDs) {

                  result = False;
               }

               ds = _state.dataTable.get_next (it);
            }
            else { result = False; }
         }
         else { result = False; }
      }
   }

   return result;
}
コード例 #6
0
   // RuntimeModule Interface
   virtual void get_plugin_list (HandleContainer &container) {

      HashTableHandleIterator it;
      PluginStruct *ps (0);
   
      while (pluginTable.get_next (it, ps)) {

         container.add (it.get_hash_key ());
      }
   }
コード例 #7
0
   void dump_all (const PluginDiscoverEnum Mode) {

      if (observerContext) {

         HashTableHandleIterator it;
         PluginObserver *obs (0);

         while (observerContext->obsActiveTable.get_next (it, obs)) {

            dump (it.get_hash_key (), Mode);
         }
      }
   }
コード例 #8
0
void
dmz::RenderPluginObjectOSG::_remove_models () {

   if (_core) {

      HashTableHandleIterator it;
      ObjectStruct *os (0);

      while (_objectTable.get_next (it, os)) {

         osg::Group *group (_core->lookup_dynamic_object (it.get_hash_key ()));

         if (os->model.valid () && group) { group->removeChild (os->model.get ()); }
      }
   }
}
コード例 #9
0
//! Assignment operator.
dmz::HandleContainer &
dmz::HandleContainer::operator= (const HandleContainer &Container) {

   _state.table.clear ();

   HashTableHandleIterator it;

   void *ptr = Container._state.table.get_next (it);

   while (ptr) {

      _state.table.store (it.get_hash_key (), (void *)this);
      ptr = Container._state.table.get_next (it);
   }

   return *this;
}
コード例 #10
0
   void delete_plugins () {

      discovered = False;
      started = False;
      interfaceTable.clear ();

      HashTableHandleIterator it;
      PluginStruct *ps (0);
      while (pluginTable.get_prev (it, ps)) { ps->delete_plugin (); }

      it.reset ();
      ps = 0;
      while (pluginTable.get_prev (it, ps)) { ps->unload_plugin (); }

      pluginTable.empty ();
      externTable.clear ();
      if (levelsHead) { delete levelsHead; levelsHead = 0; }
      levelsTail = 0;
      maxLevel = 1;
   }
コード例 #11
0
ファイル: dmzJsExtV8Input.cpp プロジェクト: ben-sangster/js
void
dmz::JsExtV8Input::_do_callback (
      const int Argc,
      V8Value argv[],
      CallbackTable &ct,
      HandleContainer &called) {

   HashTableHandleIterator it;
   CallbackStruct *cb (0);

   while (ct.table.get_next (it, cb)) {

      if (!called.contains (it.get_hash_key ()) &&
            (cb->self.IsEmpty () == false) && (cb->func.IsEmpty () == false)) {

         // Copy self and func onto stack because CallbackStruct  may not be valid
         // after the callback is made.
         V8Object localSelf = v8::Local<v8::Object>::New (cb->self);
         V8Function localFunc = v8::Local<v8::Function>::New (cb->func);

         called.add (it.get_hash_key ());
         v8::TryCatch tc;

         argv[Argc - 1] = localSelf;
         // CallbackStruct cs may not be valid after this call and should not be
         // referenced after this point.
         localFunc->Call (localSelf, Argc, argv);

         if (tc.HasCaught ()) {

            if (_core) { _core->handle_v8_exception (it.get_hash_key (), tc); }
            _release_callback (localSelf, localFunc);
            cb = 0;
         }
      }
   }
}
コード例 #12
0
// TimeSlice Interface
void
dmz::WeaponPluginGravityBullet::update_time_slice (const Float64 TimeDelta) {

   ObjectModule *objMod (get_object_module ());

   if (objMod && _isectMod) {

      const Vector GravityVel (0.0, (-_gravity) * TimeDelta, 0.0);

      HashTableHandleIterator it;

      IsectParameters params;
      params.set_test_result_type (IsectClosestPoint);

      Float64 *speedPtr (_objectTable.get_first (it));

      while (speedPtr) {

         Handle obj (it.get_hash_key ());

         Vector pos;
         Matrix ori;
         Vector vel;
         objMod->lookup_position (obj, _defaultHandle, pos);
         objMod->lookup_orientation (obj, _defaultHandle, ori);
         objMod->lookup_velocity (obj, _defaultHandle, vel);
         vel += GravityVel;
         objMod->store_velocity (obj, _defaultHandle, vel);
         const Vector NewPos (pos + (vel * TimeDelta));

         IsectTestContainer test;
         IsectResultContainer isectResults;
         test.set_test (1, IsectSegmentTest, pos, NewPos);

         _isectMod->disable_isect (obj);

         if (_isectMod->do_isect (params, test, isectResults)) {

            if (_eventMod) {

               IsectResult value;
               isectResults.get_first (value);
               Handle target (0);
               value.get_object_handle (target);
               _eventMod->create_detonation_event (obj, target);
            }

            objMod->destroy_object (obj);
         }
         else {

            objMod->store_position (obj, _defaultHandle, NewPos);
            objMod->store_velocity (obj, _defaultHandle, vel);
         }

         _isectMod->enable_isect (obj);
         
         speedPtr = _objectTable.get_next (it);
      }
   }
}
コード例 #13
0
ファイル: dmzRuntimeInit.cpp プロジェクト: ben-sangster/dmz
/*!

\brief Initialized the runtime types, state, and time.
\ingroup Runtime
\details Defined in dmzRuntimeInit.h. \n
An XML example for defining the various runtime types and time settings:
\code
<dmz>
<runtime>

   <time>
      <factor value="1.0"/>
      <frequency value="60"/>
   </time>

   <!-- State definition -->
   <state name="State Name"/>

   <!-- dmz::ObjectType definition -->
   <object-type name="Object Name" parent="Parent Name">
      <!-- Object data -->
   </object-type>

   <!-- dmz::EventType definition -->
   <event-type name="Event Name" parent="Parent Name">
      <!-- Event data -->
   </event-type>

   <!-- dmz::Message definition -->
   <message name="Message Name" parent="Parent Name"/>

   <!-- dmz::Resources definition -->
   <resource-map>
      <!-- Search Path Group -->
      <search name="Search Path Name">
         <path value="Search Path 1"/>
         <path value="Search Path 2"/>
         ...
         <path value="Search Path N"/>
      </search>
      <!-- Resource List -->
      <resource name="Resource Name 1" file="Resource File" path="Search Name"/>
      <resource name="Resource Name 2" file="Resource File" path="Search Name"/>
      ...
      <resource name="Resource Name N" file="Resource File" path="Search Name"/>
   </resource-map>
</runtime>
</dmz>
\endcode
\param[in] Init Config containing runtime initialization data.
\param[in] context Pointer to runtime context.
\param[in] log Pointer to Log to use for log messages.
\sa dmz::ObjectType \n dmz::EventType \n dmz::Message \n dmz::Time

*/
void
dmz::runtime_init (const Config &Init, RuntimeContext *context, Log *log) {

   Config econfig;
   Config oconfig;
   Config sconfig;
   Config mconfig;
   Config tconfig;
   Config rconfig;

   Init.lookup_all_config ("event-type", econfig);
   Init.lookup_all_config ("object-type", oconfig);
   Init.lookup_all_config ("state", sconfig);
   Init.lookup_all_config ("message", mconfig);
   Init.lookup_all_config_merged ("time", tconfig);
   Init.lookup_all_config_merged ("resource-map", rconfig);

   if (context) {

      if (econfig || oconfig || sconfig) {

         RuntimeContextDefinitions *defs = context->get_definitions_context ();

         if (defs) {

            defs->ref ();
            if (econfig) { local_init_event_type (econfig, *defs, context, log); }
            else if (log) { log->debug << "Event type config not found" << endl; }
            if (oconfig) { local_init_object_type (oconfig, *defs, context, log); }
            else if (log) { log->debug << "Object type config not found" << endl; }
            if (sconfig) { local_init_state (sconfig, *defs, log); }
            else if (log) { log->debug << "State config not found" << endl; }

            if (defs->handleObsTable.get_count () > 0) {

               HashTableHandleIterator it;
               String *ptr (0);

               while (defs->namedHandleNameTable.get_next (it, ptr)) {

                  defs->define_named_handle (it.get_hash_key (), *ptr);
               }
            }

            if (defs->maskObsTable.get_count () > 0) {

               HashTableStringIterator it;
               Mask *ptr (0);

               while (defs->maskTable.get_next (it, ptr)) {

                  defs->define_state (*ptr, it.get_hash_key ());
               }
            }

            if (defs->objectObsTable.get_count () > 0) {

               HashTableHandleIterator it;
               ObjectType *ptr (0);

               while (defs->objectHandleTable.get_next (it, ptr)) {

                  defs->define_object_type (*ptr);
               }
            }

            if (defs->eventObsTable.get_count () > 0) {

               HashTableHandleIterator it;
               EventType *ptr (0);

               while (defs->eventHandleTable.get_next (it, ptr)) {

                  defs->define_event_type (*ptr);
               }
            }

            defs->unref (); defs = 0;
         }
      }

      if (mconfig) { local_init_message (mconfig, context, log); }
      else if (log) { log->debug << "Message type config not found" << endl; }

      if (tconfig) { local_init_time (tconfig, context, log); }
      else if (log) { log->debug << "Runtime time data not found" << endl; }

      if (rconfig) { local_init_resources (rconfig, context, log); }
      else if (log) { log->debug << "Runtime resource data not found" << endl; }
   }
}
コード例 #14
0
ファイル: dmzEventModuleBasic.cpp プロジェクト: Andais/dmz
void
dmz::EventModuleBasic::dump_event (const Handle EventHandle, EventDump &dump) {

   EventStruct *event (_lookup_event (EventHandle));

   if (event) {

      dump.start_dump_event (event->handle, event->type, event->locality);

      HashTableHandleIterator it;

      {
         Handle *ptr = event->objectTable.get_first (it);

         while (ptr) {

            dump.store_event_object_handle (event->handle, it.get_hash_key (), *ptr);
            ptr = event->objectTable.get_next (it);
         }
      }

      {
         ObjectType *ptr = event->typeTable.get_first (it);

         while (ptr) {

            dump.store_event_object_type (event->handle, it.get_hash_key (), *ptr);
            ptr = event->typeTable.get_next (it);
         }
      }

      {
         Mask *ptr = event->stateTable.get_first (it);

         while (ptr) {

            dump.store_event_state (event->handle, it.get_hash_key (), *ptr);
            ptr = event->stateTable.get_next (it);
         }
      }

      {
         Float64 *ptr = event->timeStampTable.get_first (it);

         while (ptr) {

            dump.store_event_time_stamp (event->handle, it.get_hash_key (), *ptr);
            ptr = event->timeStampTable.get_next (it);
         }
      }

      {
         Vector *ptr = event->positionTable.get_first (it);

         while (ptr) {

            dump.store_event_position (event->handle, it.get_hash_key (), *ptr);
            ptr = event->positionTable.get_next (it);
         }
      }

      {
         Matrix *ptr = event->orientationTable.get_first (it);

         while (ptr) {

            dump.store_event_orientation (event->handle, it.get_hash_key (), *ptr);
            ptr = event->orientationTable.get_next (it);
         }
      }

      {
         Vector *ptr = event->velocityTable.get_first (it);

         while (ptr) {

            dump.store_event_velocity (event->handle, it.get_hash_key (), *ptr);
            ptr = event->velocityTable.get_next (it);
         }
      }

      {
         Vector *ptr = event->accelerationTable.get_first (it);

         while (ptr) {

            dump.store_event_acceleration (event->handle, it.get_hash_key (), *ptr);
            ptr = event->accelerationTable.get_next (it);
         }
      }

      {
         Vector *ptr = event->scaleTable.get_first (it);

         while (ptr) {

            dump.store_event_scale (event->handle, it.get_hash_key (), *ptr);
            ptr = event->scaleTable.get_next (it);
         }
      }

      {
         Vector *ptr = event->vectorTable.get_first (it);

         while (ptr) {

            dump.store_event_vector (event->handle, it.get_hash_key (), *ptr);
            ptr = event->vectorTable.get_next (it);
         }
      }

      {
         Float64 *ptr = event->scalarTable.get_first (it);

         while (ptr) {

            dump.store_event_scalar (event->handle, it.get_hash_key (), *ptr);
            ptr = event->scalarTable.get_next (it);
         }
      }

      {
         String *ptr = event->textTable.get_first (it);

         while (ptr) {

            dump.store_event_text (event->handle, it.get_hash_key (), *ptr);
            ptr = event->textTable.get_next (it);
         }
      }

      {
         Data *ptr = event->dataTable.get_first (it);

         while (ptr) {

            dump.store_event_data (event->handle, it.get_hash_key (), *ptr);
            ptr = event->dataTable.get_next (it);
         }
      }

      dump.end_dump_event (event->handle);
   }
}
コード例 #15
0
// Time Slice Interface
void
dmz::CyclesPluginWallOSG::update_time_slice (const Float64 DeltaTime) {

   static const Vector Scale (1.0, 1.0, 1.0);

   HashTableHandleIterator it;

   ObjectStruct *os (_objectTable.get_first (it));

   while (os) {
      
      if (!os->dir.is_zero () && !os->dirPrev.is_zero ()) {

         if (os->triCount <= 0) {

            os->verts->push_back (osg::Vec3 (os->pos.get_x (), 0.0, os->pos.get_z ()));
            os->verts->push_back (
               osg::Vec3 (os->pos.get_x (), os->WallInfo.Height, os->pos.get_z ()));

            os->verts->push_back (osg::Vec3 (os->pos.get_x (), 0.0, os->pos.get_z ()));
            os->verts->push_back (
               osg::Vec3 (os->pos.get_x (), os->WallInfo.Height, os->pos.get_z ()));

            os->triCount = 2;

            os->draw->setCount (os->triCount + 2);
            osg::Vec3 normal (os->dir.get_z (), 0.0, os->dir.get_x ());
            os->normals->push_back (normal);
            os->normals->push_back (normal);
            os->lastCorner = os->pos;
         }
         else {

            const Float64 Dot (os->dir.dot (os->dirPrev));

            if (!is_zero64 (Dot - 1.0)) {

               const Vector Previous (os->dirPrev * os->dirPrev);
               const Vector Current (os->dir * os->dir);

               osg::Vec3 pos (
                  (os->pos.get_x () * Previous.get_x ()) +
                     (os->posPrev.get_x () * Current.get_x ()),
                  0.0f,
                  (os->pos.get_z () * Previous.get_z ()) +
                     (os->posPrev.get_z () * Current.get_z ()));

               (*(os->verts))[os->triCount] = pos;
               os->verts->push_back (pos);

               pos.y () = os->WallInfo.Height;

               (*(os->verts))[os->triCount + 1] = pos;
               os->verts->push_back (pos);

               os->triCount += 2;

               os->draw->setCount (os->triCount + 2);
               osg::Vec3 normal (os->dir.get_z (), 0.0, os->dir.get_x ());
               os->normals->push_back (normal);
               os->normals->push_back (normal);
               os->lastCorner.set_xyz (pos.x (), 0.0, pos.z ());
            }
         }

         if ((os->pos - os->lastCorner).magnitude () > os->WallInfo.Offset) {

            Vector pos (os->pos - (os->dir * os->WallInfo.Offset));
            (*(os->verts))[os->triCount] =
               osg::Vec3 (pos.get_x (), 0.0f, pos.get_z ());
            (*(os->verts))[os->triCount + 1] =
               osg::Vec3 (pos.get_x (), os->WallInfo.Height, pos.get_z ());

            os->wall->dirtyDisplayList ();
            os->wall->dirtyBound ();
         }

         os->posPrev = os->pos;
         os->dirPrev = os->dir;
      }

      os  = _objectTable.get_next (it);
   }

   os = _deadTable.get_first (it);

   while (os) {

      if (os->wallYOffset < (-os->WallInfo.Height)) {

         ObjectStruct *tmp = _deadTable.remove (it.get_hash_key ());
         if (tmp) { _remove_wall (*tmp); delete tmp; tmp = 0; }
      }
      else {

         os->wallYOffset -= 2.0 * DeltaTime;
         os->xform->setMatrix (
            to_osg_matrix (Matrix (), Vector (0.0, os->wallYOffset, 0.0), Scale));
      }

      os  = _deadTable.get_next (it);
   }
}