void ARXDRAW_DrawPolyBoom(LPDIRECT3DDEVICE7 pd3dDevice) { D3DTLVERTEX ltv[4]; long i,k; float tt; SetZBias(pd3dDevice,8); GDevice->SetRenderState(D3DRENDERSTATE_FOGCOLOR,0); unsigned long tim = ARXTimeUL(); SETALPHABLEND(pd3dDevice,TRUE); for ( i = 0 ; i < MAX_POLYBOOM ; i++ ) { if ( polyboom[i].exist ) { if ( polyboom[i].type & 128 ) { if (polyboom[i].timecreation - FrameDiff > 0) { float fCalc = polyboom[i].timecreation - FrameDiff; ARX_CHECK_ULONG( fCalc ); polyboom[i].timecreation = ARX_CLEAN_WARN_CAST_ULONG( fCalc ); } if (polyboom[i].timecreation - FrameDiff > 0) { float fCalc = polyboom[i].timecreation - FrameDiff; ARX_CHECK_ULONG( fCalc ); polyboom[i].timecreation = ARX_CLEAN_WARN_CAST_ULONG( fCalc ); } } float t = (float)polyboom[i].timecreation + (float)polyboom[i].tolive - (float)tim; if ( t <= 0 ) { polyboom[i].exist=0; BoomCount--; continue; } if (Project.hide & HIDE_BACKGROUND) continue; else { long typp = polyboom[i].type; typp &= ~128; switch (typp) { case 0: tt = (float)t / (float)polyboom[i].tolive * 0.8f; IncrementPolyWithNormalOutput(polyboom[i].ep,2.f,ltv); EE_RT2(<v[0],<v[0]); EE_RT2(<v[1],<v[1]); EE_RT2(<v[2],<v[2]); for (k=0;k<polyboom[i].nbvert;k++) { ltv[k].tu=polyboom[i].u[k]; ltv[k].tv=polyboom[i].v[k]; if (Project.improve) ltv[k].color=EERIERGB(tt*DIV2,0.f,0.f); else ltv[k].color=_EERIERGB(tt); ltv[k].specular=0xFF000000; } if (Project.improve) { SETBLENDMODE(pd3dDevice,D3DBLEND_ONE,D3DBLEND_ONE); } else { SETBLENDMODE(pd3dDevice,D3DBLEND_ZERO,D3DBLEND_INVSRCCOLOR); } SETTC(pd3dDevice,Boom); ARX_DrawPrimitive_SoftClippZ( <v[0], <v[1], <v[2]); if(polyboom[i].nbvert&4) { EE_RT2(<v[3],<v[3]); ARX_DrawPrimitive_SoftClippZ( <v[1], <v[2], <v[3]); } break; case 1: // Blood { float div=1.f/(float)polyboom[i].tolive; tt=(float)t*div; float tr = tt * 2 - 0.5f; if (tr<1.f) tr=1.f; D3DCOLOR col=EERIERGB(polyboom[i].rgb.r*tt,polyboom[i].rgb.g*tt,polyboom[i].rgb.b*tt); for (k=0;k<polyboom[i].nbvert;k++) { ltv[k].tu=(polyboom[i].u[k]-0.5f)*(tr)+0.5f; ltv[k].tv=(polyboom[i].v[k]-0.5f)*(tr)+0.5f; ltv[k].color=col; ltv[k].specular=0xFF000000; } IncrementPolyWithNormalOutput(polyboom[i].ep,2.f,ltv); EE_RT2(<v[0],<v[0]); EE_RT2(<v[1],<v[1]); EE_RT2(<v[2],<v[2]); if(polyboom[i].nbvert&4) { EE_RT2(<v[3],<v[3]); } { SETTEXTUREWRAPMODE(pd3dDevice,D3DTADDRESS_CLAMP); SETBLENDMODE(pd3dDevice,D3DBLEND_ONE,D3DBLEND_ONE); SETTC(pd3dDevice, polyboom[i].tc); ARX_DrawPrimitive_SoftClippZ( <v[0], <v[1], <v[2]); if(polyboom[i].nbvert&4) { ARX_DrawPrimitive_SoftClippZ( <v[1], <v[2], <v[3]); } col=_EERIERGB(tt); ltv[0].color=ltv[1].color=ltv[2].color=ltv[3].color=col; SETBLENDMODE(pd3dDevice,D3DBLEND_ZERO,D3DBLEND_INVSRCCOLOR); ARX_DrawPrimitive_SoftClippZ( <v[0], <v[1], <v[2]); if(polyboom[i].nbvert&4) { ARX_DrawPrimitive_SoftClippZ( <v[1], <v[2], <v[3]); } SETTEXTUREWRAPMODE(pd3dDevice,D3DTADDRESS_WRAP); } } break; case 2: // WATER { float div=1.f/(float)polyboom[i].tolive; tt=(float)t*div; float tr = (tt * 2 - 0.5f); if (tr<1.f) tr=1.f; float ttt=tt*0.5f; D3DCOLOR col=EERIERGB( polyboom[i].rgb.r*ttt, polyboom[i].rgb.g*ttt, polyboom[i].rgb.b*ttt); for (k=0;k<polyboom[i].nbvert;k++) { ltv[k].tu=(polyboom[i].u[k]-0.5f)*(tr)+0.5f; ltv[k].tv=(polyboom[i].v[k]-0.5f)*(tr)+0.5f; ltv[k].color=col; ltv[k].specular=0xFF000000; } if ( (ltv[0].tu<0.f) && (ltv[1].tu<0.f) && (ltv[2].tu<0.f) && (ltv[3].tu<0.f) ) break; if ( (ltv[0].tv<0.f) && (ltv[1].tv<0.f) && (ltv[2].tv<0.f) && (ltv[3].tv<0.f) ) break; if ( (ltv[0].tu>1.f) && (ltv[1].tu>1.f) && (ltv[2].tu>1.f) && (ltv[3].tu>1.f) ) break; if ( (ltv[0].tv>1.f) && (ltv[1].tv>1.f) && (ltv[2].tv>1.f) && (ltv[3].tv>1.f) ) break; IncrementPolyWithNormalOutput(polyboom[i].ep,2.f,ltv); EE_RT2(<v[0],<v[0]); EE_RT2(<v[1],<v[1]); EE_RT2(<v[2],<v[2]); SETTEXTUREWRAPMODE(pd3dDevice,D3DTADDRESS_CLAMP); SETBLENDMODE(pd3dDevice,D3DBLEND_INVDESTCOLOR,D3DBLEND_ONE); SETTC(pd3dDevice, polyboom[i].tc); ARX_DrawPrimitive_SoftClippZ( <v[0], <v[1], <v[2]); if(polyboom[i].nbvert&4) { EE_RT2(<v[3],<v[3]); ARX_DrawPrimitive_SoftClippZ( <v[1], <v[2], <v[3]); } SETTEXTUREWRAPMODE(pd3dDevice, D3DTADDRESS_WRAP); } break; } } } } SetZBias(pd3dDevice,0); GDevice->SetRenderState(D3DRENDERSTATE_FOGCOLOR,ulBKGColor); }
void ARXDRAW_DrawPolyBoom() { ARX_PROFILE_FUNC(); TexturedVertex ltv[4]; GRenderer->SetFogColor(Color::none); // TODO: not handled by RenderMaterial unsigned long tim = (unsigned long)(arxtime); RenderMaterial mat = RenderMaterial::getCurrent(); mat.setDepthBias(8); mat.setLayer(RenderMaterial::Decal); std::vector<POLYBOOM>::iterator pb = polyboom.begin(); while (pb != polyboom.end()) { if(pb->type & 128) { if(pb->timecreation - framedelay > 0) { float fCalc = pb->timecreation - framedelay; pb->timecreation = checked_range_cast<unsigned long>(fCalc); } if(pb->timecreation - framedelay > 0) { float fCalc = pb->timecreation - framedelay; pb->timecreation = checked_range_cast<unsigned long>(fCalc); } } float t = (float)pb->timecreation + (float)pb->tolive - (float)tim; if(t <= 0) { pb = polyboom.erase(pb); continue; } long typp = pb->type; typp &= ~128; switch(typp) { case 0: { float tt = t / (float)pb->tolive * 0.8f; IncrementPolyWithNormalOutput(pb->ep,ltv); for(long k = 0; k < pb->nbvert; k++) { ltv[k].p = EE_RT(ltv[k].p); ltv[k].uv.x=pb->u[k]; ltv[k].uv.y=pb->v[k]; ltv[k].color = (player.m_improve ? (Color3f::red * (tt*.5f)) : Color3f::gray(tt)).toRGB(); } if(player.m_improve) { mat.setBlendType(RenderMaterial::Additive); } else { mat.setBlendType(RenderMaterial::Subtractive); } mat.setTexture(Boom); drawTriangle(mat, <v[0]); if(pb->nbvert & 4) { drawTriangle(mat, <v[1]); } break; } case 1: { // Blood float div = 1.f / (float)pb->tolive; float tt = t * div; float tr = std::max(1.f, tt * 2 - 0.5f); ColorRGBA col = (pb->rgb * tt).toRGB(glm::clamp(tt * 1.5f, 0.f, 1.f) * 255); IncrementPolyWithNormalOutput(pb->ep, ltv); for(long k = 0; k < pb->nbvert; k++) { ltv[k].p = EE_RT(ltv[k].p); ltv[k].uv.x=(pb->u[k]-0.5f)*(tr)+0.5f; ltv[k].uv.y=(pb->v[k]-0.5f)*(tr)+0.5f; ltv[k].color = col; } mat.setWrapMode(TextureStage::WrapClamp); mat.setBlendType(RenderMaterial::Subtractive2); mat.setTexture(pb->tc); drawTriangle(mat, <v[0]); if(pb->nbvert & 4) { drawTriangle(mat, <v[1]); } break; } case 2: { // Water float div = 1.f / (float)pb->tolive; float tt = t * div; float tr = std::max(1.f, tt * 2 - 0.5f); float ttt = tt * 0.5f; ColorRGBA col = (pb->rgb * ttt).toRGB(); IncrementPolyWithNormalOutput(pb->ep,ltv); for(long k = 0; k < pb->nbvert; k++) { ltv[k].p = EE_RT(ltv[k].p); ltv[k].uv.x=(pb->u[k]-0.5f)*(tr)+0.5f; ltv[k].uv.y=(pb->v[k]-0.5f)*(tr)+0.5f; ltv[k].color=col; } if ( (ltv[0].uv.x<0.f) && (ltv[1].uv.x<0.f) && (ltv[2].uv.x<0.f) && (ltv[3].uv.x<0.f) ) break; if ( (ltv[0].uv.y<0.f) && (ltv[1].uv.y<0.f) && (ltv[2].uv.y<0.f) && (ltv[3].uv.y<0.f) ) break; if ( (ltv[0].uv.x>1.f) && (ltv[1].uv.x>1.f) && (ltv[2].uv.x>1.f) && (ltv[3].uv.x>1.f) ) break; if ( (ltv[0].uv.y>1.f) && (ltv[1].uv.y>1.f) && (ltv[2].uv.y>1.f) && (ltv[3].uv.y>1.f) ) break; mat.setWrapMode(TextureStage::WrapClamp); mat.setBlendType(RenderMaterial::Screen); mat.setTexture(pb->tc); drawTriangle(mat, <v[0]); if(pb->nbvert & 4) { drawTriangle(mat, <v[1]); } break; } } ++pb; } GRenderer->SetFogColor(ulBKGColor); }
void ARXDRAW_DrawPolyBoom() { TexturedVertex ltv[4]; SetZBias(8); GRenderer->SetFogColor(Color::none); unsigned long tim = (unsigned long)(arxtime); GRenderer->SetRenderState(Renderer::AlphaBlending, true); std::vector<POLYBOOM>::iterator pb = polyboom.begin(); while (pb != polyboom.end()) { if(pb->type & 128) { if(pb->timecreation - framedelay > 0) { float fCalc = pb->timecreation - framedelay; pb->timecreation = checked_range_cast<unsigned long>(fCalc); } if(pb->timecreation - framedelay > 0) { float fCalc = pb->timecreation - framedelay; pb->timecreation = checked_range_cast<unsigned long>(fCalc); } } float t = (float)pb->timecreation + (float)pb->tolive - (float)tim; if(t <= 0) { pb = polyboom.erase(pb); continue; } long typp = pb->type; typp &= ~128; switch(typp) { case 0: { float tt = t / (float)pb->tolive * 0.8f; IncrementPolyWithNormalOutput(pb->ep,ltv); EE_RT2(<v[0],<v[0]); EE_RT2(<v[1],<v[1]); EE_RT2(<v[2],<v[2]); for(long k = 0; k < pb->nbvert; k++) { ltv[k].uv.x=pb->u[k]; ltv[k].uv.y=pb->v[k]; ltv[k].color = (Project.improve ? (Color3f::red * (tt*.5f)) : Color3f::gray(tt)).toBGR(); ltv[k].specular = Color::black.toBGR(); } if(Project.improve) { GRenderer->SetBlendFunc(Renderer::BlendOne, Renderer::BlendOne); } else { GRenderer->SetBlendFunc(Renderer::BlendZero, Renderer::BlendInvSrcColor); } GRenderer->SetTexture(0, Boom); ARX_DrawPrimitive(<v[0], <v[1], <v[2]); if(pb->nbvert & 4) { EE_RT2(<v[3],<v[3]); ARX_DrawPrimitive(<v[1], <v[2], <v[3]); } } break; case 1: // Blood { float div=1.f/(float)pb->tolive; float tt=(float)t*div; float tr = tt * 2 - 0.5f; if(tr < 1.f) tr = 1.f; ColorBGRA col = (pb->rgb * tt).toBGR(); for(long k = 0; k < pb->nbvert; k++) { ltv[k].uv.x=(pb->u[k]-0.5f)*(tr)+0.5f; ltv[k].uv.y=(pb->v[k]-0.5f)*(tr)+0.5f; ltv[k].color=col; ltv[k].specular=0xFF000000; } IncrementPolyWithNormalOutput(pb->ep,ltv); EE_RT2(<v[0],<v[0]); EE_RT2(<v[1],<v[1]); EE_RT2(<v[2],<v[2]); if(pb->nbvert & 4) { EE_RT2(<v[3],<v[3]); } GRenderer->GetTextureStage(0)->SetWrapMode(TextureStage::WrapClamp); GRenderer->SetBlendFunc(Renderer::BlendOne, Renderer::BlendOne); GRenderer->SetTexture(0, pb->tc); ARX_DrawPrimitive(<v[0], <v[1], <v[2]); if(pb->nbvert & 4) { ARX_DrawPrimitive(<v[1], <v[2], <v[3]); } ltv[0].color = ltv[1].color = ltv[2].color = ltv[3].color = Color::gray(tt).toBGR(); GRenderer->SetBlendFunc(Renderer::BlendZero, Renderer::BlendInvSrcColor); ARX_DrawPrimitive(<v[0], <v[1], <v[2]); if(pb->nbvert & 4) { ARX_DrawPrimitive(<v[1], <v[2], <v[3]); } GRenderer->GetTextureStage(0)->SetWrapMode(TextureStage::WrapRepeat); } break; case 2: // WATER { float div=1.f/(float)pb->tolive; float tt=(float)t*div; float tr = (tt * 2 - 0.5f); if (tr<1.f) tr=1.f; float ttt=tt*0.5f; ColorBGRA col = (pb->rgb * ttt).toBGR(); for(long k = 0; k < pb->nbvert; k++) { ltv[k].uv.x=(pb->u[k]-0.5f)*(tr)+0.5f; ltv[k].uv.y=(pb->v[k]-0.5f)*(tr)+0.5f; ltv[k].color=col; ltv[k].specular=0xFF000000; } if ( (ltv[0].uv.x<0.f) && (ltv[1].uv.x<0.f) && (ltv[2].uv.x<0.f) && (ltv[3].uv.x<0.f) ) break; if ( (ltv[0].uv.y<0.f) && (ltv[1].uv.y<0.f) && (ltv[2].uv.y<0.f) && (ltv[3].uv.y<0.f) ) break; if ( (ltv[0].uv.x>1.f) && (ltv[1].uv.x>1.f) && (ltv[2].uv.x>1.f) && (ltv[3].uv.x>1.f) ) break; if ( (ltv[0].uv.y>1.f) && (ltv[1].uv.y>1.f) && (ltv[2].uv.y>1.f) && (ltv[3].uv.y>1.f) ) break; IncrementPolyWithNormalOutput(pb->ep,ltv); EE_RT2(<v[0],<v[0]); EE_RT2(<v[1],<v[1]); EE_RT2(<v[2],<v[2]); GRenderer->GetTextureStage(0)->SetWrapMode(TextureStage::WrapClamp); GRenderer->SetBlendFunc(Renderer::BlendInvDstColor, Renderer::BlendOne); GRenderer->SetTexture(0, pb->tc); ARX_DrawPrimitive(<v[0], <v[1], <v[2]); if(pb->nbvert & 4) { EE_RT2(<v[3],<v[3]); ARX_DrawPrimitive(<v[1], <v[2], <v[3]); } GRenderer->GetTextureStage(0)->SetWrapMode(TextureStage::WrapRepeat); } break; } ++ pb; } SetZBias(0); GRenderer->SetFogColor(ulBKGColor); }