rev |
line source |
nuclear@6
|
1 #include <stdio.h>
|
nuclear@6
|
2 #include <stdlib.h>
|
nuclear@6
|
3 #include <string.h>
|
nuclear@6
|
4 #include <errno.h>
|
nuclear@6
|
5 #include "pattr.h"
|
nuclear@6
|
6 #include "psys_gl.h"
|
nuclear@6
|
7
|
nuclear@9
|
8 static int init_particle_attr(struct psys_particle_attributes *pattr);
|
nuclear@9
|
9 static void destroy_particle_attr(struct psys_particle_attributes *pattr);
|
nuclear@13
|
10 static char *stripspace(char *str);
|
nuclear@9
|
11
|
nuclear@6
|
12 static void *tex_cls;
|
nuclear@6
|
13 static unsigned int (*load_texture)(const char*, void*) = psys_gl_load_texture;
|
nuclear@6
|
14 static void (*unload_texture)(unsigned int, void*) = psys_gl_unload_texture;
|
nuclear@6
|
15
|
nuclear@6
|
16 void psys_texture_loader(unsigned int (*load)(const char*, void*), void (*unload)(unsigned int, void*), void *cls)
|
nuclear@6
|
17 {
|
nuclear@6
|
18 load_texture = load;
|
nuclear@6
|
19 unload_texture = unload;
|
nuclear@6
|
20 tex_cls = cls;
|
nuclear@6
|
21 }
|
nuclear@6
|
22
|
nuclear@6
|
23 int psys_init_attr(struct psys_attributes *attr)
|
nuclear@6
|
24 {
|
nuclear@6
|
25 memset(attr, 0, sizeof *attr);
|
nuclear@6
|
26
|
nuclear@6
|
27 if(psys_init_track3(&attr->spawn_range) == -1)
|
nuclear@6
|
28 goto err;
|
nuclear@6
|
29 if(psys_init_track(&attr->rate) == -1)
|
nuclear@6
|
30 goto err;
|
nuclear@6
|
31 if(psys_init_anm_rnd(&attr->life) == -1)
|
nuclear@6
|
32 goto err;
|
nuclear@6
|
33 if(psys_init_anm_rnd(&attr->size) == -1)
|
nuclear@6
|
34 goto err;
|
nuclear@6
|
35 if(psys_init_anm_rnd3(&attr->dir) == -1)
|
nuclear@6
|
36 goto err;
|
nuclear@6
|
37 if(psys_init_track3(&attr->grav) == -1)
|
nuclear@6
|
38 goto err;
|
nuclear@6
|
39
|
nuclear@9
|
40 if(init_particle_attr(&attr->part_attr) == -1)
|
nuclear@9
|
41 goto err;
|
nuclear@9
|
42
|
nuclear@6
|
43 attr->max_particles = -1;
|
nuclear@8
|
44
|
nuclear@8
|
45 anm_set_track_default(&attr->size.value.trk, 1.0);
|
nuclear@8
|
46 anm_set_track_default(&attr->life.value.trk, 1.0);
|
nuclear@8
|
47
|
nuclear@6
|
48 return 0;
|
nuclear@6
|
49
|
nuclear@6
|
50 err:
|
nuclear@6
|
51 psys_destroy_attr(attr);
|
nuclear@6
|
52 return -1;
|
nuclear@6
|
53 }
|
nuclear@6
|
54
|
nuclear@9
|
55
|
nuclear@9
|
56 static int init_particle_attr(struct psys_particle_attributes *pattr)
|
nuclear@9
|
57 {
|
nuclear@9
|
58 if(psys_init_track3(&pattr->color) == -1) {
|
nuclear@9
|
59 return -1;
|
nuclear@9
|
60 }
|
nuclear@9
|
61 if(psys_init_track(&pattr->alpha) == -1) {
|
nuclear@9
|
62 psys_destroy_track3(&pattr->color);
|
nuclear@9
|
63 return -1;
|
nuclear@9
|
64 }
|
nuclear@9
|
65 if(psys_init_track(&pattr->size) == -1) {
|
nuclear@9
|
66 psys_destroy_track3(&pattr->color);
|
nuclear@9
|
67 psys_destroy_track(&pattr->alpha);
|
nuclear@9
|
68 return -1;
|
nuclear@9
|
69 }
|
nuclear@9
|
70
|
nuclear@9
|
71 anm_set_track_default(&pattr->color.x, 1.0);
|
nuclear@9
|
72 anm_set_track_default(&pattr->color.y, 1.0);
|
nuclear@9
|
73 anm_set_track_default(&pattr->color.z, 1.0);
|
nuclear@9
|
74 anm_set_track_default(&pattr->alpha.trk, 1.0);
|
nuclear@9
|
75 anm_set_track_default(&pattr->size.trk, 1.0);
|
nuclear@9
|
76 return 0;
|
nuclear@9
|
77 }
|
nuclear@9
|
78
|
nuclear@9
|
79
|
nuclear@6
|
80 void psys_destroy_attr(struct psys_attributes *attr)
|
nuclear@6
|
81 {
|
nuclear@6
|
82 psys_destroy_track3(&attr->spawn_range);
|
nuclear@6
|
83 psys_destroy_track(&attr->rate);
|
nuclear@6
|
84 psys_destroy_anm_rnd(&attr->life);
|
nuclear@6
|
85 psys_destroy_anm_rnd(&attr->size);
|
nuclear@6
|
86 psys_destroy_anm_rnd3(&attr->dir);
|
nuclear@6
|
87 psys_destroy_track3(&attr->grav);
|
nuclear@6
|
88
|
nuclear@9
|
89 destroy_particle_attr(&attr->part_attr);
|
nuclear@9
|
90
|
nuclear@6
|
91 if(attr->tex && unload_texture) {
|
nuclear@6
|
92 unload_texture(attr->tex, tex_cls);
|
nuclear@6
|
93 }
|
nuclear@6
|
94 }
|
nuclear@6
|
95
|
nuclear@9
|
96 static void destroy_particle_attr(struct psys_particle_attributes *pattr)
|
nuclear@9
|
97 {
|
nuclear@9
|
98 psys_destroy_track3(&pattr->color);
|
nuclear@9
|
99 psys_destroy_track(&pattr->alpha);
|
nuclear@9
|
100 psys_destroy_track(&pattr->size);
|
nuclear@9
|
101 }
|
nuclear@9
|
102
|
nuclear@6
|
103 void psys_eval_attr(struct psys_attributes *attr, anm_time_t tm)
|
nuclear@6
|
104 {
|
nuclear@6
|
105 psys_eval_track3(&attr->spawn_range, tm);
|
nuclear@6
|
106 psys_eval_track(&attr->rate, tm);
|
nuclear@6
|
107 psys_eval_anm_rnd(&attr->life, tm);
|
nuclear@6
|
108 psys_eval_anm_rnd(&attr->size, tm);
|
nuclear@6
|
109 psys_eval_anm_rnd3(&attr->dir, tm);
|
nuclear@6
|
110 psys_eval_track3(&attr->grav, tm);
|
nuclear@6
|
111 }
|
nuclear@6
|
112
|
nuclear@6
|
113 int psys_load_attr(struct psys_attributes *attr, const char *fname)
|
nuclear@6
|
114 {
|
nuclear@6
|
115 FILE *fp;
|
nuclear@6
|
116 int res;
|
nuclear@6
|
117
|
nuclear@6
|
118 if(!(fp = fopen(fname, "r"))) {
|
nuclear@6
|
119 fprintf(stderr, "%s: failed to read file: %s: %s\n", __func__, fname, strerror(errno));
|
nuclear@6
|
120 return -1;
|
nuclear@6
|
121 }
|
nuclear@6
|
122 res = psys_load_attr_stream(attr, fp);
|
nuclear@6
|
123 fclose(fp);
|
nuclear@6
|
124 return res;
|
nuclear@6
|
125 }
|
nuclear@6
|
126
|
nuclear@6
|
127 int psys_load_attr_stream(struct psys_attributes *attr, FILE *fp)
|
nuclear@6
|
128 {
|
nuclear@13
|
129 int lineno = 0;
|
nuclear@13
|
130 char buf[512];
|
nuclear@13
|
131
|
nuclear@13
|
132 psys_init_attr(attr);
|
nuclear@13
|
133
|
nuclear@13
|
134 while(fgets(buf, sizeof buf, fp)) {
|
nuclear@13
|
135 char *key, *valstr;
|
nuclear@13
|
136
|
nuclear@13
|
137 lineno++;
|
nuclear@13
|
138
|
nuclear@13
|
139 key = stripspace(buf);
|
nuclear@13
|
140 if(key[0] == '#' || !key[0]) {
|
nuclear@13
|
141 continue; // skip empty lines and comments
|
nuclear@13
|
142 }
|
nuclear@13
|
143
|
nuclear@13
|
144 if(!(valstr = strchr(buf, '='))) {
|
nuclear@13
|
145 fprintf(stderr "%s: invalid input: %s\n", __func__, line);
|
nuclear@13
|
146 return -1;
|
nuclear@13
|
147 }
|
nuclear@13
|
148 *valstr++ = 0;
|
nuclear@13
|
149 valstr = stripspace(valstr);
|
nuclear@13
|
150
|
nuclear@13
|
151
|
nuclear@13
|
152 }
|
nuclear@6
|
153 }
|
nuclear@6
|
154
|
nuclear@6
|
155
|
nuclear@6
|
156 int psys_save_attr(struct psys_attributes *attr, const char *fname)
|
nuclear@6
|
157 {
|
nuclear@6
|
158 FILE *fp;
|
nuclear@6
|
159 int res;
|
nuclear@6
|
160
|
nuclear@6
|
161 if(!(fp = fopen(fname, "w"))) {
|
nuclear@6
|
162 fprintf(stderr, "%s: failed to write file: %s: %s\n", __func__, fname, strerror(errno));
|
nuclear@6
|
163 return -1;
|
nuclear@6
|
164 }
|
nuclear@6
|
165 res = psys_save_attr_stream(attr, fp);
|
nuclear@6
|
166 fclose(fp);
|
nuclear@6
|
167 return res;
|
nuclear@6
|
168 }
|
nuclear@6
|
169
|
nuclear@6
|
170 int psys_save_attr_stream(struct psys_attributes *attr, FILE *fp)
|
nuclear@6
|
171 {
|
nuclear@6
|
172 return -1; /* TODO */
|
nuclear@6
|
173 }
|
nuclear@13
|
174
|
nuclear@13
|
175
|
nuclear@13
|
176 static char *stripspace(char *str)
|
nuclear@13
|
177 {
|
nuclear@13
|
178 char *end;
|
nuclear@13
|
179
|
nuclear@13
|
180 while(*str && isspace(*str)) {
|
nuclear@13
|
181 str++;
|
nuclear@13
|
182 }
|
nuclear@13
|
183
|
nuclear@13
|
184 end = str + strlen(str);
|
nuclear@13
|
185 while(end >= str && isspace(*end)) {
|
nuclear@13
|
186 *end-- = 0;
|
nuclear@13
|
187 }
|
nuclear@13
|
188 return str;
|
nuclear@13
|
189 }
|