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

📄 our_draw16.c

📁 这是一个简单的3d动画mmi,这是模拟器上的
💻 C
📖 第 1 页 / 共 5 页
字号:
            {					
                xinc=0;
            }
            y1=(xe>>(DRAW_T_SHIFT));
            if(y1>=OUR_D_screem_w)
            {
                y1=OUR_D_screem_w-1;
            }
            
            for(;xinc<=y1;)	
            {
                dest[xinc++] =color;
            }					
            dest+=mempitch;			//point to next line
            xs+=ks;					//next line xs
            xe+=ke;					//next line xe
        }		
    }
    return;
}

}
#if 0
void OUR_Draw_Triangle_2D16(	int x1,int y1,
                            int x2,int y2,
                            int x3,int y3,
                            CLR color,
                            UCHAR *dest_buffer, int mempitch)
{
    int xs,xe,ks,ke,xinc;
    int yinc;
    CLR16 *dest;
    color=OUR_RGB32_2_16(color);
    //make sure y1<y2<y3
    if(y1>y2)
    {
        OUR_SWAP(y1,y2,xs);
        OUR_SWAP(x1,x2,xs);
    }
    if(y1>y3)
    {
        OUR_SWAP(y1,y3,xs);
        OUR_SWAP(x1,x3,xs);
    }
    if(y2>y3)
    {
        OUR_SWAP(y2,y3,xs);
        OUR_SWAP(x2,x3,xs);
    }					//18t
    
    //mempitch>>=1;//(sizeof(dest)/2);
    dest = (CLR16*)dest_buffer +y1*mempitch;		//point to the line of y1
    if(y1<y2 )//the top part
    {		
        ks=((x1-x2)<<DRAW_T_SHIFT)/(y1-y2);		//slope 1 --> 2
        ke=((x1-x3)<<DRAW_T_SHIFT)/(y1-y3);		//slope 1 --> 3
        if(ks>ke)						//start slope must be smaller than the end one
        {
            OUR_SWAP(ks,ke,xs);
        }		
        xs=x1<<DRAW_T_SHIFT;
        xe=xs;
        for(yinc=y1;yinc<y2;yinc++)		//scan lines
        {	
#if OUR_FAST_2D		
            y1=(xe>>DRAW_T_SHIFT)-8;xinc=xs>>DRAW_T_SHIFT;
            for(xinc=xs>>DRAW_T_SHIFT;xinc<=y1;)
            {
                dest[xinc++] =color;dest[xinc++] =color;
                dest[xinc++] =color;dest[xinc++] =color;
                dest[xinc++] =color;dest[xinc++] =color;
                dest[xinc++] =color;dest[xinc++] =color;
            }
            
            if(xinc<=y1+4)	
            {
                dest[xinc++] =color;dest[xinc++] =color;
                dest[xinc++] =color;dest[xinc++] =color;
            }	
            y1+=8;
            for(;xinc<=y1;xinc++)
            {
                dest[xinc] =color;
            }	
#else	
            y1=(xe>>DRAW_T_SHIFT);
            for(xinc=xs>>DRAW_T_SHIFT;xinc<=y1;)
            {
                dest[xinc++] =color;
            }
#endif
            dest+=mempitch;			//point to next line
            xs+=ks;					//next line xs
            xe+=ke;					//next line xe
        }		
        if(y2<y3)//the butt part
        {	
            x1=((x2-x3)<<DRAW_T_SHIFT)/(y2-y3);
            if(x1>ke)
            {
                ks=x1;
            }
            else
            {
                ke=x1;
            }
            for(;yinc<=y3;yinc++)
            {			
                //y1=xe>>8;
#if OUR_FAST_2D		
                y1=(xe>>DRAW_T_SHIFT)-8;
                for(xinc=xs>>DRAW_T_SHIFT;xinc<=y1;)
                {
                    dest[xinc++] =color;dest[xinc++] =color;
                    dest[xinc++] =color;dest[xinc++] =color;
                    dest[xinc++] =color;dest[xinc++] =color;
                    dest[xinc++] =color;dest[xinc++] =color;
                }
                
                if(xinc<=y1+4)	
                {
                    dest[xinc++] =color;dest[xinc++] =color;
                    dest[xinc++] =color;dest[xinc++] =color;
                }	
                y1+=8;
                for(;xinc<=y1;xinc++)
                {
                    dest[xinc] =color;
                }	
#else	
                y1=(xe>>DRAW_T_SHIFT);
                for(xinc=xs>>DRAW_T_SHIFT;xinc<=y1;)
                {
                    dest[xinc++] =color;
                }
#endif
                dest+=mempitch;
                xs+=ks;
                xe+=ke;
            }		
            
        }
        return;
    }
    else
    {		
        if(y2<y3)//the butt part
        {	
            ks=((x2-x3)<<DRAW_T_SHIFT)/(y1-y3);
            ke=((x1-x3)<<DRAW_T_SHIFT)/(y1-y3);
            if(ks<ke)
            {
                OUR_SWAP(ks,ke,xs);
            }	
            if(x1<x2)
            {
                xs=x1<<DRAW_T_SHIFT;
                xe=(x2<<DRAW_T_SHIFT);//+(xei>>1);
            }
            else 
            {
                xs=x2<<DRAW_T_SHIFT;
                xe=(x1<<DRAW_T_SHIFT);//+(xei>>1);
                
            }
            for(yinc=y1;yinc<y3;yinc++)
            {			
                //y1=xe>>8;
#if OUR_FAST_2D		
                y1=(xe>>DRAW_T_SHIFT)-8;
                for(xinc=xs>>DRAW_T_SHIFT;xinc<=y1;)
                {
                    dest[xinc++] =color;dest[xinc++] =color;
                    dest[xinc++] =color;dest[xinc++] =color;
                    dest[xinc++] =color;dest[xinc++] =color;
                    dest[xinc++] =color;dest[xinc++] =color;
                }
                
                if(xinc<=y1+4)	
                {
                    dest[xinc++] =color;dest[xinc++] =color;
                    dest[xinc++] =color;dest[xinc++] =color;
                }	
                y1+=8;
                for(;xinc<=y1;xinc++)
                {
                    dest[xinc] =color;
                }	
#else	
                y1=(xe>>DRAW_T_SHIFT);
                for(xinc=xs>>DRAW_T_SHIFT;xinc<=y1;)
                {
                    dest[xinc++] =color;
                }
#endif
                dest+=mempitch;
                xs+=ks;
                xe+=ke;
            }		
        }
        return;
    }
    
}
#endif
//--------------------------------------------------------------------------
//------------------------------------				
#define FILL_POINT	{				\
    dest[xinc] =color;	\
    xinc++;			\
}
//----------------------------------------------------------------------------

