0
|
1 #include <stdlib.h>
|
|
2 #include <stdio.h>
|
|
3 #include <string.h>
|
|
4 #include <math.h>
|
|
5 #include <SDL.h>
|
|
6 #include <SDL_opengl.h>
|
|
7 #include <SDL_image.h>
|
|
8 #include "object.h"
|
|
9 #include "tree_controll.h"
|
|
10 #include "LoadSprite.h"
|
|
11 #include "xml.h"
|
|
12
|
|
13
|
|
14 static int power_of_two(int input)
|
|
15 {
|
|
16 int value = 1;
|
|
17
|
|
18 while ( value < input )
|
|
19 {
|
|
20 value <<= 1;
|
|
21 }
|
|
22 return value;
|
|
23 }
|
|
24
|
|
25
|
|
26 GLuint SDL_GL_LoadTexture(SDL_Surface *surface, GLfloat *texcoord)
|
|
27 {
|
|
28 GLuint texture;
|
|
29 int w, h;
|
|
30 SDL_Surface *image;
|
|
31 SDL_Rect area;
|
|
32 Uint32 saved_flags;
|
|
33 Uint8 saved_alpha;
|
|
34
|
|
35 /* Use the surface width and height expanded to powers of 2 */
|
|
36 w = power_of_two(surface->w);
|
|
37 h = power_of_two(surface->h);
|
|
38 texcoord[0] = 0.0f; /* Min X */
|
|
39 texcoord[1] = 0.0f; /* Min Y */
|
|
40 texcoord[2] = (GLfloat)surface->w / w; /* Max X */
|
|
41 texcoord[3] = (GLfloat)surface->h / h; /* Max Y */
|
|
42
|
|
43 image = SDL_CreateRGBSurface(
|
|
44 SDL_SWSURFACE,
|
|
45 w, h,
|
|
46 32,
|
|
47 #if SDL_BYTEORDER == SDL_LIL_ENDIAN /* OpenGL RGBA masks */
|
|
48 0x000000FF,
|
|
49 0x0000FF00,
|
|
50 0x00FF0000,
|
|
51 0xFF000000
|
|
52 #else
|
|
53 0xFF000000,
|
|
54 0x00FF0000,
|
|
55 0x0000FF00,
|
|
56 0x000000FF
|
|
57 #endif
|
|
58 );
|
|
59 if ( image == NULL )
|
|
60 {
|
|
61 return 0;
|
|
62 }
|
|
63
|
|
64 /* Save the alpha blending attributes */
|
|
65 saved_flags = surface->flags&(SDL_SRCALPHA|SDL_RLEACCELOK);
|
|
66 saved_alpha = surface->format->alpha;
|
|
67 if ( (saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA )
|
|
68 {
|
|
69 SDL_SetAlpha(surface, 0, 0);
|
|
70 }
|
|
71
|
|
72 /* Copy the surface into the GL texture image */
|
|
73 area.x = 0;
|
|
74 area.y = 0;
|
|
75 area.w = surface->w;
|
|
76 area.h = surface->h;
|
|
77 SDL_BlitSurface(surface, &area, image, &area);
|
|
78
|
|
79 /* Restore the alpha blending attributes */
|
|
80 if ( (saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA )
|
|
81 {
|
|
82 SDL_SetAlpha(surface, saved_flags, saved_alpha);
|
|
83 }
|
|
84
|
|
85 /* Create an OpenGL texture for the image */
|
|
86 glGenTextures(1, &texture);
|
|
87 glBindTexture(GL_TEXTURE_2D, texture);
|
|
88 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
|
89 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
|
90 glTexImage2D(GL_TEXTURE_2D,
|
|
91 0,
|
|
92 GL_RGBA,
|
|
93 w, h,
|
|
94 0,
|
|
95 GL_RGBA,
|
|
96 GL_UNSIGNED_BYTE,
|
|
97 image->pixels);
|
|
98 SDL_FreeSurface(image); /* No longer needed */
|
|
99
|
|
100 return texture;
|
|
101 }
|
|
102
|
|
103
|
|
104 float tes_angle[3] = {0,0,0};
|
|
105
|
|
106
|
|
107 SURFACE *next_draw_node(SURFACE *surfaces)
|
|
108 {
|
|
109 SURFACE *node = surfaces;
|
|
110 if(node->child != NULL)
|
|
111 {
|
|
112 //glPushMatrix();
|
|
113 return node->child;
|
|
114 }
|
|
115 else if(node->brother != NULL)
|
|
116 {
|
|
117 //glPopMatrix();
|
|
118 //glPushMatrix();
|
|
119 return node->brother;
|
|
120 }
|
|
121 else
|
|
122 {
|
|
123 node = node->parent;
|
|
124 if(node != NULL)
|
|
125 {
|
|
126 //glPopMatrix();
|
|
127 }
|
|
128 while(node != NULL)
|
|
129 {
|
|
130 if(node->brother != NULL)
|
|
131 {
|
|
132 //glPopMatrix();
|
|
133 //glPushMatrix();
|
|
134 return node->brother;
|
|
135 }
|
|
136 else
|
|
137 {
|
|
138 node = node->parent;
|
|
139 /*
|
|
140 if(node != NULL)
|
|
141 {
|
|
142 //glPopMatrix();
|
|
143 }
|
|
144 */
|
|
145 }
|
|
146 }
|
|
147 return NULL;
|
|
148 }
|
|
149 }
|
|
150
|
|
151 SURFACE *search_node(OBJECT *top, const char *name)
|
|
152 {
|
|
153 SURFACE *node;
|
|
154 SURFACE *ret_node = NULL;
|
|
155 for(node = top->surfaces;node != NULL;node = next_node(node))
|
|
156 {
|
|
157 if(strcmp(node->name, name) == 0)
|
|
158 {
|
|
159 ret_node = node;
|
|
160 return ret_node;
|
|
161 }
|
|
162 }
|
|
163 printf("can't not find node\n");
|
|
164 return ret_node;
|
|
165 }
|
|
166
|
|
167 SURFACE *next_node(SURFACE *surfaces)
|
|
168 {
|
|
169 SURFACE *node = surfaces;
|
|
170 if(node->child != NULL)
|
|
171 {
|
|
172 return node->child;
|
|
173 }
|
|
174 else if(node->brother != NULL)
|
|
175 {
|
|
176 return node->brother;
|
|
177 }
|
|
178 else
|
|
179 {
|
|
180 node = node->parent;
|
|
181 while(node != NULL)
|
|
182 {
|
|
183 if(node->brother != NULL)
|
|
184 {
|
|
185 return node->brother;
|
|
186 }
|
|
187 else
|
|
188 {
|
|
189 node = node->parent;
|
|
190 }
|
|
191 }
|
|
192 return NULL;
|
|
193 }
|
|
194 }
|
|
195
|
|
196
|
|
197
|
|
198 void node_prameter_change(OBJECT *top, char *name, float x, float y, float z, float ax, float ay, float az)
|
|
199 {
|
|
200 SURFACE *node;
|
|
201 for(node=top->surfaces; node!=NULL; node=next_node(node))
|
|
202 {
|
|
203 if(!strcmp(node->name, name))
|
|
204 {
|
|
205 node->xyz[0] = x;
|
|
206 node->xyz[1] = y;
|
|
207 node->xyz[2] = z;
|
|
208 node->angle[0] = ax;
|
|
209 node->angle[1] = ay;
|
|
210 node->angle[2] = az;
|
|
211 }
|
|
212 }
|
|
213 }
|
|
214
|
|
215 void all_object_load_texture(OBJECT *top)
|
|
216 {
|
|
217 SURFACE *node;
|
|
218 SDL_Surface *image;
|
|
219 GLfloat texcoord[4];
|
|
220 for(node=top->surfaces; node!=NULL; node=next_node(node))
|
|
221 {
|
|
222 //image = SDL_LoadBMP(node->image_name);
|
|
223 //image = IMG_Load(node->image_name);
|
|
224 image = LoadSprite(node);
|
|
225 node->texture = (int *)SDL_GL_LoadTexture(image, texcoord);
|
|
226 SDL_FreeSurface(image);
|
|
227 }
|
|
228 }
|
|
229
|