Index: trunk/nv/engine/particle_engine.hh
===================================================================
--- trunk/nv/engine/particle_engine.hh	(revision 352)
+++ trunk/nv/engine/particle_engine.hh	(revision 353)
@@ -161,4 +161,5 @@
 	public:
 		particle_engine( context* a_context );
+		void reset();
 		void load( lua::table_guard& table );
 		void draw( particle_system system, const render_state& rs, const scene_state& ss );
@@ -171,4 +172,5 @@
 		~particle_engine();
 	private:
+		void clear();
 		void register_standard_emmiters();
 		void register_standard_affectors();
@@ -189,4 +191,5 @@
 		vec3     m_inv_view_dir;
 		vec3     m_camera_pos;
+		uint32   m_last_update;
 
 		handle_store< particle_system_info, particle_system >      m_systems;
Index: trunk/src/engine/particle_engine.cc
===================================================================
--- trunk/src/engine/particle_engine.cc	(revision 352)
+++ trunk/src/engine/particle_engine.cc	(revision 353)
@@ -461,4 +461,5 @@
 	m_program_local = m_device->create_program( nv_particle_engine_vertex_shader_local, nv_particle_engine_fragment_shader );
 	m_program_world = m_device->create_program( nv_particle_engine_vertex_shader_world, nv_particle_engine_fragment_shader );
+	m_last_update = 0;
 
 	register_standard_emmiters();
@@ -482,6 +483,10 @@
 	{
 		info->emmiters[i].active      = true;
-		info->emmiters[i].last_create = 0;
-		info->emmiters[i].next_toggle = random::get().urange( data->emmiters[i].duration_min, data->emmiters[i].duration_max );
+		info->emmiters[i].last_create = float( m_last_update );
+		if ( data->emmiters[i].duration_max == 0 )
+			info->emmiters[i].next_toggle = 0;
+		else
+			info->emmiters[i].next_toggle = m_last_update + random::get().urange( data->emmiters[i].duration_min, data->emmiters[i].duration_max );
+
 	}
 
@@ -492,5 +497,5 @@
 		(particle_vtx*)info->quads, data->quota*6, STREAM_DRAW );
 	info->vtx_buffer = m_context->find_buffer( info->vtx_array, slot::POSITION );
-	info->last_update = 0;
+	info->last_update = m_last_update;
 	info->test = false;
 //	result->m_own_va      = true;
@@ -511,7 +516,27 @@
 nv::particle_engine::~particle_engine()
 {
+	clear();
 	m_device->release( m_program_world );
 	m_device->release( m_program_local );
 }
+
+void nv::particle_engine::reset()
+{
+	clear();
+	register_standard_emmiters();
+	register_standard_affectors();
+}
+
+void nv::particle_engine::clear()
+{
+	while ( m_systems.size() > 0 )
+		release( m_systems.get_handle( 0 ) );
+	m_emmiters.clear();
+	m_affectors.clear();
+	m_names.clear();
+	m_data.clear();
+	m_last_update = 0;
+}
+
 
 void nv::particle_engine::release( particle_system system )
@@ -531,4 +556,5 @@
 {
 	particle_system_info* info = m_systems.get( system );
+	m_last_update += ms;
 	if ( info )
 	{
@@ -538,8 +564,8 @@
 		m_inv_view_dir = glm::normalize(-s.get_camera().get_direction());
 
-		update_emmiters( info, ms );
-		destroy_particles( info, ms );
-		create_particles( info, ms );
-		update_particles( info, ms );
+		update_emmiters( info, m_last_update );
+		destroy_particles( info, m_last_update );
+		create_particles( info, m_last_update );
+		update_particles( info, m_last_update );
 
 		generate_data( info );
Index: trunk/src/wx/wx_canvas.cc
===================================================================
--- trunk/src/wx/wx_canvas.cc	(revision 352)
+++ trunk/src/wx/wx_canvas.cc	(revision 353)
@@ -17,4 +17,5 @@
 	nv::load_gl_no_context();
 	wxClientDC dc( this );
+	m_render = true;
 	m_wm = new nv::sdl::window_manager;
 	m_device = new nv::gl_device();
