⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 our_math.c

📁 MTK上3D特效的一些开源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/**************************************************************************
Copyright (C) jianbo miao Corporation.  All Rights Released.
this is a 3d engin named our_3d_engin.
our_3d_engin feature:
1:there is no float.
2:it do the 3d things all by softwear.
3:base on 1 and 2 , it can execution on arm which have no 3d hardwear accelerate.

if you have any  suggestion or question,pls contact with me
mail:miaojb@126.com
msn:miaojianbo@hotmail.com
qq:30209027

2008/01/01
***************************************************************************/
#include "our_math.h"
#include "our_3d.h"
#include "math.h"

//FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
//FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
unsigned short sin_cos_look[PI2_MY/4+1];
unsigned short reciprocal_look[256];
//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
/*
const short sin_cos_look[PI2_MY/4+1]=
{
	0,402,804,1206,1607,2009,2410,811,3211,3611,4011,4409,
	4808,5205,5602,5997,6392,6786,7179,7571,7961,8351,8739,
	9126,9512,9896,10278,10659,11039,11416,11793,12167,12539,
	12910,13278,13645,14010,14372,14732,15090,15446,15800,16151,
	16499,16846,17189,17530,17869,18204,18537,18868,19195,19519,
	19841,20159,20475,20787,21097,21403,21706,22005,22301,22594,
	22884,23170,23453,23732,24007,24279,24547,24812,25073,25330,
	25583,25832,26077,26319,26557,26790,27020,27245,27466,27684,
	27897,28106,28310,28511,28707,28898,29086,29269,29447,29621,
	29791,29956,30117,30273,30425,30572,30714,30852,30985,31114,
	31237,31357,31471,31581,31685,31785,31881,31971,32057,32138,	
	32214,32285,32351,32413,32469,32521,32568,32610,32647,32679,
	32706,32728,32745,32758,32768
};*/
//*********************************************************************
//准备sin_cos_look数组,给sin cos用
//参数1: 
//return: 
//*********************************************************************
void OUR_Build_Sin_Cos_Tables(void)
{
    /**/
	sint32 ang;
	for (ang = 0; ang <= PI2_MY/4; ang++)
    	{    
	    	double theta = (double)ang*PI*2/PI2_MY;					// convert ang to radians
	    	sin_cos_look[ang] = (int)((sin(theta))*(0x1<<(FIXP15_SHIFT+5))+(0x1<<(4)))>>5; 		// insert next entry into table
    		//sin_cos_look[ang] = sin(theta)*(0x1<<FIXP15_SHIFT); 
		}
}
//*********************************************************************
//求sin的函数,在OUR_Build_Sin_Cos_Tables之后使用
//参数1: 要求的sin的度数值 没有限制 ( 512为360度)
//return:sin值
//*********************************************************************
FIXP16 OUR_Fast_Sin(FIXP16 theta)		//30t
 { 	
	uint32 ang;
	ang=theta+0x80000000;					//加上2PI的倍数 使得负数变成正数
	ang=ang&(~0xfffffe00);					//只取2PI以内的数
	
	if(ang<0x80)
		return (sin_cos_look[ang]);
	else if(ang<0x100)
		return (sin_cos_look[0x100-ang]);
	else if(ang<0x180)
		return -(sin_cos_look[ang-0x100]);
	else if(ang<0x200)
		return -(sin_cos_look[0x200-ang]);		/**/
}
//*********************************************************************
//求cos的函数,在OUR_Build_Sin_Cos_Tables之后使用
//参数1: 要求的cos的度数值 没有限制 ( 512为360度)
//return:cos值
//*********************************************************************
FIXP16 OUR_Fast_Cos(FIXP16 theta)		//30t
{
	uint32 ang;
	ang=theta&(~0xfffffe00);					//只取2PI以内的数
	
	if(ang<0x80)
		return (sin_cos_look[0x80-ang]);		//10t
	else if(ang<0x100)
		return -(sin_cos_look[ang-0x80]);		//15t
	else if(ang<0x180)
		return -(sin_cos_look[0x180-ang]);		//20t
	else if(ang<0x200)
		return (sin_cos_look[ang-0x180]);		/**///25t
}
//*********************************************************************
//准备reciprocal_look数组,给OUR_Fast_reciprocal用
//参数1: 
//return: 
//*********************************************************************
void OUR_Build_reciprocal_look(void)
{
  	sint32 ang;
	for (ang = 1; ang < 16; ang++)
	    { 
	    reciprocal_look[ang] = (0x1<<16)/ang; 	// insert next entry into table
	    } 
	for (; ang < 256; ang++)
	    { 
	    reciprocal_look[ang] = (0x1<<20)/ang; 	// insert next entry into table
	    } 

}
//*********************************************************************
//求倒数
//参数1:
//return: (0x1<<20)/theta

