Skip to main content

History: PUDotNet

Source of version: 1

Copy to clipboard
            PUDotNet.h
{CODE(wrap="1", colors="c++")}
#pragma once

#include <Ogre.h>
#include <ParticleUniverseSystem.h>
#include <ParticleUniverseSystemManager.h>

using namespace System;

namespace PUDotNet {

public ref class PUManager
{
    private:
      Mogre::SceneManager^ mScene;
      ParticleUniverse::ParticleSystemManager* mPUMgr;
      Collections::Generic::Dictionary<System::String^, IntPtr>^ mSystems;

    public:
      PUManager( Mogre::SceneManager^ _scene );
      !PUManager();
      ~PUManager();

      property bool IsDisposed { bool get(); }

      array<System::String^>^ GetTemplateNames();
      bool CreateParticleSystem( System::String^ _name, System::String^ _templateName );
      void DestroyParticleSystem( System::String^ _name );
      void AddToSceneNode( Mogre::SceneNode^ _node, System::String^ _name );
      void RemoveFromSceneNode( Mogre::SceneNode^ _node, System::String^ _name );
      void Start( System::String^ _name );
      void Stop( System::String^ _name );
      void Pause( System::String^ _name );
      void Resume( System::String^ _name );

    private:
      ParticleUniverse::ParticleSystem* GetByName( System::String^ _name );
};

}
{CODE}
PUDotNet.cpp
{CODE(wrap="1", colors="c++")}
#include "stdafx.h"

#include "PUDotNet.h"

namespace PUDotNet {

  PUManager::PUManager( Mogre::SceneManager^ _scene )
  {
    if( _scene == nullptr )
      throw gcnew System::ArgumentNullException( "_scene" );

    mScene = _scene;
    mPUMgr = ParticleUniverse::ParticleSystemManager::getSingletonPtr();
    mSystems = gcnew Collections::Generic::Dictionary<System::String^, IntPtr>();
  }

  PUManager::!PUManager()
  {
    if( mSystems != nullptr )
    {
      Collections::Generic::Dictionary<System::String^, IntPtr>::Enumerator it;
      it = mSystems->GetEnumerator();

      array<System::String^>^ names = gcnew array<System::String^>( mSystems->Keys->Count );
      int pos = 0;
      while( it.MoveNext() )
        names[ pos++ ] = it.Current.Key;

      for( int i = 0; i < names->Length; ++i )
        DestroyParticleSystem( names[i] );

      mSystems->Clear();
    }

    mSystems = nullptr;
    mPUMgr = NULL;
    mScene = nullptr;
  }

  PUManager::~PUManager()
  {
    this->!PUManager();
  }

  bool PUManager::IsDisposed::get()
  {
    return ( mPUMgr == NULL );
  }

  array<System::String^>^ PUManager::GetTemplateNames()
  {
    if( IsDisposed )
      throw gcnew System::ObjectDisposedException( "PUManager" );

    std::vector<Ogre::String> tNames;
    mPUMgr->particleSystemTemplateNames( tNames );

    array<System::String^>^ names = gcnew array<System::String^>( tNames.size() );

    std::vector<Ogre::String>::iterator it;
    int i = 0;
    for ( it = tNames.begin(); it != tNames.end(); ++it, ++i )
    {
      Ogre::String name = *it;
      names[ i ] = TO_CLR_STRING( name );
    }

    return names;
  }

  bool PUManager::CreateParticleSystem( System::String^ _name, System::String^ _templateName )
  {
    if( IsDisposed )
      throw gcnew System::ObjectDisposedException( "PUManager" );
    if( _name == nullptr )
      throw gcnew System::ArgumentNullException( "_name" );
    if( _templateName == nullptr )
      throw gcnew System::ArgumentNullException( "_templateName" );

    ParticleUniverse::ParticleSystem* psys;

    DECLARE_OGRE_STRING( name, _name )
    DECLARE_OGRE_STRING( templateName, _templateName )

    psys = mPUMgr->createParticleSystem( name, templateName, mScene );
    if( psys == NULL )
      return false;

    IntPtr psysPtr = IntPtr( psys );
    mSystems->Add( _name, psysPtr );

    return true;
  }

  void PUManager::DestroyParticleSystem( System::String^ _name )
  {
    if( IsDisposed )
      throw gcnew System::ObjectDisposedException( "PUManager" );
    if( _name == nullptr )
      throw gcnew System::ArgumentNullException( "_name" );

    ParticleUniverse::ParticleSystem* psys;
    psys = GetByName( _name );
    if( psys == NULL )
      return;
    mSystems->Remove( _name );

    Ogre::SceneNode* node = psys->getParentSceneNode();
    if( node != NULL )
      node->detachObject( psys );

    mPUMgr->destroyParticleSystem( psys, mScene );
  }

