Mercurial > hg > Game > Cerium
annotate Renderer/Engine/SceneGraph.cc @ 1798:3babb36ac459 draft
array(bmskip table) allocate size change 256 to 256*sizeof(int)
author | Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 05 Dec 2013 16:41:38 +0900 |
parents | 6748a09c63cb |
children | 363b7c401c79 |
rev | line source |
---|---|
539 | 1 #include <iostream> |
2 #include <SDL.h> | |
3 #include <SDL_opengl.h> | |
4 #include <SDL_image.h> | |
5 #include <libxml/parser.h> | |
1049
91500a6c4def
non 2^n texture tapestry generation.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1047
diff
changeset
|
6 #include <string.h> |
539 | 7 #include "SceneGraph.h" |
8 #include "xml.h" | |
1050 | 9 #include "matrix_calc.h" |
539 | 10 #include "TextureHash.h" |
11 #include "texture.h" | |
12 #include "TaskManager.h" | |
1125 | 13 #include "polygon_pack.h" |
1205
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
14 #include <ft2build.h> |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
15 #include <freetype/freetype.h> |
539 | 16 |
17 using namespace std; | |
18 | |
19 SceneGraphPtr scene_graph = NULL; | |
20 SceneGraphPtr scene_graph_viewer = NULL; | |
21 | |
22 static TextureHash texture_hash; | |
860 | 23 texture_list list[TABLE_SIZE]; |
24 | |
539 | 25 extern int decode(char *cont, FILE *outfile); |
26 | |
27 static void | |
653
7a311860a76e
remove global variable "sgroot" , add SgChange.{cc, h} SgMain.cc SgRootChange.{cc, h}
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
580
diff
changeset
|
28 no_move(SceneGraphPtr self, void *sgroot_, int screen_w, int screen_h) {} |
539 | 29 |
30 static void | |
653
7a311860a76e
remove global variable "sgroot" , add SgChange.{cc, h} SgMain.cc SgRootChange.{cc, h}
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
580
diff
changeset
|
31 no_collision(SceneGraphPtr self, void *sgroot_, int screen_w, int screen_h, |
539 | 32 SceneGraphPtr tree) {} |
33 | |
34 /** | |
35 * 事前に計算したテクスチャの最大縮小率 scale まで、 | |
36 * テクスチャを 1/2 縮小していく。 | |
37 * このとき、テクスチャは TEXTURE_SPLIT_PIXELx2 のブロック (Tile) で分割し、 | |
38 * これらを連続したメモリ領域に格納していく。 | |
39 * 以下の (1), (2), (3) を Tapestry と呼ぶ | |
40 * | |
41 * 例 scale = 4 の場合 | |
42 * | |
43 * Tapestry(1) 1/1 | |
44 * +---+---+---+---+ | |
45 * | 0 | 1 | 2 | 3 | | |
46 * +---+---+---+---+ | |
47 * | 4 | 5 | 6 | 7 | (2) 1/2 | |
48 * +---+---+---+---+ +---+---+ | |
49 * | 8 | 9 | 10| 11| | 16| 17| (3) 1/4 | |
50 * +---+---+---+---+ +---+---+ +---+ | |
51 * | 12| 13| 14| 15| | 18| 19| | 20| | |
52 * +---+---+---+---+ +---+---+ +---| | |
53 * | |
54 * (1) (2) (3) | |
55 * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | |
56 * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | * | * | * | 14| 15| 16| 17| 18| 19| 20| | |
57 * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | |
58 * | |
59 * @param[in] tex_w Width of orignal texture | |
60 * @param[in] tex_h Height of orignal texture | |
61 * @param[in] tex_src Original texture | |
62 * @param[in] all_pixel_num Tapestry の合計 pixel 数 | |
63 * @param[in] scale テクスチャの最大縮小率 (= 2^n) | |
64 * @return (1) のアドレス | |
65 */ | |
1049
91500a6c4def
non 2^n texture tapestry generation.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1047
diff
changeset
|
66 |
91500a6c4def
non 2^n texture tapestry generation.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1047
diff
changeset
|
67 |
91500a6c4def
non 2^n texture tapestry generation.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1047
diff
changeset
|
68 uint32 white[256] __attribute__((aligned(16))); |
91500a6c4def
non 2^n texture tapestry generation.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1047
diff
changeset
|
69 |
539 | 70 static uint32* |
1049
91500a6c4def
non 2^n texture tapestry generation.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1047
diff
changeset
|
71 makeTapestry(TaskManager *manager, uint32 tex_w, uint32 tex_h, uint32 *tex_src, |
539 | 72 int all_pixel_num, int scale_cnt) |
73 { | |
1049
91500a6c4def
non 2^n texture tapestry generation.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1047
diff
changeset
|
74 if (tex_w==0 && tex_h==0) { |
91500a6c4def
non 2^n texture tapestry generation.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1047
diff
changeset
|
75 // non texture case |
91500a6c4def
non 2^n texture tapestry generation.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1047
diff
changeset
|
76 uint32 pattern = SDL_BYTEORDER == SDL_LIL_ENDIAN? 0x00ffffff : 0xffffff00; /* OpenGL RGBA masks */ |
1053 | 77 if (white[0]!=pattern) { // dumb! |
78 #if 1 | |
79 for(int i=0;i<256;i++) | |
80 white[i] = pattern; | |
81 #else | |
1049
91500a6c4def
non 2^n texture tapestry generation.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1047
diff
changeset
|
82 memset_pattern4(white,&pattern,256); |
1053 | 83 #endif |
84 } | |
1049
91500a6c4def
non 2^n texture tapestry generation.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1047
diff
changeset
|
85 return white; |
91500a6c4def
non 2^n texture tapestry generation.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1047
diff
changeset
|
86 } |
539 | 87 |
1049
91500a6c4def
non 2^n texture tapestry generation.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1047
diff
changeset
|
88 uint32 t = 0; |
91500a6c4def
non 2^n texture tapestry generation.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1047
diff
changeset
|
89 uint32 diff = TEXTURE_SPLIT_PIXEL; |
91500a6c4def
non 2^n texture tapestry generation.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1047
diff
changeset
|
90 uint32 p_diff = 1; |
539 | 91 |
92 uint32 *tex_dest = (uint32*)manager->allocate(sizeof(int)*all_pixel_num); | |
1092
b99abedb5523
fix h w in makeTapestry
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1053
diff
changeset
|
93 // uint32 *tex_src_max = (uint32*)( tex_src + tex_h*tex_w); |
539 | 94 |
1092
b99abedb5523
fix h w in makeTapestry
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1053
diff
changeset
|
95 // uint32 alpha = SDL_BYTEORDER == SDL_LIL_ENDIAN? 0xff000000 : 0xff; /* OpenGL RGBA masks */ |
b99abedb5523
fix h w in makeTapestry
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1053
diff
changeset
|
96 uint32 alpha = tex_src[0]; |
1049
91500a6c4def
non 2^n texture tapestry generation.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1047
diff
changeset
|
97 |
539 | 98 while (scale_cnt) { |
1049
91500a6c4def
non 2^n texture tapestry generation.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1047
diff
changeset
|
99 // we should use average, except clear one |
91500a6c4def
non 2^n texture tapestry generation.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1047
diff
changeset
|
100 for (uint32 y = 0; y < align(tex_h,diff); y += diff) { |
91500a6c4def
non 2^n texture tapestry generation.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1047
diff
changeset
|
101 for (uint32 x = 0; x < align(tex_w,diff); x += diff) { |
91500a6c4def
non 2^n texture tapestry generation.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1047
diff
changeset
|
102 for (uint32 j = 0; j < diff; j += p_diff) { |
91500a6c4def
non 2^n texture tapestry generation.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1047
diff
changeset
|
103 for (uint32 i = 0; i < diff; i += p_diff) { |
91500a6c4def
non 2^n texture tapestry generation.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1047
diff
changeset
|
104 tex_dest[t++] = |
1092
b99abedb5523
fix h w in makeTapestry
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1053
diff
changeset
|
105 (x+i<tex_w && y+j<tex_h) ? tex_src[(x+i) + tex_w*(y+j)]: alpha; |
539 | 106 } |
107 } | |
108 } | |
109 } | |
110 | |
1092
b99abedb5523
fix h w in makeTapestry
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1053
diff
changeset
|
111 diff <<= 1; p_diff <<= 1; |
539 | 112 scale_cnt >>= 1; |
113 } | |
114 | |
115 return tex_dest; | |
116 } | |
117 | |
118 | |
119 /** | |
120 * 何の情報も持ってない SceneGraph の生成 | |
121 * 今のところ、とりあえず木構造の繋がりに使うぐらい | |
122 */ | |
1143 | 123 SceneGraph::SceneGraph(TaskManager *manager) |
539 | 124 { |
1129 | 125 |
539 | 126 init(); |
1351
e51127dbd63c
operate directly on matrix. not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1336
diff
changeset
|
127 allocate_init(manager); |
1143 | 128 texture_info->texture_id = -1; |
129 | |
539 | 130 finalize = &SceneGraph::finalize_copy; |
131 | |
132 this->name = "NULLPO"; | |
1141 | 133 |
539 | 134 } |
135 | |
136 /** | |
137 * orig のコピーとして SceneGraph を生成する | |
138 */ | |
1169 | 139 SceneGraph::SceneGraph( TaskManager *manager, SceneGraphPtr orig) |
539 | 140 { |
908 | 141 |
539 | 142 init(); |
1129 | 143 |
539 | 144 memcpy(this, orig, sizeof(SceneGraph)); |
145 | |
1351
e51127dbd63c
operate directly on matrix. not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1336
diff
changeset
|
146 allocate_init(manager); |
1169 | 147 |
148 for (int i = 0; i < 16; i++) { | |
149 matrix[i] = orig->matrix[i]; | |
150 } | |
151 | |
152 memcpy(texture_info, orig->texture_info, sizeof(texture_list)); | |
153 | |
539 | 154 // コピーしない |
155 //flag_remove = 0; | |
156 //flag_drawable = 1; | |
157 next = NULL; | |
158 prev = NULL; | |
159 last = NULL; | |
160 | |
161 parent = NULL; | |
162 brother = NULL; | |
163 children = NULL; | |
164 lastChild = NULL; | |
165 | |
166 finalize = &SceneGraph::finalize_copy; | |
167 | |
168 frame = 0; | |
169 } | |
170 | |
171 | |
172 /* construct polygon from xmlNode. */ | |
173 SceneGraph::SceneGraph(TaskManager *manager, xmlNodePtr surface) | |
174 { | |
1143 | 175 |
539 | 176 init(); |
1351
e51127dbd63c
operate directly on matrix. not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1336
diff
changeset
|
177 allocate_init(manager); |
1143 | 178 texture_info->texture_id = -1; |
1125 | 179 |
1126
6043da6e48f1
complete compile but not work yet.
yutaka@localhost.localdomain
parents:
1125
diff
changeset
|
180 //size : 頂点の数かな |
539 | 181 size = atoi((char *)xmlGetProp(surface,(xmlChar *)"size")); |
182 name = (char *)xmlGetProp(surface,(xmlChar *)"name"); | |
183 parent_name = (char *)xmlGetProp(surface,(xmlChar *)"parent"); | |
184 | |
1126
6043da6e48f1
complete compile but not work yet.
yutaka@localhost.localdomain
parents:
1125
diff
changeset
|
185 if (size % 3 != 0) { |
6043da6e48f1
complete compile but not work yet.
yutaka@localhost.localdomain
parents:
1125
diff
changeset
|
186 printf("vertex size is error. size %% 3 = %lld\n", size % 3); |
6043da6e48f1
complete compile but not work yet.
yutaka@localhost.localdomain
parents:
1125
diff
changeset
|
187 } |
1299
f0e805c09ed6
minor fix xml_walk and pickup_float, not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1292
diff
changeset
|
188 |
1253
bb9c885c1cb5
COLLADA add read node
Yuhi TOMARI <e095740@ie.u-ryukyu.ac.jp>
parents:
1226
diff
changeset
|
189 /* |
bb9c885c1cb5
COLLADA add read node
Yuhi TOMARI <e095740@ie.u-ryukyu.ac.jp>
parents:
1226
diff
changeset
|
190 * MAX_SIZE_TRIANGLE:128 |
bb9c885c1cb5
COLLADA add read node
Yuhi TOMARI <e095740@ie.u-ryukyu.ac.jp>
parents:
1226
diff
changeset
|
191 */ |
1299
f0e805c09ed6
minor fix xml_walk and pickup_float, not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1292
diff
changeset
|
192 |
1136 | 193 if (size > 0) { |
1299
f0e805c09ed6
minor fix xml_walk and pickup_float, not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1292
diff
changeset
|
194 |
f0e805c09ed6
minor fix xml_walk and pickup_float, not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1292
diff
changeset
|
195 /* |
f0e805c09ed6
minor fix xml_walk and pickup_float, not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1292
diff
changeset
|
196 * size/3 : 三角形の数 |
1253
bb9c885c1cb5
COLLADA add read node
Yuhi TOMARI <e095740@ie.u-ryukyu.ac.jp>
parents:
1226
diff
changeset
|
197 * MAX_SIZE_TRIANGLE : 128 |
1299
f0e805c09ed6
minor fix xml_walk and pickup_float, not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1292
diff
changeset
|
198 * polygon の数から、PolygonPackの数を決定する |
1253
bb9c885c1cb5
COLLADA add read node
Yuhi TOMARI <e095740@ie.u-ryukyu.ac.jp>
parents:
1226
diff
changeset
|
199 */ |
1299
f0e805c09ed6
minor fix xml_walk and pickup_float, not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1292
diff
changeset
|
200 |
1136 | 201 pp_num = (size/3 + MAX_SIZE_TRIANGLE - 1) / MAX_SIZE_TRIANGLE; |
202 pp = (PolygonPack*)manager->allocate(sizeof(PolygonPack)*pp_num); | |
203 } else { | |
204 pp_num = 0; | |
205 pp = NULL; | |
206 } | |
906
becd6fad3ae0
coord_pack is stuffed with infomation of create polygon at spe.
Yutaka_Kinjyo
parents:
891
diff
changeset
|
207 |
539 | 208 get_data(manager, surface->children); |
209 | |
210 finalize = &SceneGraph::finalize_original; | |
1108 | 211 |
539 | 212 } |
213 | |
1253
bb9c885c1cb5
COLLADA add read node
Yuhi TOMARI <e095740@ie.u-ryukyu.ac.jp>
parents:
1226
diff
changeset
|
214 |
1211 | 215 SceneGraph::SceneGraph(TaskManager *manager,const char *font,int pixels,Uint32 color,const char *string_name) { |
1205
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
216 |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
217 init(); |
1351
e51127dbd63c
operate directly on matrix. not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1336
diff
changeset
|
218 allocate_init(manager); |
1205
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
219 texture_info->texture_id = -1; |
1351
e51127dbd63c
operate directly on matrix. not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1336
diff
changeset
|
220 |
1205
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
221 for (int i = 0; i < 16; i++) { |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
222 matrix[i] = 0; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
223 } |
1226
636dfdc30176
new API for SceneGraph
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1211
diff
changeset
|
224 for (int i = 0; i < 4; i++) { |
636dfdc30176
new API for SceneGraph
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1211
diff
changeset
|
225 matrix[i*4+i] = 1; |
636dfdc30176
new API for SceneGraph
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1211
diff
changeset
|
226 } |
1351
e51127dbd63c
operate directly on matrix. not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1336
diff
changeset
|
227 |
e51127dbd63c
operate directly on matrix. not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1336
diff
changeset
|
228 //size : 頂点の数かな |
e51127dbd63c
operate directly on matrix. not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1336
diff
changeset
|
229 size = 6; |
e51127dbd63c
operate directly on matrix. not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1336
diff
changeset
|
230 parent_name = NULL; |
e51127dbd63c
operate directly on matrix. not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1336
diff
changeset
|
231 name = string_name; |
1205
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
232 |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
233 if (size % 3 != 0) { |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
234 printf("vertex size is error. size %% 3 = %lld\n", size % 3); |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
235 } |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
236 |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
237 if (size > 0) { |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
238 pp_num = (size/3 + MAX_SIZE_TRIANGLE - 1) / MAX_SIZE_TRIANGLE; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
239 pp = (PolygonPack*)manager->allocate(sizeof(PolygonPack)*pp_num); |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
240 } else { |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
241 pp_num = 0; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
242 pp = NULL; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
243 } |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
244 |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
245 create_font_data(manager, font, pixels, color, string_name); |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
246 |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
247 finalize = &SceneGraph::finalize_original; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
248 } |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
249 |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
250 void |
1211 | 251 SceneGraph::create_font_data(TaskManager *manager,const char *font ,int pixels, Uint32 color, const char *string_name) |
1205
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
252 { |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
253 //font_coordinate(pixels/2,pixels); |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
254 font_normal(); |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
255 font_model(); |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
256 //font_texture(); |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
257 |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
258 get_font_image(manager, font, pixels, color, string_name); |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
259 } |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
260 |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
261 void |
1211 | 262 SceneGraph::get_font_image(TaskManager *manager,const char *font ,int pixels ,Uint32 color, const char *string_name) |
1205
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
263 { |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
264 int tex_id; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
265 if (texture_hash.hash_regist(string_name, tex_id)) { |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
266 SDL_Surface *texture_image = load_font_image(font,pixels,color,string_name); |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
267 if(!texture_image){ |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
268 printf("Can't load image %s\n",string_name); |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
269 exit(0); |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
270 } |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
271 texture_info->texture_id = makeTapestries(manager, texture_image,tex_id); |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
272 printf("%d\n",texture_info->texture_id); |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
273 tex_id = texture_info->texture_id; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
274 |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
275 } else { |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
276 texture_info->texture_id = tex_id; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
277 } |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
278 |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
279 texture_info->t_w = list[tex_id].t_w; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
280 texture_info->t_h = list[tex_id].t_h; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
281 texture_info->pixels_orig = list[tex_id].pixels_orig; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
282 texture_info->pixels = list[tex_id].pixels; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
283 texture_info->scale_max = list[tex_id].scale_max; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
284 texture_info->texture_image = list[tex_id].texture_image; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
285 } |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
286 |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
287 SDL_Surface* |
1211 | 288 SceneGraph::load_font_image(const char *font ,int pixel,Uint32 color , const char *string_name) |
1205
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
289 { |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
290 //printf("laod_font_iamge"); |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
291 FT_Library library; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
292 FT_Error err; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
293 err = FT_Init_FreeType(&library); |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
294 if(err){ |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
295 exit(1); |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
296 } |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
297 FT_Face face; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
298 err = FT_New_Face(library,font,0,&face);//font:フォントファイルのパス |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
299 if(err){ |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
300 exit(1); |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
301 } |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
302 |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
303 err = FT_Set_Pixel_Sizes(face,pixel,pixel); |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
304 if(err){ |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
305 exit(1); |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
306 } |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
307 |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
308 u_int32_t changecode[256] = {0}; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
309 |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
310 conv(string_name+5,strlen(string_name+5),changecode); |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
311 |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
312 unsigned int characode = changecode[0]; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
313 |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
314 err = FT_Load_Char(face,characode,0); |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
315 if(err){ |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
316 exit(1); |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
317 } |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
318 |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
319 err = FT_Render_Glyph(face->glyph,FT_RENDER_MODE_MONO); |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
320 if(err){ |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
321 exit(1); |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
322 } |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
323 |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
324 FT_Bitmap *bm = &face->glyph->bitmap; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
325 |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
326 //baseline計算 y_ppem(nominal height) - bitmap_top(topからのbaseline) |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
327 float baseline = face->size->metrics.y_ppem - face->glyph->bitmap_top; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
328 |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
329 float row = 1; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
330 float width = 1; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
331 |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
332 font_coordinate(baseline,face->glyph->bitmap.rows,face->glyph->bitmap.width); |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
333 this->seq = face->glyph->bitmap.width; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
334 font_texture(row,width); |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
335 |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
336 int index = 0; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
337 Uint32 *pixels = (Uint32*)malloc(bm->rows*bm->pitch*8*4); |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
338 |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
339 for (int row = 0; row < bm->rows; row ++) { |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
340 for (int col = 0; col < bm->pitch; col ++) { |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
341 int c = bm->buffer[bm->pitch * row + col]; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
342 for (int bit = 7; bit >= 0; bit --) { |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
343 |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
344 if (((c >> bit) & 1) == 0) { |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
345 //printf(" "); |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
346 pixels[index++] = 0x0000000; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
347 } else { |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
348 //printf("##"); |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
349 //pixels[index++] = 0x00ffffff; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
350 pixels[index++] = color; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
351 |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
352 } |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
353 |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
354 } |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
355 } |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
356 |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
357 } |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
358 |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
359 SDL_Surface *texture_image = SDL_CreateRGBSurfaceFrom(pixels, bm->pitch*8, bm->rows, |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
360 32, bm->pitch*8*4, redMask, |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
361 greenMask, blueMask, alphaMask); |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
362 |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
363 |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
364 |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
365 if (!texture_image) { |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
366 printf("error\n"); |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
367 return 0; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
368 } |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
369 SDL_Surface *tmpImage |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
370 = SDL_CreateRGBSurface(SDL_HWSURFACE, texture_image->w, |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
371 texture_image->h, 32, redMask, |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
372 greenMask, blueMask, alphaMask); |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
373 |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
374 |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
375 SDL_Surface *converted; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
376 converted = SDL_ConvertSurface(texture_image, tmpImage->format, |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
377 SDL_HWSURFACE); |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
378 if (converted != NULL) { |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
379 SDL_FreeSurface(texture_image); |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
380 texture_image = converted; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
381 } |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
382 |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
383 return texture_image; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
384 } |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
385 |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
386 void |
1211 | 387 SceneGraph::conv(const char *str, int length, u_int32_t *out) { |
1205
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
388 int oindex = 0; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
389 int i = 0; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
390 while (i < length) { |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
391 out[oindex] = str[i++] & 0xff; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
392 int len = 0; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
393 u_int32_t mask; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
394 for (mask = 0x80; out[oindex] & mask; mask >>= 1) { |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
395 out[oindex] -= mask; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
396 len++; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
397 } |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
398 int j; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
399 for (j = 1; j < len; j++) |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
400 out[oindex] = (out[oindex] << 6) | (str[i++] & 0x3f); |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
401 oindex++; |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
402 } |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
403 } |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
404 |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
405 /*文字のSceneGraphを生成する*/ |
b8adf4e95e96
add createStringFont()
Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
parents:
1184
diff
changeset
|
406 |
539 | 407 void |
724
6e9e4726113e
Small clean up of Rendering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
653
diff
changeset
|
408 SceneGraph::init() |
539 | 409 { |
410 next = NULL; | |
411 prev = NULL; | |
412 last = NULL; | |
413 | |
414 parent = NULL; | |
415 brother = NULL; | |
416 children = NULL; | |
417 lastChild = NULL; | |
418 | |
419 stack_xyz[0] = 0.0f; | |
420 stack_xyz[2] = 0.0f; | |
421 stack_xyz[1] = 0.0f; | |
422 stack_angle[0] = 0.0f; | |
423 stack_angle[1] = 0.0f; | |
424 stack_angle[2] = 0.0f; | |
425 | |
426 size = 0; | |
1141 | 427 pp_num = 0; |
428 | |
539 | 429 //data = NULL; |
1128 | 430 |
539 | 431 move = no_move; |
432 collision = no_collision; | |
433 | |
434 flag_remove = 0; | |
435 flag_drawable = 1; | |
436 sgid = -1; | |
437 gid = -1; | |
438 | |
439 frame = 0; | |
1351
e51127dbd63c
operate directly on matrix. not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1336
diff
changeset
|
440 |
539 | 441 } |
442 | |
1351
e51127dbd63c
operate directly on matrix. not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1336
diff
changeset
|
443 // spe に渡すために 16アラインメント に allocate をする |
e51127dbd63c
operate directly on matrix. not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1336
diff
changeset
|
444 void |
e51127dbd63c
operate directly on matrix. not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1336
diff
changeset
|
445 SceneGraph::allocate_init(TaskManager *manager) |
e51127dbd63c
operate directly on matrix. not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1336
diff
changeset
|
446 { |
e51127dbd63c
operate directly on matrix. not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1336
diff
changeset
|
447 matrix = (float*)manager->allocate(sizeof(float)*16); |
e51127dbd63c
operate directly on matrix. not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1336
diff
changeset
|
448 out_matrix = (float*)manager->allocate(sizeof(float)*16); |
e51127dbd63c
operate directly on matrix. not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1336
diff
changeset
|
449 texture_info = (texture_list*)manager->allocate(sizeof(texture_list)); |
e51127dbd63c
operate directly on matrix. not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1336
diff
changeset
|
450 |
e51127dbd63c
operate directly on matrix. not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1336
diff
changeset
|
451 for (int i = 0; i < 16; i++) { |
e51127dbd63c
operate directly on matrix. not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1336
diff
changeset
|
452 matrix[i] = 0; |
e51127dbd63c
operate directly on matrix. not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1336
diff
changeset
|
453 out_matrix[i] = 0; |
e51127dbd63c
operate directly on matrix. not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1336
diff
changeset
|
454 } |
e51127dbd63c
operate directly on matrix. not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1336
diff
changeset
|
455 for (int i = 0; i < 4; i++) { |
e51127dbd63c
operate directly on matrix. not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1336
diff
changeset
|
456 matrix[i*4+i] = 1; |
e51127dbd63c
operate directly on matrix. not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1336
diff
changeset
|
457 out_matrix[i*4+i] = 1; |
e51127dbd63c
operate directly on matrix. not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1336
diff
changeset
|
458 } |
e51127dbd63c
operate directly on matrix. not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1336
diff
changeset
|
459 } |
e51127dbd63c
operate directly on matrix. not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1336
diff
changeset
|
460 |
e51127dbd63c
operate directly on matrix. not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1336
diff
changeset
|
461 |
724
6e9e4726113e
Small clean up of Rendering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
653
diff
changeset
|
462 SceneGraph::~SceneGraph() |
539 | 463 { |
464 (this->*finalize)(); | |
465 } | |
466 | |
467 /** | |
468 * xml ファイルから生成されたオリジナル SceneGraph なので | |
469 * polygon data を削除 | |
470 */ | |
471 void | |
724
6e9e4726113e
Small clean up of Rendering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
653
diff
changeset
|
472 SceneGraph::finalize_original() |
539 | 473 { |
474 //delete [] data; | |
860 | 475 |
1126
6043da6e48f1
complete compile but not work yet.
yutaka@localhost.localdomain
parents:
1125
diff
changeset
|
476 free(pp); |
1142
801d57ae1e29
cut compile CreatePolygonTask on spe side because not enough spe memory. We have to use code loading.
yutaka@localhost.localdomain
parents:
1141
diff
changeset
|
477 free(matrix); |
801d57ae1e29
cut compile CreatePolygonTask on spe side because not enough spe memory. We have to use code loading.
yutaka@localhost.localdomain
parents:
1141
diff
changeset
|
478 free(texture_info); |
860 | 479 |
539 | 480 } |
481 | |
482 /** | |
483 * SceneGraph ID から生成された、コピー SceneGraph なので | |
484 * polygon data は削除しない。オリジナルの方で削除する。 | |
485 */ | |
486 void | |
724
6e9e4726113e
Small clean up of Rendering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
653
diff
changeset
|
487 SceneGraph::finalize_copy() |
539 | 488 { |
1142
801d57ae1e29
cut compile CreatePolygonTask on spe side because not enough spe memory. We have to use code loading.
yutaka@localhost.localdomain
parents:
1141
diff
changeset
|
489 |
801d57ae1e29
cut compile CreatePolygonTask on spe side because not enough spe memory. We have to use code loading.
yutaka@localhost.localdomain
parents:
1141
diff
changeset
|
490 free(matrix); |
1169 | 491 free(texture_info); |
539 | 492 } |
493 | |
494 | |
495 /** | |
496 * add Children | |
497 * 親の登録と、brother のリストへ加える | |
498 * | |
499 * @param child new child | |
500 */ | |
501 SceneGraphPtr | |
502 SceneGraph::addChild(SceneGraphPtr child) | |
503 { | |
504 /* childrenのリストの最後に加える (brother として)*/ | |
505 if (this->lastChild != NULL) { | |
506 SceneGraphPtr last = this->lastChild; | |
507 last->brother = child; | |
850 | 508 //child->parent = this; |
509 //return child; | |
539 | 510 } |
891 | 511 |
539 | 512 this->lastChild = child; |
891 | 513 |
539 | 514 if (this->children == NULL) { |
515 this->children = child; | |
516 } | |
891 | 517 |
539 | 518 child->parent = this; |
519 | |
520 return child; | |
521 } | |
522 | |
523 | |
524 /** | |
525 * add Brother | |
526 * addChild() でも brother の操作をしないといけないので、そっちに回す | |
527 * | |
528 * @param bro new Brother | |
529 */ | |
530 SceneGraphPtr | |
531 SceneGraph::addBrother(SceneGraphPtr bro) | |
532 { | |
533 if (this->parent) { | |
534 parent->addChild(bro); | |
535 } else { | |
536 fprintf(stderr, "error : SceneGraph::%s : %s doesn't have parent\n", | |
537 __FUNCTION__, this->name); | |
538 } | |
539 | |
540 return bro; | |
541 } | |
542 | |
543 /* thisの子や子孫にnameのものが存在すればそいつを返す なければNULL. */ | |
544 SceneGraphPtr | |
545 SceneGraph::searchSceneGraph(const char *name) | |
546 { | |
547 SceneGraphPtr tmp; | |
548 SceneGraphPtr result; | |
549 | |
550 /* 本人か */ | |
551 if( 0==strcmp(this->name, name) ) return this; | |
552 | |
553 /* 子供から再帰的に探す */ | |
554 for(tmp = this->children; tmp; tmp = tmp->next) { | |
555 if ((result=tmp->searchSceneGraph(name)) != NULL) | |
556 return result; | |
557 } | |
558 | |
559 /* 無かったら NULL. */ | |
560 return NULL; | |
561 } | |
562 | |
563 void | |
724
6e9e4726113e
Small clean up of Rendering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
653
diff
changeset
|
564 SceneGraph::tree_check() |
539 | 565 { |
566 SceneGraphPtr t = this; | |
567 | |
568 while(t) | |
569 { | |
570 cout << "my_name : " << t->name << endl; | |
571 if(t->children != NULL) | |
572 { | |
573 cout << "--move children : " << t->children->name << endl; | |
574 t = t->children; | |
575 } | |
576 else if(t->brother != NULL) | |
577 { | |
578 cout << "--move brother : " << t->brother->name << endl; | |
579 t = t->brother; | |
580 } | |
581 else | |
582 { | |
583 while(t) | |
584 { | |
585 if(t->brother != NULL) | |
586 { | |
587 cout << "--move brother : " << t->brother->name << endl; | |
588 t = t->brother; | |
589 break; | |
590 } | |
591 else | |
592 { | |
593 if(t->parent) | |
594 { | |
595 cout << "--move parent : " << t->parent->name << endl; | |
596 } | |
597 t = t->parent; | |
598 } | |
599 } | |
600 } | |
601 } | |
602 } | |
603 | |
604 | |
605 void | |
724
6e9e4726113e
Small clean up of Rendering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
653
diff
changeset
|
606 SceneGraph::print_member() |
539 | 607 { |
608 cout << "size = " << size << endl; | |
609 cout << "name = " << name << endl; | |
610 cout << "parent_name = " << parent_name << endl; | |
611 | |
612 if (parent != NULL) { | |
613 cout << "parent->name = " << parent->name << endl; | |
614 } | |
615 | |
616 if (children != NULL) { | |
617 cout << "children->name = " << children->name << endl; | |
618 } | |
619 } | |
620 | |
621 | |
1336
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
622 void Polygon::pickup_coordinate(char *cont) |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
623 { |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
624 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
625 // size は頂点の数, count は面の数 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
626 char *tmp_cont = cont; |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
627 int count = size / 3; |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
628 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
629 for (int i = 0; i < pp_num; i++) { |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
630 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
631 TrianglePackPtr tri = pp[i].tri; |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
632 // TrianglePack の size のチェック |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
633 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
634 int tri_size = (count < MAX_SIZE_TRIANGLE) ? count : MAX_SIZE_TRIANGLE ; |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
635 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
636 //それを構造体に登録 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
637 pp[i].info.size = tri_size; |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
638 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
639 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
640 for (int j = 0; j < tri_size; j++) { |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
641 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
642 tmp_cont = pickup_float(tmp_cont, &(tri[j].ver1.x)); |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
643 tmp_cont = pickup_float(tmp_cont, &(tri[j].ver1.y)); |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
644 tmp_cont = pickup_float(tmp_cont, &(tri[j].ver1.z)); |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
645 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
646 tmp_cont = pickup_float(tmp_cont, &(tri[j].ver2.x)); |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
647 tmp_cont = pickup_float(tmp_cont, &(tri[j].ver2.y)); |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
648 tmp_cont = pickup_float(tmp_cont, &(tri[j].ver2.z)); |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
649 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
650 tmp_cont = pickup_float(tmp_cont, &(tri[j].ver3.x)); |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
651 tmp_cont = pickup_float(tmp_cont, &(tri[j].ver3.y)); |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
652 tmp_cont = pickup_float(tmp_cont, &(tri[j].ver3.z)); |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
653 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
654 if (tmp_cont == NULL) |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
655 { |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
656 cout << "Analyzing obj data failed coordinate\n"; |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
657 } |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
658 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
659 count -= 1; |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
660 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
661 } |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
662 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
663 } |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
664 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
665 if (count != 0) { |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
666 printf("miss pickup_coordinate size. diff size = %d\n", count); |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
667 } |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
668 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
669 } |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
670 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
671 void Polygon::pickup_normal(char *cont) |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
672 { |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
673 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
674 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
675 // size は頂点の数, count は面の数 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
676 char *tmp_cont = cont; |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
677 int count = size / 3; |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
678 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
679 for (int i = 0; i < pp_num; i++) { |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
680 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
681 TrianglePackPtr tri = pp[i].tri; |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
682 // TrianglePack の size のチェック |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
683 int tri_size = (count < MAX_SIZE_TRIANGLE) ? count : MAX_SIZE_TRIANGLE ; |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
684 pp[i].info.size = tri_size; |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
685 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
686 for (int j = 0; j < tri_size; j++) { |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
687 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
688 tmp_cont = pickup_float(tmp_cont, &(tri[j].normal1.x)); |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
689 tmp_cont = pickup_float(tmp_cont, &(tri[j].normal1.y)); |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
690 tmp_cont = pickup_float(tmp_cont, &(tri[j].normal1.z)); |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
691 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
692 tmp_cont = pickup_float(tmp_cont, &(tri[j].normal2.x)); |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
693 tmp_cont = pickup_float(tmp_cont, &(tri[j].normal2.y)); |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
694 tmp_cont = pickup_float(tmp_cont, &(tri[j].normal2.z)); |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
695 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
696 tmp_cont = pickup_float(tmp_cont, &(tri[j].normal3.x)); |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
697 tmp_cont = pickup_float(tmp_cont, &(tri[j].normal3.y)); |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
698 tmp_cont = pickup_float(tmp_cont, &(tri[j].normal3.z)); |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
699 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
700 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
701 if (tmp_cont == NULL) |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
702 { |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
703 cout << "Analyzing obj data failed coordinate\n"; |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
704 } |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
705 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
706 count -= 1; |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
707 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
708 } |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
709 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
710 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
711 } |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
712 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
713 if (count != 0) { |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
714 printf("miss pickup_normal size. diff size = %d\n", count); |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
715 } |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
716 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
717 } |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
718 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
719 void Polygon::pickup_model(char *cont) |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
720 { |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
721 cont = pickup_float(cont,c_xyz); |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
722 cont = pickup_float(cont,c_xyz+1); |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
723 cont = pickup_float(cont,c_xyz+2); |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
724 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
725 if (cont == NULL) |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
726 { |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
727 cout << "Analyzing obj data failed model\n"; |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
728 } |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
729 } |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
730 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
731 void Polygon::pickup_texture(char *cont) |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
732 { |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
733 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
734 char *tmp_cont = cont; |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
735 int count = size / 3; |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
736 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
737 for (int i = 0; i < pp_num; i++) { |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
738 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
739 TrianglePackPtr tri = pp[i].tri; |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
740 // TrianglePack の size のチェック |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
741 int tri_size = (count < MAX_SIZE_TRIANGLE) ? count : MAX_SIZE_TRIANGLE ; |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
742 pp[i].info.size = tri_size; |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
743 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
744 for (int j = 0; j < tri_size; j++) { |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
745 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
746 tmp_cont = pickup_float(tmp_cont, &(tri[j].ver1.tex_x)); |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
747 tmp_cont = pickup_float(tmp_cont, &(tri[j].ver1.tex_y)); |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
748 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
749 tmp_cont = pickup_float(tmp_cont, &(tri[j].ver2.tex_x)); |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
750 tmp_cont = pickup_float(tmp_cont, &(tri[j].ver2.tex_y)); |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
751 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
752 tmp_cont = pickup_float(tmp_cont, &(tri[j].ver3.tex_x)); |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
753 tmp_cont = pickup_float(tmp_cont, &(tri[j].ver3.tex_y)); |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
754 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
755 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
756 if (tmp_cont == NULL) |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
757 { |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
758 cout << "Analyzing obj data failed coordinate\n"; |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
759 } |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
760 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
761 count -= 1; |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
762 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
763 } |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
764 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
765 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
766 } |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
767 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
768 if (count != 0) { |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
769 printf("miss pickup_texture size. diff size = %d\n", count); |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
770 } |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
771 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
772 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
773 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
774 } |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
775 |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
776 |
539 | 777 /* |
778 * surface nodeからポリゴンの情報を読み出す 再帰しない | |
1336
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
779 * |
3f95f61faef6
collada file might be readable.
e095732 <e095732@ie.u-ryukyu.ac.jp>
parents:
1302
diff
changeset
|
780 * get_data,get_image,makeTapestorys このファイルの外に追い出すのがよい |
539 | 781 */ |
782 void | |
783 SceneGraph::get_data(TaskManager *manager, xmlNodePtr cur) | |
784 { | |
785 //char *image_name; | |
786 | |
787 for(;cur;cur=cur->next) | |
788 { | |
789 if(!xmlStrcmp(cur->name,(xmlChar*)"coordinate")) | |
790 { | |
791 char *cont = (char *)xmlNodeGetContent(cur); | |
792 pickup_coordinate(cont); | |
793 } | |
794 else if(!xmlStrcmp(cur->name,(xmlChar*)"normal")) | |
795 { | |
796 char *cont = (char *)xmlNodeGetContent(cur); | |
797 pickup_normal(cont); | |
798 } | |
799 else if(!xmlStrcmp(cur->name,(xmlChar*)"model")) | |
800 { | |
801 char *cont = (char *)xmlNodeGetContent(cur); | |
802 pickup_model(cont); | |
803 } | |
804 else if(!xmlStrcmp(cur->name,(xmlChar*)"texture")) | |
805 { | |
806 char *cont = (char *)xmlNodeGetContent(cur); | |
807 pickup_texture(cont); | |
808 } | |
809 else if(!xmlStrcmp(cur->name,(xmlChar*)"imageflag")) | |
810 { | |
811 int id; | |
812 char *filename = (char *)xmlGetProp(cur, (xmlChar *)"name"); | |
813 texture_hash.hash_regist(filename, id); | |
814 } | |
815 else if(!xmlStrcmp(cur->name,(xmlChar*)"image")) | |
816 { | |
817 get_image(manager, cur); | |
818 } | |
819 } | |
820 } | |
821 | |
1166
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
822 static int |
1211 | 823 is_bmp(const char *name) { |
1166
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
824 int bmp = 0; |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
825 |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
826 while(*name) { |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
827 if (bmp==0 && *name=='.') bmp = 1; |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
828 else if (bmp==1 && (*name=='b' || *name=='B')) bmp = 2; |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
829 else if (bmp==2 && (*name=='m' || *name=='M')) bmp = 3; |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
830 else if (bmp==3 && (*name=='p' || *name=='P')) bmp = 4; |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
831 else bmp = 0; |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
832 name++; |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
833 } |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
834 return bmp==4; |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
835 } |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
836 |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
837 #if (__LITTLE_ENDIAN__) |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
838 #define LITTLEENDIAN 1 |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
839 #else |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
840 #define LITTLEENDIAN 0 |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
841 #endif |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
842 |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
843 static void |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
844 make_black_alpha(SDL_Surface *texture_image) |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
845 { |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
846 int tex_w = texture_image->w; |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
847 int tex_h = texture_image->h; |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
848 #if LITTLEENDIAN |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
849 uint32 alpha = 0x000000ff; |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
850 #else |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
851 uint32 alpha = 0xff000000; |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
852 #endif |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
853 |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
854 uint32 *pixels = (uint32*)texture_image->pixels; |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
855 int i; |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
856 for(i=0;i<tex_w*tex_h;i++) { |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
857 uint32 pixel = pixels[i] & ~alpha; |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
858 if (pixel==0) { |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
859 pixels[i] = 0; |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
860 } |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
861 } |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
862 } |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
863 |
539 | 864 SDL_Surface* |
1211 | 865 SceneGraph::load_decode_image(const char *file_name, const char *image_name, xmlNodePtr cur) |
539 | 866 { |
1211 | 867 int fd = mkstemp((char *)image_name); |
539 | 868 FILE *outfile = fdopen(fd, "wb"); |
869 | |
870 if (NULL == outfile) { | |
871 cout << "error open file\n"; | |
872 return 0; | |
873 } | |
874 | |
875 char *cont = (char *)xmlNodeGetContent(cur); | |
876 //decode(cont, image_name); | |
877 decode(cont, outfile); | |
878 fclose(outfile); | |
879 | |
1166
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
880 int alpha_black = is_bmp(file_name); |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
881 |
539 | 882 |
883 /** | |
884 * image を 32bit(RGBA) に変換する | |
885 */ | |
886 SDL_Surface *texture_image = IMG_Load(image_name); | |
580
ec9dd24c2dc8
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
539
diff
changeset
|
887 if (!texture_image) return 0; |
539 | 888 SDL_Surface *tmpImage |
1123 | 889 = SDL_CreateRGBSurface(SDL_HWSURFACE, texture_image->w, |
996 | 890 texture_image->h, 32, redMask, |
891 greenMask, blueMask, alphaMask); | |
892 | |
893 //= SDL_CreateRGBSurface(SDL_HWSURFACE, 0, | |
894 // 0, 32, redMask, | |
895 // greenMask, blueMask, alphaMask); | |
539 | 896 SDL_Surface *converted; |
897 converted = SDL_ConvertSurface(texture_image, tmpImage->format, | |
996 | 898 SDL_HWSURFACE); |
899 | |
900 //SDL_SetAlpha(converted, 0, 0); | |
901 | |
539 | 902 if (converted != NULL) { |
903 SDL_FreeSurface(texture_image); | |
904 texture_image = converted; | |
905 } | |
906 | |
1166
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
907 if (alpha_black) { |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
908 make_black_alpha(texture_image); |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
909 } |
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
910 |
942
27df980045b5
FB mode is working again on Mac OS X.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
930
diff
changeset
|
911 // this->gl_tex = SDL_GL_LoadTexture(texture_image); |
539 | 912 return texture_image; |
913 } | |
914 | |
915 int | |
916 SceneGraph::makeTapestries(TaskManager *manager, SDL_Surface *texture_image, int id) { | |
917 uint32 *tapestry; | |
918 int scale = 1; | |
919 int tex_w = texture_image->w; | |
920 int tex_h = texture_image->h; | |
921 int all_pixel_num = 0; | |
1047
f87218eed9fc
broken texure ( h/w != 2^n ) protection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1033
diff
changeset
|
922 int nw = tex_w; |
f87218eed9fc
broken texure ( h/w != 2^n ) protection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1033
diff
changeset
|
923 int nh = tex_h; |
539 | 924 |
925 /** | |
926 * テクスチャの w or h が 8 pixel で分割できる間、 | |
927 * 1/2 の縮小画像を作る。 | |
928 * ここでは、最大の scale (1/scale) を見つける | |
929 * | |
930 * (ex) | |
931 * (128,128) => 64,64 : 32,32: 16,16 : 8,8 | |
932 * scale = 16 | |
933 * (128, 64) => 64,32 : 32,16: 16,8 | |
934 * scale = 8 | |
1049
91500a6c4def
non 2^n texture tapestry generation.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1047
diff
changeset
|
935 * 8 pixcel align してない場合は、透明に 8 pixcel に拡張する |
91500a6c4def
non 2^n texture tapestry generation.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1047
diff
changeset
|
936 * (200, 57) => 200,64 : 100,32 : 56,16: 32,8 (16,1 : 8,1 まで落すべき? 32byte) |
91500a6c4def
non 2^n texture tapestry generation.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1047
diff
changeset
|
937 * scale = 32 |
539 | 938 */ |
1047
f87218eed9fc
broken texure ( h/w != 2^n ) protection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1033
diff
changeset
|
939 |
1049
91500a6c4def
non 2^n texture tapestry generation.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1047
diff
changeset
|
940 do { |
91500a6c4def
non 2^n texture tapestry generation.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1047
diff
changeset
|
941 tex_w = align(tex_w,8); |
91500a6c4def
non 2^n texture tapestry generation.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1047
diff
changeset
|
942 tex_h = align(tex_h,8); |
91500a6c4def
non 2^n texture tapestry generation.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1047
diff
changeset
|
943 all_pixel_num += tex_w * tex_h; |
539 | 944 tex_w >>= 1; /* tex_w /= 2 */ |
945 tex_h >>= 1; | |
946 scale <<= 1; /* scale *= 2 */ | |
1049
91500a6c4def
non 2^n texture tapestry generation.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1047
diff
changeset
|
947 } while( tex_w >8 || tex_h > 8 ); |
539 | 948 |
1049
91500a6c4def
non 2^n texture tapestry generation.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1047
diff
changeset
|
949 scale >>= 1; // 必ず 1 以上になる |
539 | 950 |
951 tapestry = makeTapestry(manager, texture_image->w, texture_image->h, | |
952 (uint32*)texture_image->pixels, | |
953 all_pixel_num, scale); | |
954 | |
1047
f87218eed9fc
broken texure ( h/w != 2^n ) protection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1033
diff
changeset
|
955 list[id].t_w = nw; |
f87218eed9fc
broken texure ( h/w != 2^n ) protection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1033
diff
changeset
|
956 list[id].t_h = nh; |
539 | 957 list[id].pixels_orig = (Uint32*)texture_image->pixels; |
958 list[id].pixels = tapestry; | |
959 list[id].scale_max = scale; | |
942
27df980045b5
FB mode is working again on Mac OS X.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
930
diff
changeset
|
960 list[id].texture_image = texture_image; |
539 | 961 |
962 return id; | |
963 } | |
964 | |
965 void | |
966 SceneGraph::get_image(TaskManager *manager, xmlNodePtr cur) | |
967 { | |
968 char image_name[20] = "/tmp/image_XXXXXX"; | |
969 char *filename = (char *)xmlGetProp(cur, (xmlChar *)"name"); | |
970 | |
971 if (filename == NULL || filename[0] == 0) { | |
972 return; | |
973 } | |
974 | |
975 /** | |
976 * image_name を既に Load していれば何もしない | |
977 */ | |
978 int tex_id; | |
1184 | 979 if (texture_hash.sg_hash_regist(filename, tex_id) == -1) { |
539 | 980 |
1166
38111db531e0
bmp's black has 0 alpha value for compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1143
diff
changeset
|
981 SDL_Surface *texture_image = load_decode_image(filename, image_name, cur); |
580
ec9dd24c2dc8
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
539
diff
changeset
|
982 if (texture_image==0) { |
ec9dd24c2dc8
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
539
diff
changeset
|
983 printf("Can't load image %s\n",filename); |
ec9dd24c2dc8
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
539
diff
changeset
|
984 exit(0); |
ec9dd24c2dc8
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
539
diff
changeset
|
985 } |
1130 | 986 texture_info->texture_id = makeTapestries(manager, texture_image, tex_id); |
987 tex_id = texture_info->texture_id; | |
539 | 988 |
989 if (unlink(image_name)) { | |
990 cout << "unlink error\n"; | |
991 } | |
992 } else { | |
993 /** | |
994 * 以前に Load されている Texture を共用 | |
995 */ | |
1130 | 996 texture_info->texture_id = tex_id; |
539 | 997 } |
998 | |
860 | 999 // こんなことすると list[] のいみあるのかなーと |
1000 // 微妙に思う、自分で書き換えた感想 by gongo | |
1130 | 1001 texture_info->t_w = list[tex_id].t_w; |
1002 texture_info->t_h = list[tex_id].t_h;; | |
1003 texture_info->pixels_orig = list[tex_id].pixels_orig; | |
1004 texture_info->pixels = list[tex_id].pixels; | |
1005 texture_info->scale_max = list[tex_id].scale_max; | |
1006 texture_info->texture_image = list[tex_id].texture_image; | |
860 | 1007 |
539 | 1008 } |
1009 | |
1010 | |
1011 void | |
724
6e9e4726113e
Small clean up of Rendering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
653
diff
changeset
|
1012 SceneGraph::delete_data() |
539 | 1013 { |
1014 SceneGraphPtr n = this->next, m; | |
1015 | |
1016 //n = this; | |
1017 //delete [] n->data; | |
1018 | |
1019 if (next) { | |
1020 while (n) { | |
1021 m = n->next; | |
1022 delete n; | |
1023 n = m; | |
1024 } | |
1025 } | |
1026 } | |
1027 | |
653
7a311860a76e
remove global variable "sgroot" , add SgChange.{cc, h} SgMain.cc SgRootChange.{cc, h}
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
580
diff
changeset
|
1028 /* move_func 実行 sgroot 渡す */ |
539 | 1029 void |
1030 SceneGraph::move_execute(int w, int h) | |
1031 { | |
653
7a311860a76e
remove global variable "sgroot" , add SgChange.{cc, h} SgMain.cc SgRootChange.{cc, h}
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
580
diff
changeset
|
1032 (*move)(this, this->sgroot, w, h); |
539 | 1033 } |
1034 | |
1035 void | |
1036 SceneGraph::collision_check(int w, int h, SceneGraphPtr tree) | |
1037 { | |
653
7a311860a76e
remove global variable "sgroot" , add SgChange.{cc, h} SgMain.cc SgRootChange.{cc, h}
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
580
diff
changeset
|
1038 (*collision)(this, this->sgroot, w, h, tree); |
539 | 1039 } |
1040 | |
759
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
724
diff
changeset
|
1041 void |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
724
diff
changeset
|
1042 SceneGraph::create_sg_execute() |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
724
diff
changeset
|
1043 { |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
724
diff
changeset
|
1044 (*create_sg)(this->sgroot, property, update_property); |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
724
diff
changeset
|
1045 } |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
724
diff
changeset
|
1046 |
1033
a9581a9df440
add application main method and task.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
996
diff
changeset
|
1047 void |
a9581a9df440
add application main method and task.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
996
diff
changeset
|
1048 SceneGraph::set_move_collision(move_func new_move) |
a9581a9df440
add application main method and task.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
996
diff
changeset
|
1049 { |
a9581a9df440
add application main method and task.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
996
diff
changeset
|
1050 this->move = new_move; |
a9581a9df440
add application main method and task.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
996
diff
changeset
|
1051 } |
a9581a9df440
add application main method and task.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
996
diff
changeset
|
1052 |
a9581a9df440
add application main method and task.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
996
diff
changeset
|
1053 void |
a9581a9df440
add application main method and task.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
996
diff
changeset
|
1054 SceneGraph::set_move_collision(collision_func new_collision) |
a9581a9df440
add application main method and task.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
996
diff
changeset
|
1055 { |
a9581a9df440
add application main method and task.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
996
diff
changeset
|
1056 this->collision = new_collision; |
a9581a9df440
add application main method and task.
koba <koba@cr.ie.u-ryukyu.ac.jp>
parents:
996
diff
changeset
|
1057 } |
539 | 1058 |
1059 void | |
1060 SceneGraph::set_move_collision(move_func new_move, | |
1061 collision_func new_collision) | |
1062 { | |
1063 this->move = new_move; | |
1064 this->collision = new_collision; | |
1065 } | |
1066 | |
653
7a311860a76e
remove global variable "sgroot" , add SgChange.{cc, h} SgMain.cc SgRootChange.{cc, h}
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
580
diff
changeset
|
1067 |
7a311860a76e
remove global variable "sgroot" , add SgChange.{cc, h} SgMain.cc SgRootChange.{cc, h}
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
580
diff
changeset
|
1068 void |
7a311860a76e
remove global variable "sgroot" , add SgChange.{cc, h} SgMain.cc SgRootChange.{cc, h}
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
580
diff
changeset
|
1069 SceneGraph::set_move_collision(move_func new_move, |
7a311860a76e
remove global variable "sgroot" , add SgChange.{cc, h} SgMain.cc SgRootChange.{cc, h}
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
580
diff
changeset
|
1070 collision_func new_collision, void *sgroot_) |
7a311860a76e
remove global variable "sgroot" , add SgChange.{cc, h} SgMain.cc SgRootChange.{cc, h}
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
580
diff
changeset
|
1071 { |
7a311860a76e
remove global variable "sgroot" , add SgChange.{cc, h} SgMain.cc SgRootChange.{cc, h}
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
580
diff
changeset
|
1072 this->move = new_move; |
7a311860a76e
remove global variable "sgroot" , add SgChange.{cc, h} SgMain.cc SgRootChange.{cc, h}
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
580
diff
changeset
|
1073 this->collision = new_collision; |
7a311860a76e
remove global variable "sgroot" , add SgChange.{cc, h} SgMain.cc SgRootChange.{cc, h}
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
580
diff
changeset
|
1074 // add |
7a311860a76e
remove global variable "sgroot" , add SgChange.{cc, h} SgMain.cc SgRootChange.{cc, h}
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
580
diff
changeset
|
1075 this->sgroot = sgroot_; |
7a311860a76e
remove global variable "sgroot" , add SgChange.{cc, h} SgMain.cc SgRootChange.{cc, h}
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
580
diff
changeset
|
1076 } |
7a311860a76e
remove global variable "sgroot" , add SgChange.{cc, h} SgMain.cc SgRootChange.{cc, h}
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
580
diff
changeset
|
1077 |
539 | 1078 void |
759
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
724
diff
changeset
|
1079 SceneGraph::set_move_collision(move_func new_move, |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
724
diff
changeset
|
1080 collision_func new_collision, create_sg_func new_create_sg) |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
724
diff
changeset
|
1081 { |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
724
diff
changeset
|
1082 this->move = new_move; |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
724
diff
changeset
|
1083 this->collision = new_collision; |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
724
diff
changeset
|
1084 this->create_sg = new_create_sg; |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
724
diff
changeset
|
1085 } |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
724
diff
changeset
|
1086 |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
724
diff
changeset
|
1087 void |
539 | 1088 SceneGraph::add_next(SceneGraphPtr next) |
1089 { | |
1090 /* next のリストの最後に加える */ | |
1091 if (this->next != NULL) { | |
1092 SceneGraphPtr tmp = this->last; | |
1093 tmp->next = next; | |
1094 } else { | |
1095 this->next = next; | |
1096 } | |
1097 | |
1098 this->last = next; | |
1099 } | |
1100 | |
1101 /** | |
1102 * SceneGraph の clone | |
1103 * @return clone SceneGraph | |
1104 */ | |
1105 SceneGraphPtr | |
1136 | 1106 SceneGraph::clone(TaskManager *manager) { |
1107 | |
1169 | 1108 SceneGraphPtr p = new SceneGraph(manager, this); |
1136 | 1109 |
1140
3975c384ff93
SceneGraph initalize... can worked on Mac OS X. not check Cell arch.
Yutaka_Kinjyo
parents:
1136
diff
changeset
|
1110 |
539 | 1111 return p; |
1112 } | |
1113 | |
1114 /** | |
1115 * SceneGraph の clone | |
1116 * 予め allocate されてる領域への placement new を行う | |
1117 * | |
1118 * @param buf clone 領域 | |
1119 * @return clone SceneGraph | |
1120 */ | |
1169 | 1121 |
539 | 1122 SceneGraphPtr |
1169 | 1123 SceneGraph::clone(TaskManager *manager, void *buf) { |
1124 SceneGraphPtr p = new(buf) SceneGraph(manager, this); | |
539 | 1125 return p; |
1126 } | |
1127 | |
1128 void | |
724
6e9e4726113e
Small clean up of Rendering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
653
diff
changeset
|
1129 SceneGraph::remove() |
539 | 1130 { |
1131 this->flag_remove = 1; | |
1132 } | |
1133 | |
1134 /** | |
1135 * tree から node を削除する | |
1136 * | |
1137 * @param tree SceneGraphTree | |
1138 * @return node削除後の SceneGraphTree | |
1139 */ | |
1140 SceneGraphPtr | |
1141 SceneGraph::realRemoveFromTree(SceneGraphPtr tree) | |
1142 { | |
1143 SceneGraphPtr node = this; | |
1144 SceneGraphPtr parent = node->parent; | |
1145 SceneGraphPtr ret = tree; | |
1146 | |
1147 if (parent) { | |
1148 SceneGraphPtr brother = parent->children; | |
1149 SceneGraphPtr p, p1 = NULL; | |
1150 | |
1151 p = brother; | |
1152 if (p) { | |
1153 if (p == node) { | |
1154 parent->children = NULL; | |
1155 parent->lastChild = NULL; | |
1156 } else { | |
1157 p1 = p->brother; | |
1158 | |
1159 while (p1 && p1 != node) { | |
1160 p1 = p1->brother; | |
1161 p = p->brother; | |
1162 } | |
1163 | |
1164 if (p1) { | |
1165 p->brother = p1->brother; | |
1166 | |
1167 // node が最後尾なら、lastChild を変更 | |
1168 if (parent->lastChild == p1) { | |
1169 parent->lastChild = p; | |
1170 } | |
1171 } else { | |
1172 // Can't find remove node | |
1173 } | |
1174 } | |
1175 } | |
1176 } else { | |
1177 // 親が居ない = tree root なので | |
1178 // NULL を返す | |
1179 ret = NULL; | |
1180 } | |
1181 | |
1182 return ret; | |
1183 } | |
1184 | |
1185 /** | |
1186 * list から node を削除する | |
1187 * | |
1188 * @param list SceneGraphList | |
1189 * @return node削除後の SceneGraphList | |
1190 */ | |
1191 SceneGraphPtr | |
1192 SceneGraph::realRemoveFromList(SceneGraphPtr list) | |
1193 { | |
1194 SceneGraphPtr node = this; | |
1195 SceneGraphPtr prev = node->prev; | |
1196 SceneGraphPtr next = node->next; | |
1197 SceneGraphPtr ret = list; | |
1198 | |
1199 if (prev) { | |
1200 prev->next = next; | |
1201 } else { | |
1202 ret = next; | |
1203 } | |
1204 | |
1205 if (next) { | |
1206 next->prev = prev; | |
1207 } | |
1208 | |
1209 return ret; | |
1210 } | |
1211 | |
1212 int | |
724
6e9e4726113e
Small clean up of Rendering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
653
diff
changeset
|
1213 SceneGraph::isRemoved() |
539 | 1214 { |
1215 return flag_remove; | |
1216 } | |
1217 | |
1218 /** | |
1219 * 平行移動 | |
1220 * | |
1221 * @param x Ttranslate in the x direction | |
1222 * @param y Ttranslate in the y direction | |
1223 * @param z Ttranslate in the z direction | |
1224 */ | |
1225 void | |
1226 SceneGraph::translate(float x, float y, float z) | |
1227 { | |
1351
e51127dbd63c
operate directly on matrix. not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1336
diff
changeset
|
1228 this->matrix[12] += x; |
e51127dbd63c
operate directly on matrix. not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1336
diff
changeset
|
1229 this->matrix[13] += y; |
e51127dbd63c
operate directly on matrix. not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1336
diff
changeset
|
1230 this->matrix[14] += z; |
539 | 1231 } |
1232 | |
1233 /** | |
1234 * x 軸方向への平行移動 | |
1235 * | |
1236 * @param x Ttranslate in the x direction | |
1237 */ | |
1238 void | |
1239 SceneGraph::translateX(float x) | |
1240 { | |
1351
e51127dbd63c
operate directly on matrix. not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1336
diff
changeset
|
1241 this->matrix[12] += x; |
539 | 1242 } |
1243 | |
1244 /** | |
1245 * y 軸方向への平行移動 | |
1246 * | |
1247 * @param y Ttranslate in the y direction | |
1248 */ | |
1249 void | |
1250 SceneGraph::translateY(float y) | |
1251 { | |
1351
e51127dbd63c
operate directly on matrix. not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1336
diff
changeset
|
1252 this->matrix[13] += y; |
539 | 1253 } |
1254 | |
1255 /** | |
1256 * z 軸方向への平行移動 | |
1257 * | |
1258 * @param z Ttranslate in the z direction | |
1259 */ | |
1260 void | |
1261 SceneGraph::translateZ(float z) | |
1262 { | |
1351
e51127dbd63c
operate directly on matrix. not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1336
diff
changeset
|
1263 this->matrix[14] += z; |
1226
636dfdc30176
new API for SceneGraph
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1211
diff
changeset
|
1264 } |
636dfdc30176
new API for SceneGraph
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1211
diff
changeset
|
1265 |
636dfdc30176
new API for SceneGraph
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1211
diff
changeset
|
1266 void |
1351
e51127dbd63c
operate directly on matrix. not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1336
diff
changeset
|
1267 SceneGraph::angleIt(float xangle, float yangle, float zangle) |
1226
636dfdc30176
new API for SceneGraph
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1211
diff
changeset
|
1268 { |
636dfdc30176
new API for SceneGraph
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1211
diff
changeset
|
1269 float m[16]; |
636dfdc30176
new API for SceneGraph
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1211
diff
changeset
|
1270 float t[4] = {0,0,0,0}; |
1351
e51127dbd63c
operate directly on matrix. not work yet.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1336
diff
changeset
|
1271 float angle[4] = {xangle, yangle, zangle, 1}; |
1226
636dfdc30176
new API for SceneGraph
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1211
diff
changeset
|
1272 for(int i=0;i<16;i++) m[i] = matrix[i]; |
636dfdc30176
new API for SceneGraph
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1211
diff
changeset
|
1273 get_matrix(matrix, angle, t, m); |
636dfdc30176
new API for SceneGraph
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1211
diff
changeset
|
1274 } |
636dfdc30176
new API for SceneGraph
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1211
diff
changeset
|
1275 |
1367 | 1276 |
1277 // 今の SceneGraph の構造だと、親のスケーリングが子に繁栄される。 | |
1226
636dfdc30176
new API for SceneGraph
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1211
diff
changeset
|
1278 void |
1366
ba6c080bf9a4
work scale api.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1351
diff
changeset
|
1279 SceneGraph::scaleIt(float sx, float sy, float sz) |
1226
636dfdc30176
new API for SceneGraph
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1211
diff
changeset
|
1280 { |
1366
ba6c080bf9a4
work scale api.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1351
diff
changeset
|
1281 |
ba6c080bf9a4
work scale api.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1351
diff
changeset
|
1282 float scale[3] = {sx, sy, sz}; |
ba6c080bf9a4
work scale api.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1351
diff
changeset
|
1283 |
ba6c080bf9a4
work scale api.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1351
diff
changeset
|
1284 /* |
ba6c080bf9a4
work scale api.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1351
diff
changeset
|
1285 * | sx*r sx*r sx*r 0 | |
ba6c080bf9a4
work scale api.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1351
diff
changeset
|
1286 * | sy*r sy*r sy*r 0 | |
ba6c080bf9a4
work scale api.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1351
diff
changeset
|
1287 * | sz*r sz*r sz*r 0 | |
ba6c080bf9a4
work scale api.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1351
diff
changeset
|
1288 * | t t t 1 | |
ba6c080bf9a4
work scale api.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1351
diff
changeset
|
1289 */ |
ba6c080bf9a4
work scale api.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1351
diff
changeset
|
1290 |
ba6c080bf9a4
work scale api.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1351
diff
changeset
|
1291 for(int i=0;i<3;i++) { |
ba6c080bf9a4
work scale api.
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
1351
diff
changeset
|
1292 for(int j=0;j<3;j++) { |
1226
636dfdc30176
new API for SceneGraph
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1211
diff
changeset
|
1293 matrix[i*4+j] = matrix[i*4+j]*scale[i]; |
636dfdc30176
new API for SceneGraph
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1211
diff
changeset
|
1294 } |
636dfdc30176
new API for SceneGraph
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1211
diff
changeset
|
1295 } |
539 | 1296 } |
724
6e9e4726113e
Small clean up of Rendering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
653
diff
changeset
|
1297 |
6e9e4726113e
Small clean up of Rendering Engine
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
653
diff
changeset
|
1298 /* end */ |