//注意:使用这个函数时要>>20,所以出去之后乘以的值不能太大
//就是说,除以后的值是小于2000的话是肯定正确的
//如果估计大于2000,就在外面先>>5再乘.
//*********************************************************************
uint32 OUR_Fast_reciprocal(FIXP16 theta)//36t    20bits for reciprocal
{
	
	if(!theta)
		return 0xffffffff;		
	else if(theta<0x10)
		return reciprocal_look[theta]<<4;		//10t
	else if(theta<0x100)
		return reciprocal_look[theta];			//15t
	else if(theta<0x1000)
	{
		if(theta<0x200)
			{
			return reciprocal_look[theta>>1]>>1;//25t
			}
		else if(theta<0x400)
			{
			return reciprocal_look[theta>>2]>>2;//30t
			}
		else if(theta<0x800)
			{
			return reciprocal_look[theta>>3]>>3;//35t
			}
		else
			{
			return reciprocal_look[theta>>4]>>4;//40t
			}
	}
	else if(theta<0x10000)
	{
		if(theta<0x2000)
			{
			return reciprocal_look[theta>>5]>>5;//30t
			}
		else if(theta<0x4000)
			{
			return reciprocal_look[theta>>6]>>6;//35t
			}
		else if(theta<0x8000)
			{
			return reciprocal_look[theta>>7]>>7;//40t
			}
		else 
			{
			return reciprocal_look[theta>>8]>>8;//45t
			}
	}
	else if(theta<0x100000)
	{
		if(theta<0x20000)
			{
			return reciprocal_look[theta>>9]>>9;//35
			}
		else if(theta<0x40000)
			{
			return reciprocal_look[theta>>10]>>10;//40
			}
		else if(theta<0x80000)
			{
			return reciprocal_look[theta>>11]>>11;//45
			}
		else 
			{
			return reciprocal_look[theta>>12]>>12;//50
			}
	}
	return 0;
}
uint32 OUR_Fast_division(FIXP16 y,FIXP16 x)
{
	if(y<(0x01<<12))									//10t
	{
		return (y*OUR_Fast_reciprocal(x))>>20;			//45t
	}
	else if(y<(0x01<<20))								//15t			
	{
		if(x<(0x01<<4))
			return (y*(OUR_Fast_reciprocal(x)>>8))>>12;	//50t
		else if(x<(0x01<<8))
			return (y*(OUR_Fast_reciprocal(x)>>4))>>16;	//55t
		else
			return (y*OUR_Fast_reciprocal(x))>>20;		//60t
	}
	
	else if(y<(0x01<<26))								//20t
	{
		if(x<(0x01<<4))
			return ((y>>6)*(OUR_Fast_reciprocal(x)>>8))>>6;//55t
		
		else if(x<(0x01<<8))
			return ((y>>6)*(OUR_Fast_reciprocal(x)>>4))>>10;//60t
		
		else if(x<(0x01<<12))
			return ((y>>6)*OUR_Fast_reciprocal(x))>>14;		//65t
		
		else if(x<(0x01<<16))
			return ((y>>6)*OUR_Fast_reciprocal(x>>4))>>18;	//70t
		else 
			return ((y>>6)*OUR_Fast_reciprocal(x>>8))>>22;	//75t
	}
	else												//25t
	{
		if(x<(0x01<<4))
			return ((y>>12)*(OUR_Fast_reciprocal(x)>>8));	//60t
		
		else if(x<(0x01<<8))
			return ((y>>12)*(OUR_Fast_reciprocal(x)>>4))>>4;//65t
		
		else if(x<(0x01<<12))
			return ((y>>12)*OUR_Fast_reciprocal(x))>>8;		
		
		else if(x<(0x01<<16))
			return ((y>>12)*OUR_Fast_reciprocal(x>>4))>>12;
		
		else //if(x<(0x01<<12))
			return ((y>>12)*OUR_Fast_reciprocal(x>>8))>>16;	//80t
	}
	return 0;
}
//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM

//*********************************************************************
//P1=P0 x M
//参数1: 
//return:

//注意:	va的所有值绝对值<0x8000=32768
//		mb的所有值绝对值<0x8000
//*********************************************************************
void OUR_FIX_Mat_Mul_VECTOR3D_3X3(	FIX_VECTOR3D_PTR  	va, 		//100t
											FIX_MATRIX_3X3_PTR 	mb,
											FIX_VECTOR3D_PTR  	vprod)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -