fix potential crasher: malloc->calloc
[blender.git] / source / blender / blenkernel / BKE_effect.h
1 /**
2  * blenlib/BKE_effect.h (mar-2001 nzc)
3  *      
4  * $Id$ 
5  *
6  * ***** BEGIN GPL LICENSE BLOCK *****
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software Foundation,
20  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21  *
22  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
23  * All rights reserved.
24  *
25  * The Original Code is: all of this file.
26  *
27  * Contributor(s): none yet.
28  *
29  * ***** END GPL LICENSE BLOCK *****
30  */
31 #ifndef BKE_EFFECT_H
32 #define BKE_EFFECT_H
33
34 #include "DNA_modifier_types.h"
35
36 struct Object;
37 struct Scene;
38 struct Effect;
39 struct ListBase;
40 struct Particle;
41 struct Group;
42 struct RNG;
43 struct ParticleSimulationData;
44 struct ParticleData;
45 struct ParticleKey;
46
47 struct EffectorWeights *BKE_add_effector_weights(struct Group *group);
48 struct PartDeflect *object_add_collision_fields(int type);
49
50 /* Input to effector code */
51 typedef struct EffectedPoint {
52         float *loc;
53         float *vel;
54         float *ave;     /* angular velocity for particles with dynamic rotation */
55         float *rot; /* rotation quaternion for particles with dynamic rotation */
56         float vel_to_frame;
57         float vel_to_sec;
58
59         /* only for particles */
60         float size, charge;
61
62         unsigned int flag;
63         int index;
64
65         struct ParticleSystem *psys;    /* particle system the point belongs to */
66 } EffectedPoint;
67
68 typedef struct GuideEffectorData {
69         float vec_to_point[3];
70         float strength;
71 } GuideEffectorData;
72
73 typedef struct EffectorData {
74         /* Effector point */
75         float loc[3];
76         float nor[3];
77         float vel[3];
78
79         float vec_to_point[3];
80         float distance, falloff;
81
82         /* only for effector particles */
83         float size, charge;
84
85         /* only for vortex effector with surface falloff */
86         float nor2[3], vec_to_point2[3];
87
88         int *index;     /* point index */
89 } EffectorData;
90
91 /* used for calculating the effector force */
92 typedef struct EffectorCache {
93         struct EffectorCache *next, *prev;
94
95         struct Scene *scene;
96         struct Object *ob;
97         struct ParticleSystem *psys;
98         struct SurfaceModifierData *surmd;
99         
100         struct PartDeflect *pd;
101
102         /* precalculated for guides */
103         struct GuideEffectorData *guide_data;
104         float guide_loc[4], guide_dir[3], guide_radius;
105
106         float frame;
107         int flag;
108 } EffectorCache;
109
110 void free_effect(struct Effect *eff);
111 void free_effects(struct ListBase *lb);
112 struct Effect *copy_effect(struct Effect *eff);
113 void copy_effects(struct ListBase *lbn, struct ListBase *lb);
114 void deselectall_eff(struct Object *ob);
115
116 struct PartEff *give_parteff(struct Object *ob);
117
118
119 void                    free_partdeflect(struct PartDeflect *pd);
120 struct ListBase *pdInitEffectors(struct Scene *scene, struct Object *ob_src, struct ParticleSystem *psys_src, struct EffectorWeights *weights);
121 void                    pdEndEffectors(struct ListBase **effectors);
122 void                    pdDoEffectors(struct ListBase *effectors, struct ListBase *colliders, struct EffectorWeights *weights, struct EffectedPoint *point, float *force, float *impulse);
123
124 void pd_point_from_particle(struct ParticleSimulationData *sim, struct ParticleData *pa, struct ParticleKey *state, struct EffectedPoint *point);
125 void pd_point_from_loc(struct Scene *scene, float *loc, float *vel, int index, struct EffectedPoint *point);
126 void pd_point_from_soft(struct Scene *scene, float *loc, float *vel, int index, struct EffectedPoint *point);
127
128 /* needed for boids */
129 float effector_falloff(struct EffectorCache *eff, struct EffectorData *efd, struct EffectedPoint *point, struct EffectorWeights *weights);
130 int closest_point_on_surface(struct SurfaceModifierData *surmd, float *co, float *surface_co, float *surface_nor, float *surface_vel);
131 int get_effector_data(struct EffectorCache *eff, struct EffectorData *efd, struct EffectedPoint *point, int real_velocity);
132
133 /* required for particle_system.c */
134 //void do_physical_effector(struct EffectorData *eff, struct EffectorPoint *point, float *total_force);
135 //float effector_falloff(struct EffectorData *eff, struct EffectorPoint *point, struct EffectorWeights *weights);
136
137 /* EffectedPoint->flag */
138 #define PE_WIND_AS_SPEED                1
139 #define PE_DYNAMIC_ROTATION             2
140 #define PE_USE_NORMAL_DATA              4
141
142 /* EffectorData->flag */
143 #define PE_VELOCITY_TO_IMPULSE  1
144
145
146 #endif
147