//--------------------------------------------------------------------- float CBless::Render() { int i = 0; float x = eSrc.x; float y = eSrc.y - 5; float z = eSrc.z; if (ulCurrentTime >= ulDuration) { return 0.f; } GRenderer->SetCulling(Renderer::CullNone); GRenderer->SetRenderState(Renderer::DepthWrite, false); GRenderer->SetRenderState(Renderer::AlphaBlending, true); TexturedVertex v[4]; TexturedVertex v3[4]; float ff = ((float)spells[spellinstance].caster_level + 10) * 6.f; float fBetaRadCos = (float) cos(radians(MAKEANGLE(player.angle.b))) * ff; float fBetaRadSin = (float) sin(radians(MAKEANGLE(player.angle.b))) * ff; ColorBGRA color = Color::white.toBGR(); v[0].p.x = x - fBetaRadCos - fBetaRadSin; v[0].p.y = y; v[0].p.z = z - fBetaRadSin + fBetaRadCos; v[1].p.x = x + fBetaRadCos - fBetaRadSin; v[1].p.y = y; v[1].p.z = z + fBetaRadSin + fBetaRadCos; v[2].p.x = x - fBetaRadCos + fBetaRadSin; v[2].p.y = y; v[2].p.z = z - fBetaRadSin - fBetaRadCos; v[3].p.x = x + fBetaRadCos + fBetaRadSin; v[3].p.y = y; v[3].p.z = z + fBetaRadSin - fBetaRadCos; v3[0].color = color; v3[1].color = color; v3[2].color = color; v3[3].color = color; GRenderer->SetTexture(0, tex_sol); v3[0].uv = Vec2f::ZERO; v3[1].uv = Vec2f::X_AXIS; v3[2].uv = Vec2f::Y_AXIS; v3[3].uv = Vec2f::ONE; EE_RT2(&v[0], &v3[0]); EE_RT2(&v[1], &v3[1]); EE_RT2(&v[2], &v3[2]); EE_RT2(&v[3], &v3[3]); ARX_DrawPrimitive(&v3[0], &v3[1], &v3[2]); ARX_DrawPrimitive(&v3[1], &v3[2], &v3[3]); GRenderer->SetRenderState(Renderer::AlphaBlending, false); for(i = 0; i < 12; i++) { PARTICLE_DEF * pd = createParticle(); if(!pd) { break; } pd->ov = eSrc - Vec3f(0.f, 20.f, 0.f); pd->move = Vec3f(3.f * frand2(), rnd() * 0.5f, 3.f * frand2()); pd->siz = 0.005f; pd->tolive = Random::get(1000, 2000); pd->tc = tex_p1; pd->special = FADE_IN_AND_OUT | ROTATING | MODULATE_ROTATION | DISSIPATING; pd->fparam = 0.0000001f; pd->rgb = Color3f(0.7f, 0.6f, 0.2f); } GRenderer->SetCulling(Renderer::CullNone); GRenderer->SetRenderState(Renderer::DepthWrite, false); GRenderer->SetRenderState(Renderer::AlphaBlending, true); return 1; }
/*--------------------------------------------------------------------------*/ float CLevitate::Render() { if (this->key > 1) return 0; GRenderer->SetRenderState(Renderer::AlphaBlending, true); GRenderer->SetRenderState(Renderer::DepthWrite, false); //calcul du cone TexturedVertex d3dvs, *d3dv; Vec3f * vertex; int nb, nbc, col; float ddu = this->ang; float u = ddu, du = .99999999f / (float)this->def; switch (this->key) { case 0: nbc = 2; while (nbc--) { vertex = this->cone[nbc].conevertex; d3dv = this->cone[nbc].coned3d; nb = (this->cone[nbc].conenbvertex) >> 1; while (nb) { d3dvs.p.x = this->pos.x + (vertex + 1)->x + ((vertex->x - (vertex + 1)->x) * this->scale); d3dvs.p.y = this->pos.y + (vertex + 1)->y + ((vertex->y - (vertex + 1)->y) * this->scale); d3dvs.p.z = this->pos.z + (vertex + 1)->z + ((vertex->z - (vertex + 1)->z) * this->scale); EE_RT2(&d3dvs, d3dv); float fRandom = rnd() * 80.f; col = checked_range_cast<int>(fRandom); if (!arxtime.is_paused()) d3dv->color = Color::grayb(col).toBGR(col); d3dv->uv.x = u; d3dv->uv.y = 0.f; vertex++; d3dv++; d3dvs.p.x = this->pos.x + vertex->x; d3dvs.p.y = this->pos.y; d3dvs.p.z = this->pos.z + vertex->z; EE_RT2(&d3dvs, d3dv); fRandom = rnd() * 80.f; col = checked_range_cast<int>(fRandom); if (!arxtime.is_paused()) d3dv->color = Color::black.toBGR(col); d3dv->uv.x = u; d3dv->uv.y = 0.9999999f; vertex++; d3dv++; u += du; nb--; } u = ddu; du = -du; } nbc = 3; while(nbc--) { PARTICLE_DEF * pd = createParticle(); if(!pd) { break; } float a = radians(360.f * rnd()); pd->ov = pos + Vec3f(rbase * EEcos(a), 0.f, rbase * EEsin(a)); float t = fdist(pd->ov, pos); pd->move = Vec3f((5.f + 5.f * rnd()) * ((pd->ov.x - pos.x) / t), 3.f * rnd(), (5.f + 5.f * rnd()) * ((pd->ov.z - pos.z) / t)); pd->siz = 30.f + 30.f * rnd(); pd->tolive = 3000; pd->timcreation = -(long(arxtime) + 3000l); // TODO WTF pd->special = FIRE_TO_SMOKE | FADE_IN_AND_OUT | ROTATING | MODULATE_ROTATION | DISSIPATING; pd->fparam = 0.0000001f; } break; case 1: nbc = 2; while (nbc--) { vertex = this->cone[nbc].conevertex; d3dv = this->cone[nbc].coned3d; nb = (this->cone[nbc].conenbvertex) >> 1; while (nb) { d3dvs.p = this->pos + *vertex; EE_RT2(&d3dvs, d3dv); col = Random::get(0, 80); if (!arxtime.is_paused()) d3dv->color = Color::grayb(col).toBGR(col); d3dv->uv.x = u; d3dv->uv.y = 0.f; vertex++; d3dv++; d3dvs.p.x = this->pos.x + vertex->x; d3dvs.p.y = this->pos.y; d3dvs.p.z = this->pos.z + vertex->z; EE_RT2(&d3dvs, d3dv); col = Random::get(0, 80); if (!arxtime.is_paused()) d3dv->color = Color::black.toBGR(col); d3dv->uv.x = u; d3dv->uv.y = 1; vertex++; d3dv++; u += du; nb--; } u = ddu; du = -du; } nbc = 10; while(nbc--) { PARTICLE_DEF * pd = createParticle(); if(!pd) { break; } float a = radians(360.f * rnd()); pd->ov = pos + Vec3f(rbase * EEcos(a), 0.f, rbase * EEsin(a)); float t = fdist(pd->ov, pos); pd->move = Vec3f((5.f + 5.f * rnd()) * ((pd->ov.x - pos.x) / t), 3.f * rnd(), (5.f + 5.f * rnd()) * ((pd->ov.z - pos.z) / t)); pd->siz = 30.f + 30.f * rnd(); pd->tolive = 3000; pd->timcreation = -(long(arxtime) + 3000l); // TODO WTF pd->special = FIRE_TO_SMOKE | FADE_IN_AND_OUT | ROTATING | MODULATE_ROTATION | DISSIPATING; pd->fparam = 0.0000001f; } break; } //tracé du cone back GRenderer->SetBlendFunc(Renderer::BlendOne, Renderer::BlendOne); GRenderer->SetRenderState(Renderer::AlphaBlending, true); GRenderer->GetTextureStage(0)->SetWrapMode(TextureStage::WrapMirror); GRenderer->SetTexture(0, tsouffle); GRenderer->SetCulling(Renderer::CullCW); int i = cone[1].conenbfaces - 2; int j = 0; while (i--) { ARX_DrawPrimitive(&cone[1].coned3d[j], &cone[1].coned3d[j+1], &cone[1].coned3d[j+2]); j++; } i = cone[0].conenbfaces - 2; j = 0; while (i--) { ARX_DrawPrimitive(&cone[0].coned3d[j], &cone[0].coned3d[j+1], &cone[0].coned3d[j+2]); j++; } //tracé du cone front GRenderer->SetCulling(Renderer::CullCCW); i = cone[1].conenbfaces - 2; j = 0; while (i--) { ARX_DrawPrimitive(&cone[1].coned3d[j], &cone[1].coned3d[j+1], &cone[1].coned3d[j+2]); j++; } i = cone[0].conenbfaces - 2; j = 0; while (i--) { ARX_DrawPrimitive(&cone[0].coned3d[j], &cone[0].coned3d[j+1], &cone[0].coned3d[j+2]); j++; } //tracé des pierres GRenderer->SetBlendFunc(Renderer::BlendSrcAlpha, Renderer::BlendInvSrcAlpha); this->DrawStone(); GRenderer->SetBlendFunc(Renderer::BlendOne, Renderer::BlendZero); GRenderer->SetRenderState(Renderer::AlphaBlending, false); GRenderer->SetRenderState(Renderer::DepthWrite, true); return 0; }
//----------------------------------------------------------------------------- void CSummonCreature::RenderFissure() { int i; float ff; TexturedVertex vt[4]; TexturedVertex vr[4]; TexturedVertex target; Vec3f etarget; etarget.x = fBetaRadCos; etarget.y = 0; etarget.z = fBetaRadSin; //------------------------------------------------------------------------- // computation des sommets float fTempCos, fTempSin; for (i = 0; i <= std::min(end, int(fSizeIntro)); i++) { if (i <= end * 0.5f) { ff = i / (end * 0.5f); } else { ff = 1.0f - ((i - (end + 1) * 0.5f) / (end * 0.5f)); } fTempCos = ff * fBetaRadCos; fTempSin = ff * fBetaRadSin; va[i].p.x = v1a[i].p.x + sizeF * fTempCos; va[i].p.y = v1a[i].p.y; va[i].p.z = v1a[i].p.z + sizeF * fTempSin; vb[i].p.x = v1b[i].p.x - sizeF * fTempCos; vb[i].p.y = v1b[i].p.y; vb[i].p.z = v1b[i].p.z - sizeF * fTempSin; va[i].p.x += rnd() * 0.5f * fTempCos; va[i].p.z += rnd() * 0.5f * fTempSin; vb[i].p.x -= rnd() * 0.5f * fTempCos; vb[i].p.z -= rnd() * 0.5f * fTempSin; } //------------------------------------------------------------------------- // rendu de la fissure GRenderer->SetRenderState(Renderer::AlphaBlending, false); vr[0].color = vr[1].color = vr[2].color = vr[3].color = Color::black.toBGR(); if (bIntro) { for (i = 0; i < std::min(end, (int)fSizeIntro); i++) { EE_RT2(&v1a[i], &vr[0]); EE_RT2(&v1b[i], &vr[1]); EE_RT2(&v1a[i+1], &vr[2]); EE_RT2(&v1b[i+1], &vr[3]); ARX_DrawPrimitive(&vr[0], &vr[1], &vr[2]); ARX_DrawPrimitive(&vr[1], &vr[2], &vr[3]); } } else { for (i = 0; i < std::min(end, (int)fSizeIntro); i++) { EE_RT2(&va[i], &vr[0]); EE_RT2(&vb[i], &vr[1]); EE_RT2(&va[i+1], &vr[2]); EE_RT2(&vb[i+1], &vr[3]); ARX_DrawPrimitive(&vr[0], &vr[1], &vr[2]); ARX_DrawPrimitive(&vr[1], &vr[2], &vr[3]); } } //------------------------------------------------------------------------- // rendu de la bordure GRenderer->SetRenderState(Renderer::AlphaBlending, true); vr[0].color = vr[1].color = Color::black.toBGR(); vr[2].color = vr[3].color = fColorBorder.toBGR(); for (i = 0; i < std::min(end, (int)fSizeIntro); i++) { vt[2].p.x = va[i].p.x - (va[i].p.x - eSrc.x) * 0.2f; vt[2].p.y = va[i].p.y - (va[i].p.y - eSrc.y) * 0.2f; vt[2].p.z = va[i].p.z - (va[i].p.z - eSrc.z) * 0.2f; vt[3].p.x = va[i+1].p.x - (va[i+1].p.x - eSrc.x) * 0.2f; vt[3].p.y = va[i+1].p.y - (va[i+1].p.y - eSrc.y) * 0.2f; vt[3].p.z = va[i+1].p.z - (va[i+1].p.z - eSrc.z) * 0.2f; EE_RT2(&vt[3], &vr[0]); EE_RT2(&vt[2], &vr[1]); EE_RT2(&va[i+1], &vr[2]); EE_RT2(&va[i], &vr[3]); ARX_DrawPrimitive(&vr[0], &vr[1], &vr[2]); ARX_DrawPrimitive(&vr[1], &vr[2], &vr[3]); vt[2].p.x = vb[i].p.x - (vb[i].p.x - eSrc.x) * 0.2f; vt[2].p.y = vb[i].p.y - (vb[i].p.y - eSrc.y) * 0.2f; vt[2].p.z = vb[i].p.z - (vb[i].p.z - eSrc.z) * 0.2f; vt[3].p.x = vb[i+1].p.x - (vb[i+1].p.x - eSrc.x) * 0.2f; vt[3].p.y = vb[i+1].p.y - (vb[i+1].p.y - eSrc.y) * 0.2f; vt[3].p.z = vb[i+1].p.z - (vb[i+1].p.z - eSrc.z) * 0.2f; EE_RT2(&vb[i], &vr[3]); EE_RT2(&vb[i+1], &vr[2]); EE_RT2(&vt[2], &vr[1]); EE_RT2(&vt[3], &vr[0]); ARX_DrawPrimitive(&vr[0], &vr[1], &vr[2]); ARX_DrawPrimitive(&vr[1], &vr[2], &vr[3]); } //------------------------------------------------------------------------- // rendu des faisceaux // blend additif ou mul // smooth sur les cotés ou pas .. // texture sympa avec glow au milieu ou uv wrap GRenderer->SetRenderState(Renderer::AlphaBlending, true); GRenderer->GetTextureStage(0)->SetWrapMode(TextureStage::WrapMirror); GRenderer->SetTexture(0, tex_light); target.p.x = eSrc.x + -fBetaRadSin * (1.5f * sizeF); target.p.y = eSrc.y; target.p.z = eSrc.z + fBetaRadCos * (1.5f * sizeF); EE_RTP(&vt[1], &vr[0]); vr[0].color = vr[1].color = fColorRays1.toBGR(); vr[2].color = vr[3].color = fColorRays2.toBGR(); vr[0].uv.x = fTexWrap; vr[0].uv.y = 1; vr[1].uv.x = 1.0f + fTexWrap; vr[1].uv.y = 1; vr[2].uv.x = fTexWrap; vr[2].uv.y = 0; vr[3].uv.x = 1.0f + fTexWrap; vr[3].uv.y = 0; for (i = 0; i < end - 1; i++) { if (i < fSizeIntro) { vt[0].p.x = va[i].p.x; vt[0].p.y = va[i].p.y; vt[0].p.z = va[i].p.z; vt[1].p.x = va[i+1].p.x; vt[1].p.y = va[i+1].p.y; vt[1].p.z = va[i+1].p.z; vt[2].p.x = va[i].p.x + (va[i].p.x - target.p.x) * 2; vt[2].p.y = va[i].p.y + (va[i].p.y - target.p.y) * 2; vt[2].p.z = va[i].p.z + (va[i].p.z - target.p.z) * 2; vt[3].p.x = va[i+1].p.x + (va[i+1].p.x - target.p.x) * 2; vt[3].p.y = va[i+1].p.y + (va[i+1].p.y - target.p.y) * 2; vt[3].p.z = va[i+1].p.z + (va[i+1].p.z - target.p.z) * 2; vr[0].color = (fColorRays1 * tfRaysa[i]).toBGR(); vr[1].color = (fColorRays1 * tfRaysa[i + 1]).toBGR(); vr[2].color = (fColorRays2 * tfRaysa[i]).toBGR(); vr[3].color = (fColorRays2 * tfRaysa[i + 1]).toBGR(); EE_RT2(&vt[0], &vr[3]); EE_RT2(&vt[1], &vr[2]); EE_RT2(&vt[2], &vr[1]); EE_RT2(&vt[3], &vr[0]); ARX_DrawPrimitive(&vr[0], &vr[1], &vr[2]); ARX_DrawPrimitive(&vr[1], &vr[2], &vr[3]); } if (i < fSizeIntro) { vt[0].p.x = vb[i+1].p.x; vt[0].p.y = vb[i+1].p.y; vt[0].p.z = vb[i+1].p.z; vt[1].p.x = vb[i].p.x; vt[1].p.y = vb[i].p.y; vt[1].p.z = vb[i].p.z; vt[2].p.x = vb[i+1].p.x + (vb[i+1].p.x - target.p.x) * 2; vt[2].p.y = vb[i+1].p.y + (vb[i+1].p.y - target.p.y) * 2; vt[2].p.z = vb[i+1].p.z + (vb[i+1].p.z - target.p.z) * 2; vt[3].p.x = vb[i].p.x + (vb[i].p.x - target.p.x) * 2; vt[3].p.y = vb[i].p.y + (vb[i].p.y - target.p.y) * 2; vt[3].p.z = vb[i].p.z + (vb[i].p.z - target.p.z) * 2; vr[0].color = (fColorRays1 * tfRaysb[i]).toBGR(); vr[1].color = (fColorRays1 * tfRaysb[i + 1]).toBGR(); vr[2].color = (fColorRays2 * tfRaysb[i]).toBGR(); vr[3].color = (fColorRays2 * tfRaysb[i + 1]).toBGR(); EE_RT2(&vt[0], &vr[3]); EE_RT2(&vt[1], &vr[2]); EE_RT2(&vt[2], &vr[1]); EE_RT2(&vt[3], &vr[0]); ARX_DrawPrimitive(&vr[0], &vr[1], &vr[2]); ARX_DrawPrimitive(&vr[1], &vr[2], &vr[3]); } } }
//----------------------------------------------------------------------------- void Draw3DLineTex2(Vec3f s, Vec3f e, float fSize, Color color, Color color2) { float fBeta = MAKEANGLE(player.angle.b); float zz = fSize; float xx = (float)(fSize * cos(radians(fBeta))); TexturedVertex v[4]; TexturedVertex v2[4]; v2[0].color = v2[1].color = color.toBGRA(); v2[2].color = v2[3].color = color2.toBGRA(); // version 2 faces v2[0].uv.x = 0; v2[0].uv.y = 0; v2[1].uv.x = 1; v2[1].uv.y = 0; v2[2].uv.x = 1; v2[2].uv.y = 1; v2[3].uv.x = 0; v2[3].uv.y = 1; v[0].p.x = s.x; v[0].p.y = s.y + zz; v[0].p.z = s.z; v[1].p.x = s.x; v[1].p.y = s.y - zz; v[1].p.z = s.z; v[2].p.x = e.x; v[2].p.y = e.y - zz; v[2].p.z = e.z; v[3].p.x = e.x; v[3].p.y = e.y + zz; v[3].p.z = e.z; EE_RT2(&v[0], &v2[0]); EE_RT2(&v[1], &v2[1]); EE_RT2(&v[2], &v2[2]); EE_RT2(&v[3], &v2[3]); ARX_DrawPrimitive(&v2[0], &v2[1], &v2[3]); ARX_DrawPrimitive(&v2[1], &v2[2], &v2[3]); zz *= (float) sin(radians(fBeta)); v[0].p.x = s.x + xx; v[0].p.y = s.y; v[0].p.z = s.z + zz; v[1].p.x = s.x - xx; v[1].p.y = s.y; v[1].p.z = s.z - zz; v[2].p.x = e.x - xx; v[2].p.y = e.y; v[2].p.z = e.z - zz; v[3].p.x = e.x + xx; v[3].p.y = e.y; v[3].p.z = e.z + zz; EE_RT2(&v[0], &v2[0]); EE_RT2(&v[1], &v2[1]); EE_RT2(&v[2], &v2[2]); EE_RT2(&v[3], &v2[3]); ARX_DrawPrimitive(&v2[0], &v2[1], &v2[3]); ARX_DrawPrimitive(&v2[1], &v2[2], &v2[3]); }
void ARXDRAW_DrawInterShadows() { GRenderer->SetFogColor(Color::none); SetZBias(1); long first=1; for(long i=0; i<TREATZONE_CUR; i++) { if(treatio[i].show != 1 || !treatio[i].io) continue; Entity *io = treatio[i].io; if(!io->obj || (io->ioflags & IO_JUST_COLLIDE)) continue; FAST_BKG_DATA * bkgData = getFastBackgroundData(io->pos.x, io->pos.z); if(bkgData && !bkgData->treat) { //TODO is that correct ? continue; } if(!(io->ioflags & IO_NOSHADOW) && io->show==SHOW_FLAG_IN_SCENE && !(io->ioflags & IO_GOLD)) { TexturedVertex in; TexturedVertex ltv[4]; ltv[0] = TexturedVertex(Vec3f(0, 0, 0.001f), 1.f, 0, 1, Vec2f(0.3f, 0.3f)); ltv[1] = TexturedVertex(Vec3f(0, 0, 0.001f), 1.f, 0, 1, Vec2f(0.7f, 0.3f)); ltv[2] = TexturedVertex(Vec3f(0, 0, 0.001f), 1.f, 0, 1, Vec2f(0.7f, 0.7f)); ltv[3] = TexturedVertex(Vec3f(0, 0, 0.001f), 1.f, 0, 1, Vec2f(0.3f, 0.7f)); if(io->obj->nbgroups <= 1) { for(size_t k=0; k < io->obj->vertexlist.size(); k += 9) { EERIEPOLY *ep = EECheckInPoly(&io->obj->vertexlist3[k].v); if(ep) { in.p.y=ep->min.y-3.f; float r=0.5f-((float)EEfabs(io->obj->vertexlist3[k].v.y-in.p.y))*( 1.0f / 500 ); r-=io->invisibility; r*=io->scale; if(r<=0.f) continue; float s1=16.f*io->scale; float s2=s1*( 1.0f / 2 ); in.p.x=io->obj->vertexlist3[k].v.x-s2; in.p.z=io->obj->vertexlist3[k].v.z-s2; r*=255.f; long lv = r; ltv[0].color=ltv[1].color=ltv[2].color=ltv[3].color=0xFF000000 | lv<<16 | lv<<8 | lv; if(first) { first=0; GRenderer->SetRenderState(Renderer::DepthWrite, false); GRenderer->SetBlendFunc(Renderer::BlendZero, Renderer::BlendInvSrcColor); GRenderer->SetRenderState(Renderer::AlphaBlending, true); GRenderer->SetTexture(0, Boom); } EE_RT2(&in,<v[0]); in.p.x+=s1; EE_RT2(&in,<v[1]); in.p.z+=s1; EE_RT2(&in,<v[2]); in.p.x-=s1; EE_RT2(&in,<v[3]); if(ltv[0].p.z > 0.f && ltv[1].p.z > 0.f && ltv[2].p.z > 0.f) { ARX_DrawPrimitive(<v[0], <v[1], <v[2], 50.0f); ARX_DrawPrimitive(<v[0], <v[2], <v[3], 50.0f); } } } } else { for(long k = 0; k < io->obj->nbgroups; k++) { long origin=io->obj->grouplist[k].origin; EERIEPOLY *ep = EECheckInPoly(&io->obj->vertexlist3[origin].v); if(ep) { in.p.y=ep->min.y-3.f; float r=0.8f-((float)EEfabs(io->obj->vertexlist3[origin].v.y-in.p.y))*( 1.0f / 500 ); r*=io->obj->grouplist[k].siz; r-=io->invisibility; if(r<=0.f) continue; float s1=io->obj->grouplist[k].siz*44.f; float s2=s1*( 1.0f / 2 ); in.p.x=io->obj->vertexlist3[origin].v.x-s2; in.p.z=io->obj->vertexlist3[origin].v.z-s2; r*=255.f; long lv = r; ltv[0].color=ltv[1].color=ltv[2].color=ltv[3].color=0xFF000000 | lv<<16 | lv<<8 | lv; if(first) { first=0; GRenderer->SetRenderState(Renderer::DepthWrite, false); GRenderer->SetBlendFunc(Renderer::BlendZero, Renderer::BlendInvSrcColor); GRenderer->SetRenderState(Renderer::AlphaBlending, true); GRenderer->SetTexture(0, Boom); } EE_RT2(&in,<v[0]); in.p.x+=s1; EE_RT2(&in,<v[1]); in.p.z+=s1; EE_RT2(&in,<v[2]); in.p.x-=s1; EE_RT2(&in,<v[3]); ARX_DrawPrimitive(<v[0], <v[1], <v[2]); ARX_DrawPrimitive(<v[0], <v[2], <v[3]); } } } } } GRenderer->SetRenderState(Renderer::AlphaBlending, false); GRenderer->SetRenderState(Renderer::DepthWrite, true); SetZBias(0); 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); }