  void PUManager::AddToSceneNode( Mogre::SceneNode^ _node, System::String^ _name )
  {
    if( IsDisposed )
      throw gcnew System::ObjectDisposedException( "PUManager" );
    if( _node == nullptr )
      throw gcnew System::ArgumentNullException( "_node" );
    if( _name == nullptr )
      throw gcnew System::ArgumentNullException( "_name" );

    ParticleUniverse::ParticleSystem* psys;
    psys = GetByName( _name );
    if( psys == NULL )
      return;

    Ogre::SceneNode* node = (Ogre::SceneNode*) _node->NativePtr;
    if( node == NULL )
      return;

    node->attachObject( psys );
  }

  void PUManager::RemoveFromSceneNode( Mogre::SceneNode^ _node, System::String^ _name )
  {
    if( IsDisposed )
      throw gcnew System::ObjectDisposedException( "PUManager" );
    if( _node == nullptr )
      throw gcnew System::ArgumentNullException( "_node" );
    if( _name == nullptr )
      throw gcnew System::ArgumentNullException( "_name" );

    ParticleUniverse::ParticleSystem* psys;
    psys = GetByName( _name );
    if( psys == NULL )
      return;

    Ogre::SceneNode* node = (Ogre::SceneNode*) _node->NativePtr;
    if( node == NULL )
      return;

    node->detachObject( psys );
  }

  void PUManager::Start( System::String^ _name )
  {
    if( IsDisposed )
      throw gcnew System::ObjectDisposedException( "PUManager" );
    if( _name == nullptr )
      throw gcnew System::ArgumentNullException( "_name" );

    ParticleUniverse::ParticleSystem* psys;
    psys = GetByName( _name );
    if( psys == NULL )
      return;

    psys->start();
  }

  void PUManager::Stop( System::String^ _name )
  {
    if( IsDisposed )
      throw gcnew System::ObjectDisposedException( "PUManager" );
    if( _name == nullptr )
      throw gcnew System::ArgumentNullException( "_name" );

    ParticleUniverse::ParticleSystem* psys;
    psys = GetByName( _name );
    if( psys == NULL )
      return;

    psys->stop();
  }

  void PUManager::Pause( System::String^ _name )
  {
    if( IsDisposed )
      throw gcnew System::ObjectDisposedException( "PUManager" );
    if( _name == nullptr )
      throw gcnew System::ArgumentNullException( "_name" );

    ParticleUniverse::ParticleSystem* psys;
    psys = GetByName( _name );
    if( psys == NULL )
      return;

    psys->pause();
  }

  void PUManager::Resume( System::String^ _name )
  {
    if( IsDisposed )
      throw gcnew System::ObjectDisposedException( "PUManager" );
    if( _name == nullptr )
      throw gcnew System::ArgumentNullException( "_name" );

    ParticleUniverse::ParticleSystem* psys;
    psys = GetByName( _name );
    if( psys == NULL )
      return;

    psys->resume();
  }

  ParticleUniverse::ParticleSystem* PUManager::GetByName( System::String^ _name )
  {
    IntPtr sys;
    if( !mSystems->TryGetValue( _name, sys ) )
      return NULL;

    ParticleUniverse::ParticleSystem* psys = (ParticleUniverse::ParticleSystem*) sys.ToPointer();
    return psys;
  }

}
{CODE}

        

History

Information Version
Fri 24 of Feb, 2012 16:42 GMT-0000 tafkag Added scale methods 12
Thu 28 of Apr, 2011 11:07 GMT-0000 Beauty linked to PU website where to buy it 11
Thu 03 of Mar, 2011 00:37 GMT-0000 Beauty added version notes 10
Thu 03 of Mar, 2011 00:29 GMT-0000 Beauty updated cpp file for PU 1.4 9
Thu 03 of Mar, 2011 00:28 GMT-0000 Beauty updated header file for PU 1.4 8
Thu 03 of Mar, 2011 00:21 GMT-0000 Beauty improved note related to the file plugins.cfg 7
Wed 02 of Mar, 2011 22:42 GMT-0000 Beauty added note related to the file plugins.cfg 6
Sat 19 of Feb, 2011 23:53 GMT-0000 Beauty added PU version number + compilation notes 5
Thu 17 of Feb, 2011 22:35 GMT-0000 Beauty tiny changes 4
Thu 17 of Feb, 2011 22:32 GMT-0000 Beauty added more information + forum link 3
Thu 17 of Feb, 2011 22:20 GMT-0000 Beauty added information about this code snippet 2
Wed 16 of Feb, 2011 18:01 GMT-0000 mstoyke 1