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

📄 our_draw16.c

📁 这是一个简单的3d动画mmi,这是模拟器上的
💻 C
📖 第 1 页 / 共 5 页
字号:
                xs+=ks;					//next line xs
                xe+=ke;					//next line xe
            }
            return;
        }
        for(;yinc<y2;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
            xs+=ks;					//next line xs
            xe+=ke;					//next line xe
        }
P3_G:
        if(y2<y3)						//the butt part
        {	
            y1=(1<<(DRAW_P_SHFT_X))/(y2-y3);
            x1=((x2-x3))*y1;
            y1>>=(DRAW_P_SHFT_X-SHIFR_L);
            if(x1>ke)
            {
                ks=x1;
                
                krs=(((color2&OUR_RGB_MASK0500)-(color3&OUR_RGB_MASK0500))>>16)*y1;			
                kgs=(((color2&OUR_RGB_MASK0060)-(color3&OUR_RGB_MASK0060))>>8)*y1;				
                kbs=(((color2&OUR_RGB_MASK0005)-(color3&OUR_RGB_MASK0005)))*y1;
            }
            else
            {
                ke=x1;
            }
            if(y2<0)
            {
                rs-=y2*krs;			
                gs-=y2*kgs;			
                bs-=y2*kbs;
                
                dest-=y2*mempitch;			//point to next line
                xs-=y2*ks;					//next line xs
                xe-=y2*ke;					//next line xe
                
            }/**/
            if(y3>OUR_D_screem_h-1)
            {
                y3=OUR_D_screem_h-1;
            }
            for(;yinc<=y3;yinc++)
            {			
                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
                xs+=ks;					//next line xs
                xe+=ke;					//next line xe
            }		
            
        }
        return;
}
#else

#endif
//---------------------------------------------------------------------
else if(y2<y3)//the butt part
{		
    
    xs=((1<<SHIFR_L))/(y1-y3);	//y1=y2
    ks=((x1-x3))*xs;				//slope 1 --> 2
    ke=((x2-x3))*xs;				//slope 1 --> 3
    if(ks>ke)						//start slope must be smaller than the end one
    {
        xe=((1<<SHIFR_L))/(x2-x1);	
        krs=(((color1&OUR_RGB_MASK0500)-(color3&OUR_RGB_MASK0500))>>16)*xs;
        kre=(((color2&OUR_RGB_MASK0500)-(color1&OUR_RGB_MASK0500))>>16)*xe;
        
        kgs=(((color1&OUR_RGB_MASK0060)-(color3&OUR_RGB_MASK0060))>>8)*xs;
        kge=(((color2&OUR_RGB_MASK0060)-(color1&OUR_RGB_MASK0060))>>8)*xe;
        
        kbs=(((color1&OUR_RGB_MASK0005)-(color3&OUR_RGB_MASK0005)))*xs;
        kbe=(((color2&OUR_RGB_MASK0005)-(color1&OUR_RGB_MASK0005)))*xe;
        
        rs=(color1&OUR_RGB_MASK0500)<<(SHIFR_L-16);			
        gs=(color1&OUR_RGB_MASK0060)<<(SHIFR_L-8);			
        bs=(color1&OUR_RGB_MASK0005)<<SHIFR_L;
        
        xs=x1<<SHIFR_L;
        xe=x2<<SHIFR_L;
    }	
    else if(ks<ke)	
    {
        xe=((1<<SHIFR_L))/(x1-x2);	
        krs=(((color2&OUR_RGB_MASK0500)-(color3&OUR_RGB_MASK0500))>>16)*xs;
        kre=(((color1&OUR_RGB_MASK0500)-(color2&OUR_RGB_MASK0500))>>16)*xe;
        
        kgs=(((color2&OUR_RGB_MASK0060)-(color3&OUR_RGB_MASK0060))>>8)*xs;
        kge=(((color1&OUR_RGB_MASK0060)-(color2&OUR_RGB_MASK0060))>>8)*xe;
        
        kbs=(((color2&OUR_RGB_MASK0005)-(color3&OUR_RGB_MASK0005)))*xs;
        kbe=(((color1&OUR_RGB_MASK0005)-(color2&OUR_RGB_MASK0005)))*xe;
        
        OUR_SWAP(ks,ke,xs);			
        
        rs=(color2&OUR_RGB_MASK0500)<<(SHIFR_L-16);			
        gs=(color2&OUR_RGB_MASK0060)<<(SHIFR_L-8);			
        bs=(color2&OUR_RGB_MASK0005)<<SHIFR_L;
        
        xe=x1<<SHIFR_L;
        xs=x2<<SHIFR_L;
    }
    else
    {
        return;
    }	
    //clip
    if(y1<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
        y1=0;
    }
    if(y3>=OUR_D_screem_h)	
    {
        y3=OUR_D_screem_h;
    }
    for(yinc=y1;yinc<y3;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
        xs+=ks;					//next line xs
        xe+=ke;	
    }		
    return;
}

}

//------------------------------------------------------

#if 0
void OUR_Draw_Gouraud_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;
        for(yinc=y1;yinc<y2;yinc++)		//scan lines
        {	
            k_r_inc=rs;
            k_g_inc=gs;
            k_b_inc=bs;
            //------------------------------------------------------	
            xinc=xs>>(DRAW_P_SHFT_X);
            y1=(xe>>(DRAW_P_SHFT_X));
            //dest[xinc++] =((k_r_inc>>(SHIFR_L-16))&OUR_RGB_MASK0800)+\
            //	((k_g_inc>>(SHIFR_L-8))&OUR_RGB_MASK0080)+((k_b_inc>>SHIFR_L)&OUR_RGB_MASK0008);
            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);
#if OUR_FAST_2D
            for(;xinc<=y1-8;)	
            {
                FILE_GOURAUD;FILE_GOURAUD;FILE_GOURAUD;FILE_GOURAUD;
                FILE_GOURAUD;FILE_GOURAUD;FILE_GOURAUD;FILE_GOURAUD;
            }	
            
            if(xinc<=y1-4)	
            {
                FILE_GOURAUD;FILE_GOURAUD;FILE_GOURAUD;FILE_GOURAUD;
            }	
            for(;xinc<=y1;)	
            {
                FILE_GOURAUD;
            }	
#else
            for(;xinc<=y1;)	
            {
                FILE_GOURAUD;
            }	
#endif
            rs+=krs;			
            gs+=kgs;			
            bs+=kbs;
            
            dest+=mempitch;			//point to next line
            xs+=ks;					//next line xs
            xe+=ke;					//next line xe
        }
        if(y2<y3)						//the butt part
        {	
            y1=(1<<(DRAW_P_SHFT_X))/(y2-y3);
            x1=((x2-x3))*y1;
            y1>>=(DRAW_P_SHFT_X-SHIFR_L);
            if(x1>ke)
            {
                ks=x1;
                
                krs=(((color2&OUR_RGB_MASK0500)-(color3&OUR_RGB_MASK0500))>>16)*y1;			
                kgs=(((color2&OUR_RGB_MASK0060)-(color3&OUR_RGB_MASK0060))>>8)*y1;				
                kbs=(((color2&OUR_RGB_MASK0005)-(color3&OUR_RGB_MASK0005)))*y1;
            }
            else
            {
                ke=x1;
            }
            for(;yinc<=y3;yinc++)
            {			
                k_r_inc=rs;
                k_g_inc=gs;
                k_b_inc=bs;
                //------------------------------------------------------
                xinc=xs>>(DRAW_P_SHFT_X);

⌨️ 快捷键说明

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