Mercurial > hg > Members > koba > t_dandy
diff tree_controll.c @ 0:435ac1cdb64e
create task dandy directry.
author | koba <koba@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 11 Dec 2010 21:25:28 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tree_controll.c Sat Dec 11 21:25:28 2010 +0900 @@ -0,0 +1,229 @@ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <math.h> +#include <SDL.h> +#include <SDL_opengl.h> +#include <SDL_image.h> +#include "object.h" +#include "tree_controll.h" +#include "LoadSprite.h" +#include "xml.h" + + +static int power_of_two(int input) +{ + int value = 1; + + while ( value < input ) + { + value <<= 1; + } + return value; +} + + +GLuint SDL_GL_LoadTexture(SDL_Surface *surface, GLfloat *texcoord) +{ + GLuint texture; + int w, h; + SDL_Surface *image; + SDL_Rect area; + Uint32 saved_flags; + Uint8 saved_alpha; + + /* Use the surface width and height expanded to powers of 2 */ + w = power_of_two(surface->w); + h = power_of_two(surface->h); + texcoord[0] = 0.0f; /* Min X */ + texcoord[1] = 0.0f; /* Min Y */ + texcoord[2] = (GLfloat)surface->w / w; /* Max X */ + texcoord[3] = (GLfloat)surface->h / h; /* Max Y */ + + image = SDL_CreateRGBSurface( + SDL_SWSURFACE, + w, h, + 32, +#if SDL_BYTEORDER == SDL_LIL_ENDIAN /* OpenGL RGBA masks */ + 0x000000FF, + 0x0000FF00, + 0x00FF0000, + 0xFF000000 +#else + 0xFF000000, + 0x00FF0000, + 0x0000FF00, + 0x000000FF +#endif + ); + if ( image == NULL ) + { + return 0; + } + + /* Save the alpha blending attributes */ + saved_flags = surface->flags&(SDL_SRCALPHA|SDL_RLEACCELOK); + saved_alpha = surface->format->alpha; + if ( (saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA ) + { + SDL_SetAlpha(surface, 0, 0); + } + + /* Copy the surface into the GL texture image */ + area.x = 0; + area.y = 0; + area.w = surface->w; + area.h = surface->h; + SDL_BlitSurface(surface, &area, image, &area); + + /* Restore the alpha blending attributes */ + if ( (saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA ) + { + SDL_SetAlpha(surface, saved_flags, saved_alpha); + } + + /* Create an OpenGL texture for the image */ + glGenTextures(1, &texture); + glBindTexture(GL_TEXTURE_2D, texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexImage2D(GL_TEXTURE_2D, + 0, + GL_RGBA, + w, h, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + image->pixels); + SDL_FreeSurface(image); /* No longer needed */ + + return texture; +} + + +float tes_angle[3] = {0,0,0}; + + +SURFACE *next_draw_node(SURFACE *surfaces) +{ + SURFACE *node = surfaces; + if(node->child != NULL) + { + //glPushMatrix(); + return node->child; + } + else if(node->brother != NULL) + { + //glPopMatrix(); + //glPushMatrix(); + return node->brother; + } + else + { + node = node->parent; + if(node != NULL) + { + //glPopMatrix(); + } + while(node != NULL) + { + if(node->brother != NULL) + { + //glPopMatrix(); + //glPushMatrix(); + return node->brother; + } + else + { + node = node->parent; + /* + if(node != NULL) + { + //glPopMatrix(); + } + */ + } + } + return NULL; + } +} + +SURFACE *search_node(OBJECT *top, const char *name) +{ + SURFACE *node; + SURFACE *ret_node = NULL; + for(node = top->surfaces;node != NULL;node = next_node(node)) + { + if(strcmp(node->name, name) == 0) + { + ret_node = node; + return ret_node; + } + } + printf("can't not find node\n"); + return ret_node; +} + +SURFACE *next_node(SURFACE *surfaces) +{ + SURFACE *node = surfaces; + if(node->child != NULL) + { + return node->child; + } + else if(node->brother != NULL) + { + return node->brother; + } + else + { + node = node->parent; + while(node != NULL) + { + if(node->brother != NULL) + { + return node->brother; + } + else + { + node = node->parent; + } + } + return NULL; + } +} + + + +void node_prameter_change(OBJECT *top, char *name, float x, float y, float z, float ax, float ay, float az) +{ + SURFACE *node; + for(node=top->surfaces; node!=NULL; node=next_node(node)) + { + if(!strcmp(node->name, name)) + { + node->xyz[0] = x; + node->xyz[1] = y; + node->xyz[2] = z; + node->angle[0] = ax; + node->angle[1] = ay; + node->angle[2] = az; + } + } +} + +void all_object_load_texture(OBJECT *top) +{ + SURFACE *node; + SDL_Surface *image; + GLfloat texcoord[4]; + for(node=top->surfaces; node!=NULL; node=next_node(node)) + { + //image = SDL_LoadBMP(node->image_name); + //image = IMG_Load(node->image_name); + image = LoadSprite(node); + node->texture = (int *)SDL_GL_LoadTexture(image, texcoord); + SDL_FreeSurface(image); + } +} +