Example #1
0
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);
}
Example #2
0
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);
}
Example #3
0
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 );
}
Example #5
0
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();
}
Example #6
0
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);
}
Example #7
0
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();
	}
}
Example #8
0
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]));
}