#define DRAW_P_SHFT_X 18
#define SHIFR_L 18
#define SHIFT 30
//------------------------------------------------------
#define FILE_GOURAUD	{\
    dest[xinc++] =((k_r_inc>>(SHIFR_L-8))&OUR_RGB_MASK500)+\
    ((k_g_inc>>(SHIFR_L-3))&OUR_RGB_MASK060)+((k_b_inc>>(SHIFR_L+3)));\
    \
    k_r_inc+=kre;\
    k_g_inc+=kge;\
    k_b_inc+=kbe;\
}
//------------------------------------------------------


void OUR_Draw_Gouraud_CLIP_2D16(	int x1,int y1,
                                int x2,int y2,
                                int x3,int y3,
                                CLR color1,
                                CLR color2,
                                CLR color3,
                                UCHAR *dest_buffer, int mempitch)
{
    int xs,xe,ks,ke,xinc;
    int yinc;
    CLR rs,re,gs,ge,bs,be;
    int krs,kre,kgs,kge,kbs,kbe;
    int  k_r_inc;
    int  k_g_inc;
    int  k_b_inc;
    CLR16 *dest;
    /*
    x1=200;
    y1=0;
    x2=1;
    y2=200;
    x3=350;
    y3=350;
    
      
        color1 = 0x000000;
        color2 = 0xff0000;
        color3 = 0x000000;
    */
    //make sure y1<y2<y3
    if(y1>y2)
    {
        OUR_SWAP(y1,y2,xs);
        OUR_SWAP(x1,x2,xs);
        OUR_SWAP(color1,color2,rs);
    }
    if(y1>y3)
    {
        OUR_SWAP(y1,y3,xs);
        OUR_SWAP(x1,x3,xs);
        OUR_SWAP(color1,color3,rs);
    }
    if(y2>y3)
    {
        OUR_SWAP(y2,y3,xs);
        OUR_SWAP(x2,x3,xs);
        OUR_SWAP(color2,color3,rs);
    }								//18t
    
    //mempitch>>=2;					//(sizeof(dest)/2);
    dest = (CLR16*)dest_buffer +y1*mempitch;		//point to the line of y1
#if 1
    if(y1<y2 )						//the top part
    {
        xs=(1<<(DRAW_P_SHFT_X))/(y1-y2);
        xe=(1<<(DRAW_P_SHFT_X))/(y1-y3);	
        ks=((x1-x2))*xs;				//slope 1 --> 2
        ke=((x1-x3))*xe;				//slope 1 --> 3
        xs>>=(DRAW_P_SHFT_X-SHIFR_L);
        xe>>=(DRAW_P_SHFT_X-SHIFR_L);
        if(ks>ke)						//start slope must be smaller than the end one
        {
            kre=(((color1&OUR_RGB_MASK0500)-(color2&OUR_RGB_MASK0500))>>16)*xs;
            krs=(((color1&OUR_RGB_MASK0500)-(color3&OUR_RGB_MASK0500))>>16)*xe;
            
            kge=(((color1&OUR_RGB_MASK0060)-(color2&OUR_RGB_MASK0060))>>8)*xs;
            kgs=(((color1&OUR_RGB_MASK0060)-(color3&OUR_RGB_MASK0060))>>8)*xe;
            
            kbe=(((color1&OUR_RGB_MASK0005)-(color2&OUR_RGB_MASK0005)))*xs;
            kbs=(((color1&OUR_RGB_MASK0005)-(color3&OUR_RGB_MASK0005)))*xe;
            OUR_SWAP(ks,ke,xs);
        }	
        else if(ks<ke)	
        {
            krs=(((color1&OUR_RGB_MASK0500)-(color2&OUR_RGB_MASK0500))>>16)*xs;
            kre=(((color1&OUR_RGB_MASK0500)-(color3&OUR_RGB_MASK0500))>>16)*xe;
            
            kgs=(((color1&OUR_RGB_MASK0060)-(color2&OUR_RGB_MASK0060))>>8)*xs;
            kge=(((color1&OUR_RGB_MASK0060)-(color3&OUR_RGB_MASK0060))>>8)*xe;
            
            kbs=(((color1&OUR_RGB_MASK0005)-(color2&OUR_RGB_MASK0005)))*xs;
            kbe=(((color1&OUR_RGB_MASK0005)-(color3&OUR_RGB_MASK0005)))*xe;
        }
        else
        {
            return;
        }
#define GND_KKKK 0
        if((ke-ks)<(1<<DRAW_P_SHFT_X))
        {      
            xs=((1<<(SHIFT-4)))/((ke-ks));
            kre=(((kre-krs)>>5)*xs)>>(SHIFT-SHIFR_L-5-4);		
            kge=(((kge-kgs)>>5)*xs)>>(SHIFT-SHIFR_L-5-4);		
            kbe=(((kbe-kbs)>>5)*xs)>>(SHIFT-SHIFR_L-5-4);
        }
        else
        {
            xs=((1<<(SHIFT)))/((ke-ks)>>GND_KKKK);
            kre=(((kre-krs)>>5)*xs)>>(SHIFT-SHIFR_L-5+GND_KKKK);		
            kge=(((kge-kgs)>>5)*xs)>>(SHIFT-SHIFR_L-5+GND_KKKK);		
            kbe=(((kbe-kbs)>>5)*xs)>>(SHIFT-SHIFR_L-5+GND_KKKK);
        }/**/
        xs=(x1<<(DRAW_P_SHFT_X));
        xe=(x1<<(DRAW_P_SHFT_X));
        
        rs=(color1&OUR_RGB_MASK0500)<<(SHIFR_L-16);		
        gs=(color1&OUR_RGB_MASK0060)<<(SHIFR_L-8);		
        bs=(color1&OUR_RGB_MASK0005)<<SHIFR_L;

		
        //clip ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
        yinc=y1;
        if(y1<0)
        {
            if(y2>0)
            {
                rs-=y1*krs;			
                gs-=y1*kgs;			
                bs-=y1*kbs;
                
                dest-=y1*mempitch;			//point to next line
                xs-=y1*ks;					//next line xs
                xe-=y1*ke;					//next line xe
                yinc=0;
            }
            else
            {
                y1=y1-y2;
                rs-=y1*krs;			
                gs-=y1*kgs;			
                bs-=y1*kbs;
                
                dest-=y1*mempitch;			//point to next line
                xs-=y1*ks;					//next line xs
                xe-=y1*ke;					//next line xe
                yinc=0;
                goto P3_G;
            }/**/
        }
        if(y2>=OUR_D_screem_h)
        {	
            for(;yinc<OUR_D_screem_h;yinc++)		//scan lines
            {	
                k_r_inc=rs;
                k_g_inc=gs;
                k_b_inc=bs;
                //------------------------------------------------------	
                xinc=xs>>(DRAW_P_SHFT_X);
                if(xinc<0)
                {
                    k_r_inc-=xinc*kre;
                    k_g_inc-=xinc*kge;
                    k_b_inc-=xinc*kbe;
                    xinc=0;
                }
                y1=(xe>>(DRAW_P_SHFT_X));
                if(y1>=OUR_D_screem_w)
                {
                    y1=OUR_D_screem_w-1;
                }
                else if(y1>0)
                {
                    dest[xinc++] =((k_r_inc>>(SHIFR_L-8))&OUR_RGB_MASK500)+\
                        ((k_g_inc>>(SHIFR_L-3))&OUR_RGB_MASK060)+((k_b_inc>>(SHIFR_L+3))&OUR_RGB_MASK005);
                }
                for(;xinc<=y1;)	
                {
                    FILE_GOURAUD;
                }		
                rs+=krs;			
                gs+=kgs;			
                bs+=kbs;
                
                dest+=mempitch;			//point to next line

⌨️ 快捷键说明

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