ClangFormat: apply to source, most of intern
[blender.git] / intern / cycles / render / particles.cpp
1 /*
2  * Copyright 2011-2013 Blender Foundation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include "device/device.h"
18 #include "render/particles.h"
19 #include "render/scene.h"
20
21 #include "util/util_foreach.h"
22 #include "util/util_hash.h"
23 #include "util/util_logging.h"
24 #include "util/util_map.h"
25 #include "util/util_progress.h"
26 #include "util/util_vector.h"
27
28 CCL_NAMESPACE_BEGIN
29
30 /* Particle System */
31
32 ParticleSystem::ParticleSystem()
33 {
34 }
35
36 ParticleSystem::~ParticleSystem()
37 {
38 }
39
40 void ParticleSystem::tag_update(Scene *scene)
41 {
42   scene->particle_system_manager->need_update = true;
43 }
44
45 /* Particle System Manager */
46
47 ParticleSystemManager::ParticleSystemManager()
48 {
49   need_update = true;
50 }
51
52 ParticleSystemManager::~ParticleSystemManager()
53 {
54 }
55
56 void ParticleSystemManager::device_update_particles(Device *,
57                                                     DeviceScene *dscene,
58                                                     Scene *scene,
59                                                     Progress &progress)
60 {
61   /* count particles.
62    * adds one dummy particle at the beginning to avoid invalid lookups,
63    * in case a shader uses particle info without actual particle data. */
64   int num_particles = 1;
65   for (size_t j = 0; j < scene->particle_systems.size(); j++)
66     num_particles += scene->particle_systems[j]->particles.size();
67
68   KernelParticle *kparticles = dscene->particles.alloc(num_particles);
69
70   /* dummy particle */
71   memset(kparticles, 0, sizeof(KernelParticle));
72
73   int i = 1;
74   for (size_t j = 0; j < scene->particle_systems.size(); j++) {
75     ParticleSystem *psys = scene->particle_systems[j];
76
77     for (size_t k = 0; k < psys->particles.size(); k++) {
78       /* pack in texture */
79       Particle &pa = psys->particles[k];
80
81       kparticles[i].index = pa.index;
82       kparticles[i].age = pa.age;
83       kparticles[i].lifetime = pa.lifetime;
84       kparticles[i].size = pa.size;
85       kparticles[i].rotation = pa.rotation;
86       kparticles[i].location = float3_to_float4(pa.location);
87       kparticles[i].velocity = float3_to_float4(pa.velocity);
88       kparticles[i].angular_velocity = float3_to_float4(pa.angular_velocity);
89
90       i++;
91
92       if (progress.get_cancel())
93         return;
94     }
95   }
96
97   dscene->particles.copy_to_device();
98 }
99
100 void ParticleSystemManager::device_update(Device *device,
101                                           DeviceScene *dscene,
102                                           Scene *scene,
103                                           Progress &progress)
104 {
105   if (!need_update)
106     return;
107
108   VLOG(1) << "Total " << scene->particle_systems.size() << " particle systems.";
109
110   device_free(device, dscene);
111
112   progress.set_status("Updating Particle Systems", "Copying Particles to device");
113   device_update_particles(device, dscene, scene, progress);
114
115   if (progress.get_cancel())
116     return;
117
118   need_update = false;
119 }
120
121 void ParticleSystemManager::device_free(Device *, DeviceScene *dscene)
122 {
123   dscene->particles.free();
124 }
125
126 void ParticleSystemManager::tag_update(Scene * /*scene*/)
127 {
128   need_update = true;
129 }
130
131 CCL_NAMESPACE_END