void AddPoisonFog(EERIE_3D * pos, float power) { int iDiv = 2; if (pMenuConfig) { iDiv += 2 - pMenuConfig->iLevelOfDetails; } float flDiv = ARX_CLEAN_WARN_CAST_FLOAT(1 << iDiv); ARX_CHECK_LONG(FrameDiff / flDiv); long count = ARX_CLEAN_WARN_CAST_LONG(FrameDiff / flDiv); if (count < 1) count = 1; while (count) { count--; long j = ARX_PARTICLES_GetFree(); if ((j != -1) && (!ARXPausedTimer) && (rnd() * 2000.f < power)) { ParticleCount++; particle[j].special = FADE_IN_AND_OUT | ROTATING | MODULATE_ROTATION | DISSIPATING; particle[j].exist = TRUE; particle[j].zdec = 0; particle[j].ov.x = pos->x + 100.f - 200.f * rnd(); particle[j].ov.y = pos->y + 100.f - 200.f * rnd(); particle[j].ov.z = pos->z + 100.f - 200.f * rnd(); float speed = 1.f; float fval = speed * DIV5; particle[j].scale.x = particle[j].scale.y = particle[j].scale.z = 10.f; particle[j].move.x = (speed - rnd()) * fval; particle[j].move.y = (speed - speed * rnd()) * DIV15; particle[j].move.z = (speed - rnd()) * fval; particle[j].scale.x = particle[j].scale.y = 8; particle[j].timcreation = ARX_CLEAN_WARN_CAST_LONG(ARX_TIME_Get()); particle[j].tolive = 4500 + (unsigned long)(rnd() * 4500); particle[j].tc = TC_smoke; particle[j].siz = (80 + rnd() * 80 * 2.f) * DIV3; particle[j].r = rnd() * DIV3; particle[j].g = 1.f; particle[j].b = rnd() * DIV10; particle[j].fparam = 0.001f; } } }
//----------------------------------------------------------------------------- void CExplosion::ExplosionAddParticule(int num, D3DTLVERTEX * v, TextureContainer * tp) { if (DoSphericDamage((EERIE_3D *)v, 4.f, 30.f, DAMAGE_AREA, DAMAGE_TYPE_MAGICAL | DAMAGE_TYPE_FIRE, 0)) // 0=player source { EERIE_3D hit; hit.x = v->sx; hit.y = v->sy; hit.z = v->sz; DynLight[tactif[num]].exist = 0; tactif[num] = -1; ARX_BOOMS_Add(&hit); Add3DBoom(&hit, NULL); } if (rnd() > .25f) { int j = ARX_PARTICLES_GetFree(); if ((j != -1) && (!ARXPausedTimer)) { ParticleCount++; particle[j].exist = 1; particle[j].zdec = 0; particle[j].ov.x = v->sx; particle[j].ov.y = v->sy; particle[j].ov.z = v->sz; particle[j].move.x = 0.f; particle[j].move.y = rnd(); particle[j].move.z = 0.f; particle[j].siz = 10.f + 20.f * rnd(); particle[j].tolive = 500 + (unsigned long)(float)(rnd() * 500.f); particle[j].scale.x = 1.f; particle[j].scale.y = 1.f; particle[j].scale.z = 1.f; particle[j].timcreation = lARXTime; particle[j].tc = tp; particle[j].special = FIRE_TO_SMOKE | FADE_IN_AND_OUT | ROTATING | MODULATE_ROTATION; particle[j].fparam = 0.0000001f; particle[j].r = 1.f; particle[j].g = 1.f; particle[j].b = 1.f; } } }
//--------------------------------------------------------------------- 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 CExplosion::Render(LPDIRECT3DDEVICE7 device) { if (this->key > 1) return 0; SETALPHABLEND(device, TRUE); SETZWRITE(device, FALSE); device->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE); device->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ONE); //calcul du disque D3DTLVERTEX d3dvs, *d3dv; EERIE_3D * vertex; int nb, col, col2; float rin; switch (key) { case 0: rin = 255.f * scale; vertex = disquevertex; d3dv = disqued3d; nb = disquenbvertex >> 1; while (nb) { d3dvs.sx = pos.x + (vertex + 1)->x + ((vertex->x - (vertex + 1)->x) * scale); d3dvs.sy = pos.y; d3dvs.sz = pos.z + (vertex + 1)->z + ((vertex->z - (vertex + 1)->z) * scale); EE_RTP(&d3dvs, d3dv); d3dv->color = RGBA_MAKE(255, 200, 0, 255); vertex++; d3dv++; d3dvs.sx = pos.x + vertex->x; d3dvs.sy = pos.y; d3dvs.sz = pos.z + vertex->z; EE_RTP(&d3dvs, d3dv); if (!ARXPausedTimer) d3dv->color = RGBA_MAKE((int)(rin * rnd()), 0, 0, 255); vertex++; d3dv++; nb--; } if (rnd() > .25f) { int j = ARX_PARTICLES_GetFree(); if ((j != -1) && (!ARXPausedTimer)) { ParticleCount++; particle[j].exist = 1; particle[j].zdec = 0; float a = DEG2RAD(360.f * scale); float b = rin; particle[j].ov.x = pos.x + b * EEcos(a); particle[j].ov.y = pos.y; particle[j].ov.z = pos.z + b * EEsin(a); particle[j].move.x = 0.f; particle[j].move.y = rnd(); particle[j].move.z = 0.f; particle[j].siz = 10.f + 10.f * rnd(); particle[j].tolive = 500 + (unsigned long)(float)(rnd() * 500.f); particle[j].scale.x = 1.f; particle[j].scale.y = 1.f; particle[j].scale.z = 1.f; particle[j].timcreation = lARXTime; particle[j].tc = tp; particle[j].special = FADE_IN_AND_OUT | ROTATING | MODULATE_ROTATION | DISSIPATING; particle[j].fparam = 0.0000001f; particle[j].r = 1.f; particle[j].g = 1.f; particle[j].b = 1.f; } j = ARX_PARTICLES_GetFree(); if ((j != -1) && (!ARXPausedTimer)) { ParticleCount++; particle[j].exist = 1; particle[j].zdec = 0; float a = DEG2RAD(-360.f * scale); float b = this->rin; particle[j].ov.x = pos.x + b * EEcos(a); particle[j].ov.y = pos.y; particle[j].ov.z = pos.z + b * EEsin(a); particle[j].move.x = 0.f; particle[j].move.y = rnd(); particle[j].move.z = 0.f; particle[j].siz = 10.f + 10.f * rnd(); particle[j].tolive = 500 + (unsigned long)(float)(rnd() * 500.f); particle[j].scale.x = 1.f; particle[j].scale.y = 1.f; particle[j].scale.z = 1.f; particle[j].timcreation = lARXTime; particle[j].tc = tp; particle[j].special = FADE_IN_AND_OUT | ROTATING | MODULATE_ROTATION | DISSIPATING; particle[j].fparam = 0.0000001f; particle[j].r = 1.f; particle[j].g = 1.f; particle[j].b = 1.f; } } if (rnd() > .1f) { int j = ARX_PARTICLES_GetFree(); if ((j != -1) && (!ARXPausedTimer)) { ParticleCount++; particle[j].exist = 1; particle[j].zdec = 0; float a = rnd() * 360.f; float b = rin * rnd(); particle[j].ov.x = pos.x + b * EEcos(a); particle[j].ov.y = pos.y + 70.f; particle[j].ov.z = pos.z + b * EEsin(a); particle[j].move.x = 0.f; particle[j].move.y = -(5.f + 10.f * rnd()); particle[j].move.z = 0.f; particle[j].siz = 10.f + 20.f * rnd(); particle[j].tolive = 1000 + (unsigned long)(float)(rnd() * 1000.f); particle[j].scale.x = 1.f; particle[j].scale.y = 1.f; particle[j].scale.z = 1.f; particle[j].timcreation = lARXTime; particle[j].tc = tp2; particle[j].special = FADE_IN_AND_OUT | ROTATING | MODULATE_ROTATION | DISSIPATING; particle[j].fparam = 0.0000001f; particle[j].r = 1.f; particle[j].g = 1.f; particle[j].b = 1.f; } } break; case 1: D3DTLVERTEX d3dvs2; rin = 1.f + (puissance * scale); vertex = disquevertex; d3dv = disqued3d; nb = disquenbvertex >> 1; float a = 1.f - scale; col = RGBA_MAKE((int)(255.f * a), (int)(200.f * a), 0, 255); col2 = RGBA_MAKE((int)(255.f * a * rnd()), 0, 0, 0); while (nb--) { d3dvs.sx = pos.x + vertex->x * rin; d3dvs.sy = pos.y; d3dvs.sz = pos.z + vertex->z * rin; vertex++; d3dvs2.sx = pos.x + vertex->x * rin; d3dvs2.sy = pos.y; d3dvs2.sz = pos.z + vertex->z * rin; vertex++; if (tactif[nb] >= 0) { EERIE_3D pos, dir; pos.x = d3dvs2.sx; pos.y = d3dvs2.sy; pos.z = d3dvs2.sz; dir.x = d3dvs.sx; dir.y = d3dvs.sy; dir.z = d3dvs.sz; DynLight[tactif[nb]].pos.x = dir.x; DynLight[tactif[nb]].pos.y = dir.y; DynLight[tactif[nb]].pos.z = dir.z; DynLight[tactif[nb]].intensity = .7f + 2.f * rnd(); Collision(nb, &pos, &dir); ExplosionAddParticule(nb, &d3dvs, tp); } EE_RTP(&d3dvs, d3dv); if (!ARXPausedTimer) d3dv->color = col; d3dv++; EE_RTP(&d3dvs2, d3dv); if (!ARXPausedTimer) d3dv->color = col2; d3dv++; } break; } //tracé du disque SETCULL(device, D3DCULL_NONE); device->SetTexture(0, NULL); device->DrawIndexedPrimitive(D3DPT_TRIANGLESTRIP, D3DFVF_TLVERTEX, disqued3d, disquenbvertex, (unsigned short *)disqueind, disquenbvertex + 2, 0); device->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE); device->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ZERO); SETALPHABLEND(device, FALSE); SETZWRITE(device, TRUE); return 0; }
//----------------------------------------------------------------------------- // Updates all currently launched projectiles void ARX_MISSILES_Update() { long framediff, framediff2, framediff3; EERIE_3D orgn, dest, hit; TextureContainer * tc = TC_fire; EERIEPOLY *tp = NULL; unsigned long tim = ARXTimeUL(); for (unsigned long i(0); i < MAX_MISSILES; i++) { if (missiles[i].type == MISSILE_NONE) continue; framediff = missiles[i].timecreation + missiles[i].tolive - tim; if (framediff < 0) { ARX_MISSILES_Kill(i); continue; } framediff2 = missiles[i].timecreation + missiles[i].tolive - missiles[i].lastupdate; framediff3 = tim - missiles[i].timecreation; switch (missiles[i].type) { case MISSILE_FIREBALL : { EERIE_3D pos; pos.x = missiles[i].startpos.x + missiles[i].velocity.x * framediff3; pos.y = missiles[i].startpos.y + missiles[i].velocity.y * framediff3; pos.z = missiles[i].startpos.z + missiles[i].velocity.z * framediff3; if (missiles[i].longinfo != -1) { DynLight[missiles[i].longinfo].pos.x = pos.x; DynLight[missiles[i].longinfo].pos.y = pos.y; DynLight[missiles[i].longinfo].pos.z = pos.z; } if (USE_COLLISIONS) { orgn.x = missiles[i].lastpos.x; orgn.y = missiles[i].lastpos.y; orgn.z = missiles[i].lastpos.z; dest.x = pos.x; dest.y = pos.y; dest.z = pos.z; EERIEPOLY *ep; EERIEPOLY *epp; EERIE_3D tro; tro.x = 70.0F; tro.y = 70.0F; tro.z = 70.0F; CURRENTINTER = NULL; ep = GetMinPoly(dest.x, dest.y, dest.z); epp = GetMaxPoly(dest.x, dest.y, dest.z); if (Distance3D(player.pos.x, player.pos.y, player.pos.z, pos.x, pos.y, pos.z) < 200.0F) { ARX_MISSILES_Kill(i); ARX_BOOMS_Add(&pos); Add3DBoom(&pos, NULL); DoSphericDamage(&dest, 180.0F, 200.0F, DAMAGE_AREAHALF, DAMAGE_TYPE_FIRE | DAMAGE_TYPE_MAGICAL); break; } if (ep && ep->center.y < dest.y) { ARX_MISSILES_Kill(i); ARX_BOOMS_Add(&dest); Add3DBoom(&dest, NULL); DoSphericDamage(&dest, 180.0F, 200.0F, DAMAGE_AREAHALF, DAMAGE_TYPE_FIRE | DAMAGE_TYPE_MAGICAL); break; } if (epp && epp->center.y > dest.y) { ARX_MISSILES_Kill(i); ARX_BOOMS_Add(&dest); Add3DBoom(&dest, NULL); DoSphericDamage(&dest, 180.0F, 200.0F, DAMAGE_AREAHALF, DAMAGE_TYPE_FIRE | DAMAGE_TYPE_MAGICAL); break; } if (EERIELaunchRay3(&orgn, &dest, &hit, tp, 1)) { ARX_MISSILES_Kill(i); ARX_BOOMS_Add(&hit); Add3DBoom(&hit, NULL); DoSphericDamage(&dest, 180.0F, 200.0F, DAMAGE_AREAHALF, DAMAGE_TYPE_FIRE | DAMAGE_TYPE_MAGICAL); break; } if ( !EECheckInPoly(&dest) || EEIsUnderWaterFast(&dest) ) //ARX: jycorbel (2010-08-20) - rendering issues with bGATI8500: optimize time to render; { ARX_MISSILES_Kill(i); ARX_BOOMS_Add(&dest); Add3DBoom(&dest, NULL); DoSphericDamage(&dest, 180.0F, 200.0F, DAMAGE_AREAHALF, DAMAGE_TYPE_FIRE | DAMAGE_TYPE_MAGICAL); break; } long ici = IsCollidingAnyInter(dest.x, dest.y, dest.z, &tro); if (ici != -1 && ici != missiles[i].owner) { ARX_MISSILES_Kill(i); ARX_BOOMS_Add(&dest); Add3DBoom(&dest, NULL); DoSphericDamage(&dest, 180.0F, 200.0F, DAMAGE_AREAHALF, DAMAGE_TYPE_FIRE | DAMAGE_TYPE_MAGICAL); break; } } long j = ARX_PARTICLES_GetFree(); if (j != -1 && !ARXPausedTimer) { ParticleCount++; particle[j].exist = TRUE; particle[j].zdec = 0; particle[j].ov.x = pos.x; particle[j].ov.y = pos.y; particle[j].ov.z = pos.z; particle[j].move.x = missiles[i].velocity.x + 3.0f - 6.0F * rnd(); particle[j].move.y = missiles[i].velocity.y + 4.0F - 12.0F * rnd(); particle[j].move.z = missiles[i].velocity.z + 3.0F - 6.0F * rnd(); particle[j].timcreation = tim; particle[j].tolive = 500 + (unsigned long)(rnd() * 500.f); particle[j].tc = tc; particle[j].siz = 12.0F * (float)(missiles[i].tolive - framediff3) * DIV4000; particle[j].scale.x = 15.0F + rnd() * 5.0F; particle[j].scale.y = 15.0F + rnd() * 5.0F; particle[j].scale.z = 15.0F + rnd() * 5.0F; particle[j].special = FIRE_TO_SMOKE; } missiles[i].lastpos.x = pos.x; missiles[i].lastpos.y = pos.y; missiles[i].lastpos.z = pos.z; break; } } missiles[i].lastupdate = tim; } }
//--------------------------------------------------------------------- float CCurse::Render(LPDIRECT3DDEVICE7 m_pd3dDevice, EERIE_3D * pos) { int i = 0; float x = eSrc.x; float y = eSrc.y;// + 200.0f; float z = eSrc.z; if (ulCurrentTime >= ulDuration) { /* if (bDone) { EERIE_3D target,source; target.x=player.pos.x;// - EEsin(DEG2RAD(MAKEANGLE(player.angle.b)))*1000.f; target.y=player.pos.y;//+30.f; target.z=player.pos.z;// + EEcos(DEG2RAD(MAKEANGLE(player.angle.b)))*1000.f; source.x = x; source.y = y; source.z = z; if (pIncinerate) { pIncinerate->Create(source, MAKEANGLE(player.angle.b)); pIncinerate->SetDuration(2000); } //DebugSphere(source.x,source.y,source.z,20,8000,0xFFFF0000); //DebugSphere(target.x,target.y,target.z,20,8000,0xFFFF0000); bDone = false; } else { return 0.f; } */ } SETCULL(m_pd3dDevice, D3DCULL_CW); SETZWRITE(m_pd3dDevice, true); x = pos->x; y = pos->y; z = pos->z; //---------------------------- EERIE_3D stiteangle; EERIE_3D stitepos; EERIE_3D stitescale; EERIE_RGB stitecolor; SETALPHABLEND(m_pd3dDevice, false); stiteangle.b = fRot; stiteangle.a = 0; stiteangle.g = 0; stitepos.x = x; stitepos.y = y; stitepos.z = z; stitecolor.r = 1; stitecolor.g = 1; stitecolor.b = 1; stitescale.x = 1; stitescale.y = 1; stitescale.z = 1; if (svoodoo) DrawEERIEObjEx(m_pd3dDevice, svoodoo , &stiteangle, &stitepos, &stitescale, &stitecolor); for (i = 0; i < 4; i++) { int j = ARX_PARTICLES_GetFree(); if ((j != -1) && (!ARXPausedTimer)) { ParticleCount++; PARTICLE_DEF * pd = &particle[j]; pd->exist = 1; pd->zdec = 0; pd->ov.x = x; pd->ov.y = y; pd->ov.z = z; pd->move.x = 2.f * frand2(); pd->move.y = rnd() * -10.f - 10.f; pd->move.z = 2.f * frand2(); pd->siz = 0.015f; pd->tolive = 1000 + (unsigned long)(float)(rnd() * 600.f); pd->scale.x = 1.f; pd->scale.y = 1.f; pd->scale.z = 1.f; pd->timcreation = lARXTime; pd->tc = tex_p1; pd->special = ROTATING | MODULATE_ROTATION | DISSIPATING | SUBSTRACT | GRAVITY; pd->fparam = 0.0000001f; pd->r = 1.f; pd->g = 1.f; pd->b = 1.f; } } return 1; }
//--------------------------------------------------------------------- float CBless::Render(LPDIRECT3DDEVICE7 _pD3DDevice) { int i = 0; float x = eSrc.x; float y = eSrc.y - 5; float z = eSrc.z; if (ulCurrentTime >= ulDuration) { return 0.f; } SETCULL(_pD3DDevice, D3DCULL_NONE); SETZWRITE(_pD3DDevice, false); SETALPHABLEND(_pD3DDevice, true); D3DTLVERTEX v[4]; D3DTLVERTEX v3[4]; float ff = ((float)spells[spellinstance].caster_level + 10) * 6.f; float fBetaRadCos = (float) cos(DEG2RAD(MAKEANGLE(player.angle.b))) * ff; float fBetaRadSin = (float) sin(DEG2RAD(MAKEANGLE(player.angle.b))) * ff; unsigned long color = D3DRGB(1, 1, 1); v[0].sx = x - fBetaRadCos - fBetaRadSin; v[0].sy = y; v[0].sz = z - fBetaRadSin + fBetaRadCos; v[1].sx = x + fBetaRadCos - fBetaRadSin; v[1].sy = y; v[1].sz = z + fBetaRadSin + fBetaRadCos; v[2].sx = x - fBetaRadCos + fBetaRadSin; v[2].sy = y; v[2].sz = z - fBetaRadSin - fBetaRadCos; v[3].sx = x + fBetaRadCos + fBetaRadSin; v[3].sy = y; v[3].sz = z + fBetaRadSin - fBetaRadCos; v3[0].color = color; v3[1].color = color; v3[2].color = color; v3[3].color = color; if (tex_sol && tex_sol->m_pddsSurface) { SETTC(_pD3DDevice, tex_sol); } v3[0].tu = 0; v3[0].tv = 0; v3[1].tu = 1.f; v3[1].tv = 0; v3[2].tu = 0; v3[2].tv = 1.f; v3[3].tu = 1.f; v3[3].tv = 1.f; 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_SoftClippZ(&v3[0], &v3[1], &v3[2]); ARX_DrawPrimitive_SoftClippZ(&v3[1], &v3[2], &v3[3]); //---------------------------- SETALPHABLEND(_pD3DDevice, false); for (i = 0; i < 12; i++) { int j = ARX_PARTICLES_GetFree(); if ((j != -1) && (!ARXPausedTimer)) { ParticleCount++; particle[j].exist = 1; particle[j].zdec = 0; particle[j].ov.x = eSrc.x; particle[j].ov.y = eSrc.y - 20; particle[j].ov.z = eSrc.z; particle[j].move.x = 3.f * frand2(); particle[j].move.y = rnd() * 0.5f; particle[j].move.z = 3.f * frand2(); particle[j].siz = 0.005f; particle[j].tolive = 1000 + (unsigned long)(float)(rnd() * 1000.f); particle[j].scale.x = 1.f; particle[j].scale.y = 1.f; particle[j].scale.z = 1.f; particle[j].timcreation = lARXTime; particle[j].tc = tex_p1; particle[j].special = FADE_IN_AND_OUT | ROTATING | MODULATE_ROTATION | DISSIPATING; particle[j].fparam = 0.0000001f; particle[j].r = 0.7f; particle[j].g = 0.6f; particle[j].b = 0.2f; } } SETCULL(_pD3DDevice, D3DCULL_NONE); SETZWRITE(_pD3DDevice, false); SETALPHABLEND(_pD3DDevice, true); return 1; }
//************************************************************************************* //************************************************************************************* void ARX_FOGS_Render(long init) { if (ARXPausedTimer) return; int iDiv = 2; if (pMenuConfig) { iDiv += 2 - pMenuConfig->iLevelOfDetails; } float flDiv = ARX_CLEAN_WARN_CAST_FLOAT(1 << iDiv); for (long i = 0; i < MAX_FOG; i++) { if (fogs[i].exist) { unsigned long offs; float fval; offs = 0; ARX_CHECK_LONG(FrameDiff / flDiv); long count = ARX_CLEAN_WARN_CAST_LONG(FrameDiff / flDiv); if (count < 1) count = 1; while (count) { count--; long j = ARX_PARTICLES_GetFree(); if ((j != -1) && (rnd() * 2000.f < (float)fogs[i].frequency)) { ParticleCount++; particle[j].special = FADE_IN_AND_OUT | ROTATING | MODULATE_ROTATION | DISSIPATING; particle[j].exist = TRUE; particle[j].zdec = 0; if (fogs[i].special & FOG_DIRECTIONAL) { particle[j].ov.x = fogs[i].pos.x; particle[j].ov.y = fogs[i].pos.y; particle[j].ov.z = fogs[i].pos.z; fval = fogs[i].speed * DIV10; particle[j].move.x = (fogs[i].move.x * fval); particle[j].move.y = (fogs[i].move.y * fval); particle[j].move.z = (fogs[i].move.z * fval); } else { particle[j].ov.x = fogs[i].pos.x + 100.f - 200.f * rnd(); particle[j].ov.y = fogs[i].pos.y + 100.f - 200.f * rnd(); particle[j].ov.z = fogs[i].pos.z + 100.f - 200.f * rnd(); fval = fogs[i].speed * DIV5; particle[j].move.x = (fogs[i].speed - rnd() * 2.f) * fval; particle[j].move.y = (fogs[i].speed - rnd() * 2.f) * DIV15; particle[j].move.z = (fogs[i].speed - rnd() * 2.f) * fval; } particle[j].scale.x = particle[j].scale.y = particle[j].scale.z = fogs[i].scale; particle[j].timcreation = lARXTime; particle[j].tolive = fogs[i].tolive + (unsigned long)(rnd() * fogs[i].tolive); particle[j].tc = TC_smoke; particle[j].siz = (fogs[i].size + rnd() * fogs[i].size * 2.f) * DIV3; particle[j].r = fogs[i].rgb.r; particle[j].g = fogs[i].rgb.g; particle[j].b = fogs[i].rgb.b; particle[j].fparam = fogs[i].rotatespeed; } fogs[i].lastupdate = ARXTimeUL(); } } } }
//--------------------------------------------------------------------- float CRuneOfGuarding::Render(LPDIRECT3DDEVICE7 m_pd3dDevice) { float x = eSrc.x; float y = eSrc.y - 20; float z = eSrc.z; SETZWRITE(m_pd3dDevice, FALSE); m_pd3dDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE); m_pd3dDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ONE); SETALPHABLEND(m_pd3dDevice, TRUE); //---------------------------- // long color = D3DRGB(1,1,1); // int size = 100; //---------------------------- EERIE_3D stiteangle; EERIE_3D stitepos; EERIE_3D stitescale; EERIE_RGB stitecolor; float stiteangleb = (float) ulCurrentTime * fOneOnDuration * 120; stiteangle.a = 0; stiteangle.g = 0; stitepos.x = x; stitepos.y = y; stitepos.z = z; float gtc = (float)ARX_TIME_Get(); float v = EEsin(gtc * DIV1000) * DIV10; stiteangle.b = MAKEANGLE(gtc * DIV1000); stitecolor.r = 0.4f - v; stitecolor.g = 0.4f - v; stitecolor.b = 0.6f - v; stitescale.x = 1; stitescale.y = -0.1f; stitescale.z = 1; if (slight) DrawEERIEObjEx(m_pd3dDevice, slight, &stiteangle, &stitepos, &stitescale, &stitecolor); stiteangle.b = stiteangleb; stitecolor.r = 0.6f; stitecolor.g = 0.f; stitecolor.b = 0.f; stitescale.x = 2; stitescale.y = 2; stitescale.z = 2; if (ssol) DrawEERIEObjEx(m_pd3dDevice, ssol, &stiteangle, &stitepos, &stitescale, &stitecolor); stitecolor.r = 0.6f; stitecolor.g = 0.3f; stitecolor.b = 0.45f; stitescale.z = 1.8f; stitescale.y = 1.8f; stitescale.x = 1.8f; if (srune) DrawEERIEObjEx(m_pd3dDevice, srune, &stiteangle, &stitepos, &stitescale, &stitecolor); for (int n = 0; n < 4; n++) { int j = ARX_PARTICLES_GetFree(); if ((j != -1) && (!ARXPausedTimer)) { ParticleCount++; particle[j].exist = 1; particle[j].zdec = 0; particle[j].ov.x = x + frand2() * 40; particle[j].ov.y = y; particle[j].ov.z = z + frand2() * 40; particle[j].move.x = 0.8f * frand2(); particle[j].move.y = -4.f * rnd(); particle[j].move.z = 0.8f * frand2(); particle[j].scale.x = -0.1f; particle[j].scale.y = -0.1f; particle[j].scale.z = -0.1f; particle[j].timcreation = lARXTime; particle[j].tolive = 2600 + (unsigned long)(rnd() * 600.f); particle[j].tc = tex_p2; particle[j].siz = 0.3f; particle[j].r = 0.4f; particle[j].g = 0.4f; particle[j].b = 0.6f; } } return 1.0f - rnd() * 0.3f; }
/*--------------------------------------------------------------------------*/ void CLevitate::DrawStone(LPDIRECT3DDEVICE7 device) { device->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_INVDESTCOLOR); device->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ONE); SETALPHABLEND(device, TRUE); int nb = 256; while (nb--) { if (this->tstone[nb].actif) { float a = (float)this->tstone[nb].currtime / (float)this->tstone[nb].time; if (a > 1.f) { a = 1.f; this->tstone[nb].actif = 0; } int col = RGBA_MAKE(255, 255, 255, (int)(255.f * (1.f - a))); if (this->stone[this->tstone[nb].numstone]) DrawEERIEObjExEx(device, this->stone[this->tstone[nb].numstone], &this->tstone[nb].ang, &this->tstone[nb].pos, &this->tstone[nb].scale, col); int j = ARX_PARTICLES_GetFree(); if ((j != -1) && (!ARXPausedTimer)) { ParticleCount++; particle[j].exist = 1; particle[j].zdec = 0; particle[j].ov = this->tstone[nb].pos; particle[j].move.x = 0.f; particle[j].move.y = 3.f * rnd(); particle[j].move.z = 0.f; particle[j].siz = 3.f + 3.f * rnd(); particle[j].tolive = 1000; particle[j].scale.x = 1.f; particle[j].scale.y = 1.f; particle[j].scale.z = 1.f; particle[j].timcreation = -(long)(ARXTime + 1000); particle[j].tc = NULL; particle[j].special = FIRE_TO_SMOKE | FADE_IN_AND_OUT | ROTATING | MODULATE_ROTATION | DISSIPATING; particle[j].fparam = 0.0000001f; particle[j].r = 1.f; particle[j].g = 1.f; particle[j].b = 1.f; } //update mvt if (!ARXPausedTimer) { a = (((float)this->currframetime) * 100.f) / (float)this->tstone[nb].time; this->tstone[nb].pos.y += this->tstone[nb].yvel * a; this->tstone[nb].ang.a += this->tstone[nb].angvel.a * a; this->tstone[nb].ang.b += this->tstone[nb].angvel.b * a; this->tstone[nb].ang.g += this->tstone[nb].angvel.g * a; this->tstone[nb].yvel *= 1.f - (1.f / 100.f); this->tstone[nb].currtime += this->currframetime; } } } SETALPHABLEND(device, FALSE); }
/*--------------------------------------------------------------------------*/ float CLevitate::Render(LPDIRECT3DDEVICE7 device) { if (this->key > 1) return 0; SETALPHABLEND(device, TRUE); SETZWRITE(device, FALSE); //calcul du cone D3DTLVERTEX d3dvs, *d3dv; EERIE_3D * 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.sx = this->pos.x + (vertex + 1)->x + ((vertex->x - (vertex + 1)->x) * this->scale); d3dvs.sy = this->pos.y + (vertex + 1)->y + ((vertex->y - (vertex + 1)->y) * this->scale); d3dvs.sz = this->pos.z + (vertex + 1)->z + ((vertex->z - (vertex + 1)->z) * this->scale); EE_RT2(&d3dvs, d3dv); float fRandom = rnd() * 80.f ; ARX_CHECK_INT(fRandom); col = ARX_CLEAN_WARN_CAST_INT(fRandom); if (!ARXPausedTimer) d3dv->color = RGBA_MAKE(col, col, col, col); d3dv->tu = u; d3dv->tv = 0.f; vertex++; d3dv++; d3dvs.sx = this->pos.x + vertex->x; d3dvs.sy = this->pos.y; d3dvs.sz = this->pos.z + vertex->z; EE_RT2(&d3dvs, d3dv); fRandom = rnd() * 80.f ; ARX_CHECK_INT(fRandom); col = ARX_CLEAN_WARN_CAST_INT(fRandom); if (!ARXPausedTimer) d3dv->color = RGBA_MAKE(0, 0, 0, col); d3dv->tu = u; d3dv->tv = 0.9999999f; vertex++; d3dv++; u += du; nb--; } u = ddu; du = -du; } nbc = 3; while (nbc--) { int j = ARX_PARTICLES_GetFree(); if ((j != -1) && (!ARXPausedTimer)) { ParticleCount++; particle[j].exist = 1; particle[j].zdec = 0; float a = DEG2RAD(360.f * rnd()); particle[j].ov.x = this->pos.x + this->rbase * EEcos(a); particle[j].ov.y = this->pos.y; particle[j].ov.z = this->pos.z + this->rbase * EEsin(a); float t = EEDistance3D(&particle[j].ov, &this->pos); particle[j].move.x = (5.f + 5.f * rnd()) * ((particle[j].ov.x - this->pos.x) / t); particle[j].move.y = 3.f * rnd(); particle[j].move.z = (5.f + 5.f * rnd()) * ((particle[j].ov.z - this->pos.z) / t); particle[j].siz = 30.f + 30.f * rnd(); particle[j].tolive = 3000; particle[j].scale.x = 1.f; particle[j].scale.y = 1.f; particle[j].scale.z = 1.f; particle[j].timcreation = -(long)(ARXTime + 3000); //spells[i].lastupdate; particle[j].tc = NULL; particle[j].special = FIRE_TO_SMOKE | FADE_IN_AND_OUT | ROTATING | MODULATE_ROTATION | DISSIPATING; particle[j].fparam = 0.0000001f; particle[j].r = 1.f; particle[j].g = 1.f; particle[j].b = 1.f; } } 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.sx = this->pos.x + vertex->x; d3dvs.sy = this->pos.y + vertex->y; d3dvs.sz = this->pos.z + vertex->z; EE_RT2(&d3dvs, d3dv); col = (int)(rnd() * 80.f); if (!ARXPausedTimer) d3dv->color = RGBA_MAKE(col, col, col, col); d3dv->tu = u; d3dv->tv = 0.f; vertex++; d3dv++; d3dvs.sx = this->pos.x + vertex->x; d3dvs.sy = this->pos.y; d3dvs.sz = this->pos.z + vertex->z; EE_RT2(&d3dvs, d3dv); col = (int)(rnd() * 80.f); if (!ARXPausedTimer) d3dv->color = RGBA_MAKE(0, 0, 0, col); d3dv->tu = u; d3dv->tv = 1; vertex++; d3dv++; u += du; nb--; } u = ddu; du = -du; } nbc = 10; while (nbc--) { int j = ARX_PARTICLES_GetFree(); if ((j != -1) && (!ARXPausedTimer)) { ParticleCount++; particle[j].exist = 1; particle[j].zdec = 0; float a = DEG2RAD(360.f * rnd()); particle[j].ov.x = this->pos.x + this->rbase * EEcos(a); particle[j].ov.y = this->pos.y; particle[j].ov.z = this->pos.z + this->rbase * EEsin(a); float t = EEDistance3D(&particle[j].ov, &this->pos); particle[j].move.x = (5.f + 5.f * rnd()) * ((particle[j].ov.x - this->pos.x) / t); particle[j].move.y = 3.f * rnd(); particle[j].move.z = (5.f + 5.f * rnd()) * ((particle[j].ov.z - this->pos.z) / t); particle[j].siz = 30.f + 30.f * rnd(); particle[j].tolive = 3000; particle[j].scale.x = 1.f; particle[j].scale.y = 1.f; particle[j].scale.z = 1.f; particle[j].timcreation = -(long)(ARXTime + 3000); particle[j].tc = NULL; particle[j].special = FIRE_TO_SMOKE | FADE_IN_AND_OUT | ROTATING | MODULATE_ROTATION | DISSIPATING; particle[j].fparam = 0.0000001f; particle[j].r = 1.f; particle[j].g = 1.f; particle[j].b = 1.f; } } break; } //tracé du cone back device->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE); device->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ONE); SETALPHABLEND(device, TRUE); SETTEXTUREWRAPMODE(device, D3DTADDRESS_MIRROR); if (this->tsouffle) device->SetTexture(0, this->tsouffle->m_pddsSurface); else device->SetTexture(0, NULL); SETCULL(device, D3DCULL_CW); int i = cone[1].conenbfaces - 2; int j = 0; while (i--) { ARX_DrawPrimitive_SoftClippZ(&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_SoftClippZ(&cone[0].coned3d[j], &cone[0].coned3d[j+1], &cone[0].coned3d[j+2]); j++; } //tracé du cone front SETCULL(device, D3DCULL_CCW); i = cone[1].conenbfaces - 2; j = 0; while (i--) { ARX_DrawPrimitive_SoftClippZ(&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_SoftClippZ(&cone[0].coned3d[j], &cone[0].coned3d[j+1], &cone[0].coned3d[j+2]); j++; } //tracé des pierres device->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_SRCALPHA); device->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_INVSRCALPHA); this->DrawStone(device); device->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE); device->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ZERO); SETALPHABLEND(device, FALSE); SETZWRITE(device, TRUE); return 0; }
//--------------------------------------------------------------------- float CRepelUndead::Render(LPDIRECT3DDEVICE7 m_pd3dDevice) { if (ulCurrentTime >= ulDuration) { return 0.f; } SETZWRITE(m_pd3dDevice, FALSE); m_pd3dDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE); m_pd3dDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ONE); SETALPHABLEND(m_pd3dDevice, TRUE); //---------------------------- EERIE_3D eObjAngle; EERIE_3D eObjPos; EERIE_3D eObjScale; EERIE_RGB rgbObjColor; eObjAngle.b = fBeta; eObjAngle.a = 0; eObjAngle.g = 0; eObjPos.x = eSrc.x; eObjPos.y = eSrc.y - 5.f; eObjPos.z = eSrc.z; rgbObjColor.r = 0.6f; rgbObjColor.g = 0.6f; rgbObjColor.b = 0.8f; float vv = 1.f + (EEsin(ARX_TIME_Get() * DIV1000)); vv *= DIV2; vv += 1.1f; eObjScale.z = vv; eObjScale.y = vv; eObjScale.x = vv; if (ssol) DrawEERIEObjEx(m_pd3dDevice, ssol, &eObjAngle, &eObjPos, &eObjScale, &rgbObjColor); vv *= 100.f; for (int n = 0; n < 4; n++) { int j = ARX_PARTICLES_GetFree(); if ((j != -1) && (!ARXPausedTimer)) { ParticleCount++; particle[j].exist = 1; particle[j].zdec = 0; particle[j].ov.x = eSrc.x - EEsin(frand2() * 360.f) * vv; particle[j].ov.y = eSrc.y; particle[j].ov.z = eSrc.z + EEcos(frand2() * 360.f) * vv; particle[j].move.x = 0.8f * frand2(); particle[j].move.y = -4.f * rnd(); particle[j].move.z = 0.8f * frand2(); particle[j].scale.x = -0.1f; particle[j].scale.y = -0.1f; particle[j].scale.z = -0.1f; particle[j].timcreation = lARXTime; particle[j].tolive = 2600 + (unsigned long)(rnd() * 600.f); particle[j].tc = tex_p2; particle[j].siz = 0.3f; particle[j].r = 0.4f; particle[j].g = 0.4f; particle[j].b = 0.6f; } } if (this->lLightId == -1) this->lLightId = GetFreeDynLight(); if (this->lLightId != -1) { long id = this->lLightId; DynLight[id].exist = 1; DynLight[id].intensity = 2.3f; DynLight[id].fallend = 350.f; DynLight[id].fallstart = 150.f; DynLight[id].rgb.r = 0.8f; DynLight[id].rgb.g = 0.8f; DynLight[id].rgb.b = 1; DynLight[id].pos.x = eSrc.x; DynLight[id].pos.y = eSrc.y - 50.f; DynLight[id].pos.z = eSrc.z; DynLight[id].duration = 200; DynLight[id].time_creation = ARXTimeUL(); } return 1; }
//--------------------------------------------------------------------- float CNegateMagic::Render() { int i = 0; if (spells[spellinstance].caster == 0) { eSrc.x = player.pos.x; eSrc.y = player.pos.y + 170.f; eSrc.z = player.pos.z; } else { eSrc.x = inter.iobj[spells[spellinstance].caster]->pos.x; eSrc.y = inter.iobj[spells[spellinstance].caster]->pos.y; eSrc.z = inter.iobj[spells[spellinstance].caster]->pos.z; } float x = eSrc.x; float y = eSrc.y - 10.f; float z = eSrc.z; if (ulCurrentTime >= ulDuration) { return 0.f; } GRenderer->SetRenderState(Renderer::DepthWrite, false); GRenderer->SetRenderState(Renderer::AlphaBlending, true); GRenderer->SetTexture(0, tex_sol); GRenderer->SetBlendFunc(Renderer::BlendOne, Renderer::BlendOne); GRenderer->SetRenderState(Renderer::AlphaBlending, true); fSize = ulCurrentTime * fOneOnDuration * 200; for (i = 0; i < 360; i++) { float t = rnd(); if (t < 0.04f) { int j = ARX_PARTICLES_GetFree(); if ((j != -1) && (!arxtime.is_paused())) { ParticleCount++; particle[j].exist = 1; particle[j].zdec = 0; particle[j].ov.x = x + frand2() * 150.f; particle[j].ov.y = y; particle[j].ov.z = z + frand2() * 150.f; particle[j].move.x = 0; particle[j].move.y = - 3.0f * rnd(); particle[j].move.z = 0; particle[j].siz = 0.3f; particle[j].tolive = Random::get(2000, 4000); particle[j].scale.x = 1.f; particle[j].scale.y = 1.f; particle[j].scale.z = 1.f; particle[j].timcreation = (long)arxtime; particle[j].tc = tex_p2; particle[j].special = FADE_IN_AND_OUT | ROTATING | MODULATE_ROTATION | DISSIPATING | SUBSTRACT; particle[j].fparam = 0.0000001f; particle[j].rgb = Color3f::white; } } } GRenderer->SetRenderState(Renderer::AlphaBlending, true); Anglef stiteangle(0.f, -(float) ulCurrentTime * fOneOnDuration * 120, 0.f); Vec3f stitepos(x, y, z); Color3f stitecolor(.4f, .4f, .4f); Vec3f stitescale(3.f, 3.f, 3.f); DrawEERIEObjEx(ssol, &stiteangle, &stitepos, &stitescale, &stitecolor); GRenderer->SetBlendFunc(Renderer::BlendOne, Renderer::BlendOne); stitecolor = Color3f(.5f, 0.f, .5f); stitescale = Vec3f(3.1f, 3.1f, 3.1f); DrawEERIEObjEx(ssol, &stiteangle, &stitepos, &stitescale, &stitecolor); return 1; }
/*--------------------------------------------------------------------------*/ float CPortal::Render(LPDIRECT3DDEVICE7 device) { SETALPHABLEND(device, TRUE); SETZWRITE(device, FALSE); device->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE); device->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ONE); //calcul sphere int nb = this->spherenbpt; D3DTLVERTEX * v = this->sphered3d, d3dvs; EERIE_3D * pt = this->spherevertex; int col = RGBA_MAKE(0, (int)(200.f * this->spherealpha), (int)(255.f * this->spherealpha), 255); while (nb) { d3dvs.sx = pt->x + this->pos.x; //pt du bas d3dvs.sy = pt->y + this->pos.y; d3dvs.sz = pt->z + this->pos.z; EE_RTP(&d3dvs, v); if (!ARXPausedTimer) v->color = col; v++; pt++; nb--; } //update les couleurs aux impacts nb = 256; while (nb--) { if (this->tabeclair[nb].actif) { float a; a = 1.f - ((float)this->tabeclair[nb].currduration / (float)this->tabeclair[nb].duration); if (a < 0.f) a = 0.f; if (this->tabeclair[nb].numpt >= 0) { int r = (int)((0.f + (255.f - 0.f) * a) * this->spherealpha * 3.f); if (r > 255) r = 255; int g = (int)((200.f + (255.f - 200.f) * a) * this->spherealpha * 3.f); if (g > 255) g = 255; int b = (int)(255.f * this->spherealpha * 3.f); if (b > 255) b = 255; if (!ARXPausedTimer) this->sphered3d[this->tabeclair[nb].numpt].color = RGBA_MAKE(r, g, b, 255); } } } //affichage de la sphere back SETCULL(device, D3DCULL_CW); device->SetTexture(0, NULL); device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, D3DFVF_TLVERTEX, this->sphered3d, this->spherenbpt, (unsigned short *)this->sphereind, this->spherenbfaces * 3, 0); //affichage eclair this->DrawAllEclair(device); //affichage des particules à l'interieur if (rnd() > .25f) { int j = ARX_PARTICLES_GetFree(); if ((j != -1) && (!ARXPausedTimer)) { ParticleCount++; particle[j].exist = 1; particle[j].zdec = 0; float a = rnd() * 360.f; float b = rnd() * 360.f; float rr = this->r * (rnd() + .25f) * 0.05f; particle[j].ov.x = this->pos.x; particle[j].ov.y = this->pos.y; particle[j].ov.z = this->pos.z; particle[j].move.x = rr * EEsin(DEG2RAD(a)) * EEcos(DEG2RAD(b)); particle[j].move.y = rr * EEcos(DEG2RAD(a)); particle[j].move.z = rr * EEsin(DEG2RAD(a)) * EEsin(DEG2RAD(b)); particle[j].siz = 10.f; particle[j].tolive = 1000 + (unsigned long)(float)(rnd() * 1000.f); particle[j].scale.x = 1.f; particle[j].scale.y = 1.f; particle[j].scale.z = 1.f; particle[j].timcreation = lARXTime; particle[j].tc = tp; particle[j].special = FADE_IN_AND_OUT | ROTATING | MODULATE_ROTATION | DISSIPATING; particle[j].fparam = 0.0000001f; particle[j].r = 1.f; particle[j].g = 1.f; particle[j].b = 1.f; } } //affichage de la sphere front SETCULL(device, D3DCULL_CCW); device->SetTexture(0, NULL); device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, D3DFVF_TLVERTEX, this->sphered3d, this->spherenbpt, (unsigned short *)this->sphereind, this->spherenbfaces * 3, 0); device->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE); device->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ZERO); SETALPHABLEND(device, FALSE); SETCULL(device, D3DCULL_NONE); SETZWRITE(device, TRUE); return 0; }
//--------------------------------------------------------------------- float CNegateMagic::Render(LPDIRECT3DDEVICE7 m_pd3dDevice) { int i = 0; if (spells[spellinstance].caster == 0) { eSrc.x = player.pos.x; eSrc.y = player.pos.y + 170.f; eSrc.z = player.pos.z; } else { eSrc.x = inter.iobj[spells[spellinstance].caster]->pos.x; eSrc.y = inter.iobj[spells[spellinstance].caster]->pos.y; eSrc.z = inter.iobj[spells[spellinstance].caster]->pos.z; } float x = eSrc.x; float y = eSrc.y - 10.f; float z = eSrc.z; if (ulCurrentTime >= ulDuration) { return 0.f; } SETZWRITE(m_pd3dDevice, false); SETALPHABLEND(m_pd3dDevice, true); if (tex_sol && tex_sol->m_pddsSurface) { SETTC(m_pd3dDevice, tex_sol); } m_pd3dDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE); m_pd3dDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ONE); SETALPHABLEND(m_pd3dDevice, true); fSize = ulCurrentTime * fOneOnDuration * 200; float size = 50; for (i = 0; i < 360; i++) { float t = rnd(); if (t < 0.04f) { t = rnd(); int j = ARX_PARTICLES_GetFree(); if ((j != -1) && (!ARXPausedTimer)) { ParticleCount++; particle[j].exist = 1; particle[j].zdec = 0; particle[j].ov.x = x + frand2() * 150.f; particle[j].ov.y = y; particle[j].ov.z = z + frand2() * 150.f; particle[j].move.x = 0; particle[j].move.y = - 3.0f * rnd(); particle[j].move.z = 0; particle[j].siz = 0.3f; particle[j].tolive = 2000 + (unsigned long)(float)(rnd() * 2000.f); particle[j].scale.x = 1.f; particle[j].scale.y = 1.f; particle[j].scale.z = 1.f; particle[j].timcreation = lARXTime; particle[j].tc = tex_p2; particle[j].special = FADE_IN_AND_OUT | ROTATING | MODULATE_ROTATION | DISSIPATING | SUBSTRACT; particle[j].fparam = 0.0000001f; particle[j].r = 1.0f; particle[j].g = 1.0f; particle[j].b = 1.0f; } } } //---------------------------- size = 100; EERIE_3D stiteangle; EERIE_3D stitepos; EERIE_3D stitescale; EERIE_RGB stitecolor; stiteangle.b = (float) ulCurrentTime * fOneOnDuration * 120; stiteangle.a = 0; stiteangle.g = 0; stitepos.x = x; stitepos.y = y; stitepos.z = z; SETALPHABLEND(m_pd3dDevice, true); stiteangle.b = -stiteangle.b; stitecolor.r = 0.4f; stitecolor.g = 0.4f; stitecolor.b = 0.4f; stitescale.x = 3.f; stitescale.y = 3.f; stitescale.z = 3.f; DrawEERIEObjEx(m_pd3dDevice, ssol, &stiteangle, &stitepos, &stitescale, &stitecolor); m_pd3dDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE); m_pd3dDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ONE); stitecolor.r = 0.5f; stitecolor.g = 0.f; stitecolor.b = 0.5f; stitescale.x = 3.1f; stitescale.y = 3.1f; stitescale.z = 3.1f; DrawEERIEObjEx(m_pd3dDevice, ssol, &stiteangle, &stitepos, &stitescale, &stitecolor); return 1; }
//----------------------------------------------------------------------------- // Updates all currently launched projectiles void ARX_MISSILES_Update() { long framediff, framediff3; Vec3f orgn, dest, hit; TextureContainer * tc = TC_fire; EERIEPOLY *tp = NULL; unsigned long tim = ARXTimeUL(); for (unsigned long i(0); i < MAX_MISSILES; i++) { if (missiles[i].type == MISSILE_NONE) continue; framediff = missiles[i].timecreation + missiles[i].tolive - tim; if (framediff < 0) { ARX_MISSILES_Kill(i); continue; } framediff3 = tim - missiles[i].timecreation; switch (missiles[i].type) { case MISSILE_NONE: break; case MISSILE_FIREBALL: { Vec3f pos; pos = missiles[i].startpos + missiles[i].velocity * framediff3; if (missiles[i].longinfo != -1) { DynLight[missiles[i].longinfo].pos = pos; } #ifdef BUILD_EDITOR if (USE_COLLISIONS) #endif { orgn = missiles[i].lastpos; dest = pos; EERIEPOLY *ep; EERIEPOLY *epp; Vec3f tro; tro.x = 70.0F; tro.y = 70.0F; tro.z = 70.0F; CURRENTINTER = NULL; ep = GetMinPoly(dest.x, dest.y, dest.z); epp = GetMaxPoly(dest.x, dest.y, dest.z); if(closerThan(player.pos, pos, 200.f)) { ARX_MISSILES_Kill(i); ARX_BOOMS_Add(&pos); Add3DBoom(&pos); DoSphericDamage(&dest, 180.0F, 200.0F, DAMAGE_AREAHALF, DAMAGE_TYPE_FIRE | DAMAGE_TYPE_MAGICAL); break; } if (ep && ep->center.y < dest.y) { ARX_MISSILES_Kill(i); ARX_BOOMS_Add(&dest); Add3DBoom(&dest); DoSphericDamage(&dest, 180.0F, 200.0F, DAMAGE_AREAHALF, DAMAGE_TYPE_FIRE | DAMAGE_TYPE_MAGICAL); break; } if (epp && epp->center.y > dest.y) { ARX_MISSILES_Kill(i); ARX_BOOMS_Add(&dest); Add3DBoom(&dest); DoSphericDamage(&dest, 180.0F, 200.0F, DAMAGE_AREAHALF, DAMAGE_TYPE_FIRE | DAMAGE_TYPE_MAGICAL); break; } if (EERIELaunchRay3(&orgn, &dest, &hit, tp, 1)) { ARX_MISSILES_Kill(i); ARX_BOOMS_Add(&hit); Add3DBoom(&hit); DoSphericDamage(&dest, 180.0F, 200.0F, DAMAGE_AREAHALF, DAMAGE_TYPE_FIRE | DAMAGE_TYPE_MAGICAL); break; } if ( !EECheckInPoly(&dest) || EEIsUnderWater(&dest) ) { ARX_MISSILES_Kill(i); ARX_BOOMS_Add(&dest); Add3DBoom(&dest); DoSphericDamage(&dest, 180.0F, 200.0F, DAMAGE_AREAHALF, DAMAGE_TYPE_FIRE | DAMAGE_TYPE_MAGICAL); break; } long ici = IsCollidingAnyInter(dest.x, dest.y, dest.z, &tro); if (ici != -1 && ici != missiles[i].owner) { ARX_MISSILES_Kill(i); ARX_BOOMS_Add(&dest); Add3DBoom(&dest); DoSphericDamage(&dest, 180.0F, 200.0F, DAMAGE_AREAHALF, DAMAGE_TYPE_FIRE | DAMAGE_TYPE_MAGICAL); break; } } long j = ARX_PARTICLES_GetFree(); if (j != -1 && !ARXPausedTimer) { ParticleCount++; particle[j].exist = true; particle[j].zdec = 0; particle[j].ov.x = pos.x; particle[j].ov.y = pos.y; particle[j].ov.z = pos.z; particle[j].move.x = missiles[i].velocity.x + 3.0f - 6.0F * rnd(); particle[j].move.y = missiles[i].velocity.y + 4.0F - 12.0F * rnd(); particle[j].move.z = missiles[i].velocity.z + 3.0F - 6.0F * rnd(); particle[j].timcreation = tim; particle[j].tolive = 500 + (unsigned long)(rnd() * 500.f); particle[j].tc = tc; particle[j].siz = 12.0F * (float)(missiles[i].tolive - framediff3) * ( 1.0f / 4000 ); particle[j].scale.x = 15.0F + rnd() * 5.0F; particle[j].scale.y = 15.0F + rnd() * 5.0F; particle[j].scale.z = 15.0F + rnd() * 5.0F; particle[j].special = FIRE_TO_SMOKE; } missiles[i].lastpos.x = pos.x; missiles[i].lastpos.y = pos.y; missiles[i].lastpos.z = pos.z; break; } } missiles[i].lastupdate = tim; } }