Main Page | Modules | Data Structures | File List | Data Fields | Globals

ps2util_surface.c

Go to the documentation of this file.
00001 
00012 #include <stdlib.h>
00013 #include <stdio.h>
00014 #include "libps2.h"
00015 #include "util_hash.h"
00016 
00017 
00021 #define HASH_SIZE 128
00022 
00023 
00027 static Util_hash* hash_handler;
00028 static FMATRIX ps2util_unitMatrix = {{1, 0, 0, 0},
00029                                      {0, 1, 0, 0},
00030                                      {0, 0, 1, 0},
00031                                      {0, 0, 0, 1}};
00032 
00033 char
00034 ps2util_obj_Init( void ) {
00035 
00036     util_hash_init();
00037     if (!(hash_handler = util_hash_create( HASH_SIZE ))) {
00038         fprintf( stderr, "could not create hash object. \n" );
00039         goto ERR_PS2UTIL_OBJ_INIT;
00040     }
00041 
00042  ERR_PS2UTIL_OBJ_INIT:
00043     fprintf( stderr, "ps2util_obj_Init() failed. \n" );
00044     fflush( stderr );
00045     return -1;
00046 }
00047 
00048 
00049 void
00050 ps2util_obj_Finish( void ) {
00051 
00052     util_hash_destroy( hash_handler );
00053     util_hash_finish();
00054 }
00055 
00056 
00057 OBJECT*
00058 ps2util_obj_Create_fromXML( char* xml ) {
00059 
00060     OBJECT* obj;
00061     OBJECT* new_obj;
00062     void* real_addr;
00063     void* aligned_addr;
00064 
00065     obj = util_hash_ref_data( hash_handler, xml, UTILHASH_INCREMENT_REFCNT );
00066 
00067     if (!obj) {
00068         obj = read_xml_3d_file( xml );
00069         if (!obj) {
00070             goto ERR_PS2UTIL_OBJ_CREATE_FROMXML;
00071         }
00072         util_hash_set_data( hash_handler, xml, obj );
00073         return obj;
00074     }
00075     if (malloc_align16(&real_addr, &aligned_addr, sizeof(OBJECT)) < 0) {
00076         goto ERR_PS2UTIL_OBJ_CREATE_FROMXML;
00077     }
00078     new_obj = aligned_addr;
00079     new_obj->free_me = real_addr;
00080     new_obj->surfaces = obj->surfaces;
00081     new_obj->name = xml;
00082     return new_obj;
00083 
00084  ERR_PS2UTIL_OBJ_CREATE_FROMXML:
00085 
00086     fprintf( stderr, "\
00087 could not memory allocate. at ps2util_obj_Create_fromXML() in ps2util_surface.c.\n" );
00088     return NULL;
00089 }
00090 
00091 
00092 void
00093 ps2util_obj_Free( OBJECT* obj ) {
00094 
00095     OBJECT* ref;
00096     char* obj_name;
00097 
00098     obj_name = obj->name;
00099 
00100     ref = util_hash_ref_data( hash_handler, obj_name, UTILHASH_DECREMENT_REFCNT );
00101     if (!ref) return;
00102 
00103     if (util_hash_get_refCounter( hash_handler, obj_name ) < 1) {
00104         util_hash_remove_data( hash_handler, obj_name );
00105         free_object( ref );
00106     }
00107     free( obj->free_me );
00108 }
00109 
00110 
00111 void
00112 ps2util_obj_Set_effect( OBJECT* obj, unsigned effect ) {
00113 
00114     SURFACE* srf; /* surface work pointer */
00115     ps2_giftag* gif; /* GIFtag work pointer */
00116 
00117     const unsigned giftag_mask = 0xffffffA7;
00118     unsigned new_effect;
00119 
00120     new_effect &= giftag_mask;
00121     new_effect |= effect;
00122 
00123     /*
00124       サーフェースは3D オブジェクトの面のことで単方向リスト構造     */
00125 
00126     for (srf = obj->surfaces; srf != NULL; srf=srf->next) {
00127         gif = &srf->giftag;
00128 
00129         gif->PRIM &= giftag_mask;
00130         gif->PRIM |= effect;
00131     }
00132 }
00133 
00134 
00135 
00136 void
00137 ps2util_obj_Set_texture( OBJECT* obj, TEXTURE* tex ) {
00138 
00139     SURFACE* srf;
00140 
00141     for (srf = obj->surfaces; srf != NULL; srf=srf->next) {
00142         srf->texture = tex;
00143     }
00144 }
00145 
00146 
00147 
00148 void
00149 ps2util_obj_Renew_transMatrix( OBJECT* obj ) {
00150 
00151     FMATRIX work;
00152 
00153     /* 回転行列を生成 */
00154     ps2_vu0_rot_matrix( work, ps2util_unitMatrix, obj->angle );
00155 
00156     /* 並行移動行列を生成 */
00157     ps2_vu0_trans_matrix( work, work, obj->xyz );
00158 
00159     /* 座標変換行列work をobjにコピー */
00160     ps2_vu0_copy_matrix( obj->transfer, work );
00161 }
00162 
00163 
00164 inline void
00165 ps2util_obj_Draw( OBJECT* obj ) {
00166 
00167     libps2dy_obj_draw( obj->surfaces, obj->transfer );
00168 }

Generated on Thu Apr 22 09:46:24 2004 for ps2util by doxygen 1.3.3