libpsys

annotate src/pattr.c @ 13:1b0db53d5b5b

started writting config file for the particle system attributes
author John Tsiombikas <nuclear@member.fsf.org>
date Thu, 06 Sep 2012 02:32:58 +0300
parents 9c24273f211b
children 4f36bbbcc82f
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 }