void aabb_for_area(aabb_t *aabb, vec3_t area_tl, vec3_t area_br, int axis) { aabb_clear(aabb); aabb->extents[axis] = FLT_MAX; aabb_extend_by_point(aabb, area_tl); aabb_extend_by_point(aabb, area_br); }
void CPicoSurface::AccumulateBBox() { int i; picoVec_t *p; aabb_clear(&m_BBox); for (i=0; i<PicoGetSurfaceNumVertexes(m_pSurface); i++) { p=PicoGetSurfaceXYZ(m_pSurface,i); aabb_extend_by_point(&m_BBox, p); } aabb_update_radius(&m_BBox); }
void CSpriteModel::Construct(IShader *pShader) { m_pShader = pShader; aabb_clear(&m_BBox); /* md3Surface_t *pSurface = (md3Surface_t *)(((unsigned char *)pHeader) + pHeader->ofsSurfaces); m_nSurfaces = pHeader->numSurfaces; CMD3Surface* surfaces = new CMD3Surface[m_nSurfaces]; for (int i = 0; i < m_nSurfaces; i++ ) { surfaces[i].Construct(pSurface); pSurface = (md3Surface_t *) ((( char * ) pSurface) + pSurface->ofsEnd); } m_children = surfaces; AccumulateBBox(); */ }
void CEntityMiscModel::UpdateCachedData(){ aabb_t aabb_temp; m4x4_identity( m_transform ); m4x4_pivoted_transform_by_vec3( m_transform, m_translate, m_euler, eXYZ, m_scale, m_pivot ); memcpy( m_inverse_transform, m_transform, sizeof( m4x4_t ) ); m4x4_invert( m_inverse_transform ); aabb_clear( &aabb_temp ); if ( m_model && m_model->pRender ) { aabb_extend_by_aabb( &aabb_temp, m_model->pRender->GetAABB() ); } else{ VectorSet( aabb_temp.extents, 8, 8, 8 ); } aabb_for_transformed_aabb( &m_BBox, &aabb_temp, m_transform ); }
void CPicoModel::load( const char *name, const int frame ){ CPicoSurface *surf; picoSurface_t *pSurface; int i; m_name = new char[strlen( name ) + 1]; strcpy( m_name,name ); m_frame = frame; if ( !( m_pModel = PicoLoadModel( m_name, frame ) ) ) { int len = strlen( m_name ); // Try loading an mdc if md3 fails and vice-versa (fixme: only do this for games with mdc support) if ( !strcmp( m_name + len - 4, ".md3" ) ) { m_name[len - 1] = 'c'; m_pModel = PicoLoadModel( m_name, frame ); } else if ( !strcmp( m_name + len - 4, ".mdc" ) ) { m_name[len - 1] = '3'; m_pModel = PicoLoadModel( m_name, frame ); } } if ( m_pModel ) { m_children = g_ptr_array_new(); aabb_clear( &m_BBox ); for ( i = 0; i < PicoGetModelNumSurfaces( m_pModel ); i++ ) { pSurface = PicoGetModelSurface( m_pModel,i ); surf = new CPicoSurface( pSurface ); g_ptr_array_add( m_children, surf ); aabb_extend_by_aabb( &m_BBox, surf->GetAABB() ); } } else { m_BBox.origin[0] = m_BBox.origin[1] = m_BBox.origin[2] = 0; m_BBox.extents[0] = m_BBox.extents[1] = m_BBox.extents[2] = 0; } m_parents = g_ptr_array_new(); }
void CEntityEclassModel::UpdateCachedData() { aabb_t aabb_temp; aabb_clear(&aabb_temp); m4x4_identity(m_transform); m4x4_pivoted_transform_by_vec3(m_transform, m_translate, m_euler, eXYZ, m_scale, m_pivot); memcpy(m_inverse_transform, m_transform, sizeof(m4x4_t)); if(m4x4_invert(m_inverse_transform) == 1) { Sys_Printf("ERROR: Singular Matrix, cannot invert"); } if(m_eclass) aabb_construct_for_vec3(&aabb_temp, m_eclass->mins, m_eclass->maxs); else VectorSet(aabb_temp.extents, 8, 8, 8); aabb_for_transformed_aabb(&m_BBox, &aabb_temp, m_transform); }
void CPicoModel::Reload( void ){ CPicoSurface *surf; picoSurface_t *pSurface; int i; unsigned int j; // Get rid of the old model if ( m_pModel ) { for ( j = 0; j < m_children->len; j++ ) { ( (CPicoSurface*)m_children->pdata[j] )->DecRef(); g_ptr_array_remove_index_fast( m_children, j ); } } // And reload it m_pModel = PicoLoadModel( m_name, m_frame ); if ( m_pModel ) { m_children = g_ptr_array_new(); aabb_clear( &m_BBox ); for ( i = 0; i < PicoGetModelNumSurfaces( m_pModel ); i++ ) { pSurface = PicoGetModelSurface( m_pModel,i ); surf = new CPicoSurface( pSurface ); g_ptr_array_add( m_children, surf ); aabb_extend_by_aabb( &m_BBox, surf->GetAABB() ); } } else { m_BBox.origin[0] = m_BBox.origin[1] = m_BBox.origin[2] = 0; m_BBox.extents[0] = m_BBox.extents[1] = m_BBox.extents[2] = 0; } for ( j = 0; j < m_parents->len; j++ ) { ( (CPicoParent*)m_parents->pdata[j] )->UpdateShaders(); } }
void aabb_for_transformed_aabb(aabb_t* dst, const aabb_t* src, const m4x4_t transform) { if(src->extents[0] < 0 || src->extents[1] < 0 || src->extents[2] < 0) { aabb_clear(dst); return; } VectorCopy(src->origin, dst->origin); m4x4_transform_point(transform, dst->origin); dst->extents[0] = (vec_t)(fabs(transform[0] * src->extents[0]) + fabs(transform[4] * src->extents[1]) + fabs(transform[8] * src->extents[2])); dst->extents[1] = (vec_t)(fabs(transform[1] * src->extents[0]) + fabs(transform[5] * src->extents[1]) + fabs(transform[9] * src->extents[2])); dst->extents[2] = (vec_t)(fabs(transform[2] * src->extents[0]) + fabs(transform[6] * src->extents[1]) + fabs(transform[10] * src->extents[2])); }