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;
00115 ps2_giftag* gif;
00116
00117 const unsigned giftag_mask = 0xffffffA7;
00118 unsigned new_effect;
00119
00120 new_effect &= giftag_mask;
00121 new_effect |= effect;
00122
00123
00124
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
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 }