//--------------------------------------------------------------------- float CControlTarget::Render(LPDIRECT3DDEVICE7 m_pd3dDevice) { int i = 0; SETCULL(m_pd3dDevice, D3DCULL_NONE); SETZWRITE(m_pd3dDevice, FALSE); SETALPHABLEND(m_pd3dDevice, TRUE); //---------------------------- m_pd3dDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE); m_pd3dDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ONE); SETALPHABLEND(m_pd3dDevice, TRUE); if (tex_mm && tex_mm->m_pddsSurface) { SETTC(m_pd3dDevice, tex_mm); } // ------------------- fTrail += 1; if (fTrail >= 300) fTrail = 0; int n = BEZIERPrecision; float delta = 1.0f / n; fTrail = (ulCurrentTime * fOneOnDuration) * 9 * (n + 2); EERIE_3D lastpos, newpos; EERIE_3D v; int arx_check_init = -1; newpos.x = 0; newpos.y = 0; newpos.z = 0; lastpos.x = pathways[0].sx; lastpos.y = pathways[0].sy; lastpos.z = pathways[0].sz; for (i = 0; i < 9; i++) { int kp = i; int kpprec = (i > 0) ? kp - 1 : kp ; int kpsuiv = kp + 1 ; int kpsuivsuiv = (i < (9 - 2)) ? kpsuiv + 1 : kpsuiv; for (int toto = 1; toto < n; toto++) { if (fTrail < i * n + toto) break; float t = toto * delta; float t1 = t; float t2 = t1 * t1 ; float t3 = t2 * t1 ; float f0 = 2.f * t3 - 3.f * t2 + 1.f ; float f1 = -2.f * t3 + 3.f * t2 ; float f2 = t3 - 2.f * t2 + t1 ; float f3 = t3 - t2 ; float val = pathways[kpsuiv].sx; float p0 = 0.5f * (val - pathways[kpprec].sx) ; float p1 = 0.5f * (pathways[kpsuivsuiv].sx - pathways[kp].sx) ; v.x = f0 * pathways[kp].sx + f1 * val + f2 * p0 + f3 * p1 ; val = pathways[kpsuiv].sy ; p0 = 0.5f * (val - pathways[kpprec].sy) ; p1 = 0.5f * (pathways[kpsuivsuiv].sy - pathways[kp].sy) ; v.y = f0 * pathways[kp].sy + f1 * val + f2 * p0 + f3 * p1 ; val = pathways[kpsuiv].sz ; p0 = 0.5f * (val - pathways[kpprec].sz) ; p1 = 0.5f * (pathways[kpsuivsuiv].sz - pathways[kp].sz) ; v.z = f0 * pathways[kp].sz + f1 * val + f2 * p0 + f3 * p1 ; newpos.x = v.x; newpos.y = v.y; newpos.z = v.z; if (!((fTrail - (i * n + toto)) > 70)) { float c = 1.0f - ((fTrail - (i * n + toto)) / 70.0f); int j = ARX_PARTICLES_GetFree(); if ((j != -1) && (!ARXPausedTimer)) { ParticleCount++; particle[j].exist = 1; particle[j].zdec = 0; particle[j].ov.x = lastpos.x; particle[j].ov.y = lastpos.y; particle[j].ov.z = lastpos.z; particle[j].move.x = 0; particle[j].move.y = 0; particle[j].move.z = 0; particle[j].siz = 5 * c; particle[j].tolive = 10 + (unsigned long)(float)(rnd() * 100.f); particle[j].scale.x = 1; particle[j].scale.y = 1; particle[j].scale.z = 1; particle[j].timcreation = lARXTime; particle[j].tc = tex_mm; particle[j].special = FADE_IN_AND_OUT | ROTATING | MODULATE_ROTATION | DISSIPATING; particle[j].fparam = 0.0000001f; particle[j].r = c; particle[j].g = c; particle[j].b = c; } } float nx = lastpos.x; float ny = lastpos.y; float nz = lastpos.z; lastpos.x = newpos.x; lastpos.y = newpos.y; lastpos.z = newpos.z; newpos.x = nx; newpos.y = ny; newpos.z = nz; ++arx_check_init; int j = ARX_PARTICLES_GetFree(); if ((j != -1) && (!ARXPausedTimer)) { ParticleCount++; particle[j].exist = 1; particle[j].zdec = 0; particle[j].ov.x = lastpos.x; particle[j].ov.y = lastpos.y; particle[j].ov.z = lastpos.z; particle[j].move.x = 0; particle[j].move.y = 0; particle[j].move.z = 0; particle[j].siz = 5; particle[j].tolive = 10 + (unsigned long)(float)(rnd() * 100.f); particle[j].scale.x = 1; particle[j].scale.y = 1; particle[j].scale.z = 1; particle[j].timcreation = lARXTime; particle[j].tc = tex_mm; particle[j].special = FADE_IN_AND_OUT | ROTATING | MODULATE_ROTATION | DISSIPATING; particle[j].fparam = 0.0000001f; particle[j].r = 0.1f; particle[j].g = 0.1f; particle[j].b = 0.1f; } } } EERIE_3D stiteangle; EERIE_3D stitepos; EERIE_3D stitescale; EERIE_RGB stitecolor; EERIE_3D av; ARX_CHECK_NOT_NEG(arx_check_init); av.x = lastpos.x - newpos.x; av.y = lastpos.y - newpos.y; av.z = lastpos.z - newpos.z; TRUEVector_Normalize(&av); float bubu = GetAngle(av.x, av.z, 0, 0); float bubu1 = GetAngle(av.x, av.y, 0, 0); stitepos.x = lastpos.x; stitepos.y = lastpos.y; stitepos.z = lastpos.z; stiteangle.b = 180 - RAD2DEG(bubu); stiteangle.a = 0; stiteangle.g = 90 - RAD2DEG(bubu1); stitecolor.r = 0.7f; stitecolor.g = 0.7f; stitecolor.b = 0.7f; stitescale.x = 1; stitescale.y = 1; stitescale.z = 1; eCurPos.x = lastpos.x; eCurPos.y = lastpos.y; eCurPos.z = lastpos.z; return 1; }
//--------------------------------------------------------------------- float CPoisonProjectile::Render(LPDIRECT3DDEVICE7 m_pd3dDevice) { int i = 0; if (ulCurrentTime >= ulDuration) { return 0.f; } SETCULL(m_pd3dDevice, D3DCULL_NONE); SETZWRITE(m_pd3dDevice, FALSE); //------------------------------------------------------------------------- m_pd3dDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE); m_pd3dDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ONE); SETALPHABLEND(m_pd3dDevice, TRUE); // ------------------------------------------------------------------------ int n = BEZIERPrecision; float delta = 1.0f / n; EERIE_3D lastpos, newpos; EERIE_3D v; lastpos.x = pathways[0].sx; lastpos.y = pathways[0].sy; lastpos.z = pathways[0].sz; int arx_check_init = -1; newpos.x = 0; newpos.y = 0; newpos.z = 0; for (i = 0; i < 9; i++) { int kp = i; int kpprec = (i > 0) ? kp - 1 : kp ; int kpsuiv = kp + 1 ; int kpsuivsuiv = (i < (9 - 2)) ? kpsuiv + 1 : kpsuiv; for (int toto = 1; toto < n; toto++) { if (fTrail < i * n + toto) break; float t = toto * delta; float t1 = t; float t2 = t1 * t1 ; float t3 = t2 * t1 ; float f0 = 2.f * t3 - 3.f * t2 + 1.f ; float f1 = -2.f * t3 + 3.f * t2 ; float f2 = t3 - 2.f * t2 + t1 ; float f3 = t3 - t2 ; float val = pathways[kpsuiv].sx; float p0 = 0.5f * (val - pathways[kpprec].sx) ; float p1 = 0.5f * (pathways[kpsuivsuiv].sx - pathways[kp].sx) ; v.x = f0 * pathways[kp].sx + f1 * val + f2 * p0 + f3 * p1 ; val = pathways[kpsuiv].sy ; p0 = 0.5f * (val - pathways[kpprec].sy); p1 = 0.5f * (pathways[kpsuivsuiv].sy - pathways[kp].sy) ; v.y = f0 * pathways[kp].sy + f1 * val + f2 * p0 + f3 * p1 ; val = pathways[kpsuiv].sz ; p0 = 0.5f * (val - pathways[kpprec].sz) ; p1 = 0.5f * (pathways[kpsuivsuiv].sz - pathways[kp].sz) ; v.z = f0 * pathways[kp].sz + f1 * val + f2 * p0 + f3 * p1 ; newpos.x = v.x; newpos.y = v.y; newpos.z = v.z; if (!((fTrail - (i * n + toto)) > 70)) { float c = 1.0f - ((fTrail - (i * n + toto)) / 70.0f); c += frand2() * 0.1f; if (c < 0) c = 0; if (c > 1) c = 1; } float nx = lastpos.x; float ny = lastpos.y; float nz = lastpos.z; lastpos.x = newpos.x; lastpos.y = newpos.y; lastpos.z = newpos.z; newpos.x = nx; newpos.y = ny; newpos.z = nz; ++arx_check_init; } } EERIE_3D stiteangle; EERIE_3D stitepos; EERIE_3D stitescale; EERIE_RGB stitecolor; EERIE_3D av; ARX_CHECK_NOT_NEG(arx_check_init); av.x = newpos.x - lastpos.x; av.y = newpos.y - lastpos.y; av.z = newpos.z - lastpos.z; TRUEVector_Normalize(&av); float bubu = GetAngle(av.x, av.z, 0, 0); float bubu1 = GetAngle(av.x, av.y, 0, 0); stitepos.x = lastpos.x; stitepos.y = lastpos.y; stitepos.z = lastpos.z; stiteangle.b = -RAD2DEG(bubu); stiteangle.a = 0; stiteangle.g = -90 - RAD2DEG(bubu1); stitecolor.r = 0.7f; stitecolor.g = 0.7f; stitecolor.b = 0.7f; stitescale.x = 2; stitescale.y = 2; stitescale.z = 2; eCurPos.x = lastpos.x; eCurPos.y = lastpos.y; eCurPos.z = lastpos.z; if (fTrail >= (i * n)) { LaunchPoisonExplosion(&lastpos); } SETCULL(m_pd3dDevice, D3DCULL_NONE); SETZWRITE(m_pd3dDevice, FALSE); SETALPHABLEND(m_pd3dDevice, TRUE); return 1; }