add BLI_strcpy_rlen, replace strcat, which was used in misleading way.
[blender.git] / intern / cycles / blender / blender_particles.cpp
1 /*
2  * Copyright 2011, Blender Foundation.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  */
18
19 #include "mesh.h"
20 #include "object.h"
21 #include "particles.h"
22
23 #include "blender_sync.h"
24 #include "blender_util.h"
25
26 #include "util_foreach.h"
27
28 CCL_NAMESPACE_BEGIN
29
30 /* Utilities */
31
32 bool BlenderSync::sync_dupli_particle(BL::Object b_ob, BL::DupliObject b_dup, Object *object)
33 {
34         /* test if this dupli was generated from a particle sytem */
35         BL::ParticleSystem b_psys = b_dup.particle_system();
36         if(!b_psys)
37                 return false;
38
39         /* test if we need particle data */
40         if(!object->mesh->need_attribute(scene, ATTR_STD_PARTICLE))
41                 return false;
42
43         /* don't handle child particles yet */
44         BL::Array<int, OBJECT_PERSISTENT_ID_SIZE> persistent_id = b_dup.persistent_id();
45
46         if(persistent_id[0] >= b_psys.particles.length())
47                 return false;
48
49         /* find particle system */
50         ParticleSystemKey key(b_ob, persistent_id);
51         ParticleSystem *psys;
52
53         bool first_use = !particle_system_map.is_used(key);
54         bool need_update = particle_system_map.sync(&psys, b_ob, b_dup.object(), key);
55
56         /* no update needed? */
57         if(!need_update && !object->mesh->need_update && !scene->object_manager->need_update)
58                 return true;
59
60         /* first time used in this sync loop? clear and tag update */
61         if(first_use) {
62                 psys->particles.clear();
63                 psys->tag_update(scene);
64         }
65
66         /* add particle */
67         BL::Particle b_pa = b_psys.particles[persistent_id[0]];
68         Particle pa;
69         
70         pa.index = persistent_id[0];
71         pa.age = b_scene.frame_current() - b_pa.birth_time();
72         pa.lifetime = b_pa.lifetime();
73         pa.location = get_float3(b_pa.location());
74         pa.rotation = get_float4(b_pa.rotation());
75         pa.size = b_pa.size();
76         pa.velocity = get_float3(b_pa.velocity());
77         pa.angular_velocity = get_float3(b_pa.angular_velocity());
78
79         psys->particles.push_back(pa);
80
81         /* return that this object has particle data */
82         return true;
83 }
84
85 CCL_NAMESPACE_END