void CCurse::Render() { RenderMaterial mat; mat.setCulling(Renderer::CullCW); mat.setDepthTest(true); mat.setBlendType(RenderMaterial::Opaque); Anglef stiteangle = Anglef(0, fRot, 0); Vec3f stitepos = eTarget; Vec3f stitescale = Vec3f_ONE; Color3f stitecolor = Color3f::white; Draw3DObject(svoodoo, stiteangle, stitepos, stitescale, stitecolor, mat); for(int i = 0; i < 4; i++) { PARTICLE_DEF * pd = createParticle(); if(!pd) { break; } pd->ov = eTarget; pd->move = Vec3f(2.f * frand2(), rnd() * -10.f - 10.f, 2.f * frand2()); pd->siz = 0.015f; pd->tolive = Random::get(1000, 1600); pd->tc = tex_p1; pd->special = ROTATING | MODULATE_ROTATION | DISSIPATING | SUBSTRACT | GRAVITY; pd->fparam = 0.0000001f; } }
void CurseSpell::Update() { fRot += g_gameTime.lastFrameDuration() / GameDurationMs(4); Vec3f target = Vec3f_ZERO; Entity * targetIo = entities.get(m_target); if(targetIo) { target = targetIo->pos; if(m_target == EntityHandle_Player) target.y -= 200.f; else target.y += targetIo->physics.cyl.height - 30.f; } m_pos = target; RenderMaterial mat; mat.setCulling(CullCW); mat.setDepthTest(true); mat.setBlendType(RenderMaterial::Opaque); Draw3DObject(svoodoo, Anglef(0, fRot, 0), m_pos, Vec3f_ONE, Color3f::white, mat); for(int i = 0; i < 4; i++) { PARTICLE_DEF * pd = createParticle(); if(!pd) { break; } pd->ov = m_pos; pd->move = arx::linearRand(Vec3f(-2.f, -20.f, -2.f), Vec3f(2.f, -10.f, 2.f)); pd->siz = 0.015f; pd->tolive = Random::getu(1000, 1600); pd->tc = tex_p1; pd->m_flags = ROTATING | DISSIPATING | SUBSTRACT | GRAVITY; pd->m_rotation = 0.0000001f; } }
void CurseSpell::Update(float timeDelta) { fRot += timeDelta * 0.25f; Vec3f target = Vec3f_ZERO; if(ValidIONum(m_target)) { target = entities[m_target]->pos; if(m_target == PlayerEntityHandle) target.y -= 200.f; else target.y += entities[m_target]->physics.cyl.height - 30.f; } m_pos = target; RenderMaterial mat; mat.setCulling(Renderer::CullCW); mat.setDepthTest(true); mat.setBlendType(RenderMaterial::Opaque); Draw3DObject(svoodoo, Anglef(0, fRot, 0), m_pos, Vec3f_ONE, Color3f::white, mat); for(int i = 0; i < 4; i++) { PARTICLE_DEF * pd = createParticle(); if(!pd) { break; } pd->ov = m_pos; pd->move = Vec3f(2.f * frand2(), rnd() * -10.f - 10.f, 2.f * frand2()); pd->siz = 0.015f; pd->tolive = Random::get(1000, 1600); pd->tc = tex_p1; pd->special = ROTATING | MODULATE_ROTATION | DISSIPATING | SUBSTRACT | GRAVITY; pd->fparam = 0.0000001f; } }
void CMagicMissile::Render() { Vec3f lastpos, newpos; Vec3f v; if(ulCurrentTime >= ulDuration) return; RenderMaterial mat; mat.setCulling(Renderer::CullNone); mat.setDepthTest(true); mat.setBlendType(RenderMaterial::Additive); if(tex_mm) mat.setTexture(tex_mm); if(bMove) { float fOneOnDuration = 1.f / (float)(ulDuration); fTrail = (ulCurrentTime * fOneOnDuration) * (iBezierPrecision + 2) * 5; } newpos = lastpos = pathways[0]; for(int i = 0; i < 5; i++) { int kp = i; int kpprec = (i > 0) ? kp - 1 : kp ; int kpsuiv = kp + 1 ; int kpsuivsuiv = (i < (5 - 2)) ? kpsuiv + 1 : kpsuiv; for(int toto = 1; toto < iBezierPrecision; toto++) { if(fTrail < i * iBezierPrecision + toto) break; float t = toto * fOneOnBezierPrecision; 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].x; float p0 = 0.5f * (val - pathways[kpprec].x) ; float p1 = 0.5f * (pathways[kpsuivsuiv].x - pathways[kp].x) ; v.x = f0 * pathways[kp].x + f1 * val + f2 * p0 + f3 * p1 ; val = pathways[kpsuiv].y ; p0 = 0.5f * (val - pathways[kpprec].y) ; p1 = 0.5f * (pathways[kpsuivsuiv].y - pathways[kp].y) ; v.y = f0 * pathways[kp].y + f1 * val + f2 * p0 + f3 * p1 ; val = pathways[kpsuiv].z ; p0 = 0.5f * (val - pathways[kpprec].z) ; p1 = 0.5f * (pathways[kpsuivsuiv].z - pathways[kp].z) ; v.z = f0 * pathways[kp].z + f1 * val + f2 * p0 + f3 * p1 ; newpos = v; if(!((fTrail - (i * iBezierPrecision + toto)) > iLength)) { float c; if(fTrail < iLength) { c = 1.0f - ((fTrail - (i * iBezierPrecision + toto)) / fTrail); } else { c = 1.0f - ((fTrail - (i * iBezierPrecision + toto)) / (float)iLength); } float fsize = c; float alpha = c - 0.2f; if(alpha < 0.2f) alpha = 0.2f; c += Random::getf(-0.1f, 0.1f); c = glm::clamp(c, 0.f, 1.f); Color color = (m_trailColor * (c * alpha)).to<u8>(); if(fsize < 0.5f) fsize = fsize * 2 * 3; else fsize = (1.0f - fsize + 0.5f) * 2 * (3 * 0.5f); float fs = fsize * 6 + Random::getf(0.f, 0.3f); float fe = fsize * 6 + Random::getf(0.f, 0.3f); Draw3DLineTexNew(mat, lastpos, newpos, color, color, fs, fe); } Vec3f temp_vector = lastpos; lastpos = newpos; newpos = temp_vector; } } Vec3f av = newpos - lastpos; float bubu = getAngle(av.x, av.z, 0, 0); float bubu1 = getAngle(av.x, av.y, 0, 0); eCurPos = lastpos; Anglef stiteangle; stiteangle.setPitch(-glm::degrees(bubu)); stiteangle.setYaw(0); stiteangle.setRoll(-(glm::degrees(bubu1))); if(av.x < 0) stiteangle.setRoll(stiteangle.getRoll() - 90); if(av.x > 0) stiteangle.setRoll(stiteangle.getRoll() + 90); if(stiteangle.getRoll() < 0) stiteangle.setRoll(stiteangle.getRoll() + 360.0f); Draw3DObject(smissile, stiteangle, eCurPos, Vec3f_ONE, m_projectileColor, mat); }
void RotatingCone::Render() { float u = m_ang; float du = .99999999f / float(Def); Vec3f * vertex = conevertex; TexturedVertexUntransformed * d3dv = coned3d; int nb = VertexCount / 2; while(nb) { d3dv->p = m_pos + *(vertex + 1) + ((*vertex - *(vertex + 1)) * m_coneScale); // TODO per-frame randomness int col = Random::get(0, 80); if(!g_gameTime.isPaused()) { d3dv->color = Color::gray(float(col) / 255.f).toRGB(col); } d3dv->uv.x = u; d3dv->uv.y = 0.f; vertex++; d3dv++; d3dv->p = m_pos + Vec3f(vertex->x, 0.f, vertex->z); // TODO per-frame randomness col = Random::get(0, 80); if(!g_gameTime.isPaused()) { d3dv->color = Color::black.toRGB(col); } d3dv->uv.x = u; d3dv->uv.y = 1.f; vertex++; d3dv++; u += du; nb--; } RenderMaterial mat; mat.setDepthTest(true); mat.setBlendType(RenderMaterial::Additive); mat.setWrapMode(TextureStage::WrapMirror); mat.setTexture(m_tsouffle); mat.setCulling(CullCW); int i = FaceCount - 2; int j = 0; while(i--) { drawTriangle(mat, &coned3d[j]); j++; } mat.setCulling(CullCCW); i = FaceCount - 2; j = 0; while(i--) { drawTriangle(mat, &coned3d[j]); j++; } }
void CLightning::Render() { if(ulCurrentTime >= ulDuration) return; if(m_iTTL <= 0) { fTotoro = 0; fMySize = 2; ReCreate(8); } Vec3f ePos; float fBeta = 0.f; float falpha = 0.f; if(m_isMassLightning) { ePos = Vec3f_ZERO; } else { ePos = m_pos; fBeta = m_beta; falpha = m_alpha; } float f = 1.5f * fMySize; m_cnodetab[0].f = randomVec(-f, f); RenderMaterial mat; mat.setCulling(Renderer::CullNone); mat.setDepthTest(false); mat.setBlendType(RenderMaterial::Additive); float fbeta = fBeta + rnd() * 2 * fMySize; for(size_t i = 0; i < m_nbtotal && i <= fTotoro; i++) { CLightningNode & node = m_cnodetab[i]; Vec3f astart = m_cnodetab[node.parent].pos + m_cnodetab[node.parent].f; float temp = 1.5f * fMySize; Vec3f z_z = m_cnodetab[node.parent].f + randomVec(-temp, temp); float zz = node.size + node.size * 0.3f * rnd(); float xx = node.size * glm::cos(glm::radians(-fbeta)); node.f = z_z; Vec3f a = node.pos + z_z; if(!m_isMassLightning) { Vec3f vv2; Vec3f vv1 = astart; vv1 = VRotateX(vv1, (falpha)); vv2 = VRotateY(vv1, 180 - MAKEANGLE(fBeta)); astart = vv2; vv1 = a; vv1 = VRotateX(vv1, (falpha)); vv2 = VRotateY(vv1, 180 - MAKEANGLE(fBeta)); a = vv2; astart += ePos; a += ePos; } if(i % 4 == 0) { Sphere sphere; sphere.origin = a; sphere.radius = std::min(node.size, 50.f); if(CheckAnythingInSphere(sphere, m_caster, CAS_NO_SAME_GROUP)) { DamageParameters damage; damage.pos = sphere.origin; damage.radius = sphere.radius; damage.damages = m_fDamage * m_level * ( 1.0f / 3 ); damage.area = DAMAGE_FULL; damage.duration = 1; damage.source = m_caster; damage.flags = DAMAGE_FLAG_DONT_HURT_SOURCE | DAMAGE_FLAG_ADD_VISUAL_FX; damage.type = DAMAGE_TYPE_FAKEFIRE | DAMAGE_TYPE_MAGICAL | DAMAGE_TYPE_LIGHTNING; DamageCreate(damage); } } { TexturedQuad q; q.v[0].color = Color(255, 255, 255, 255).toRGBA(); q.v[1].color = Color(0, 0, 90, 255).toRGBA(); q.v[2].color = Color(0, 0, 90, 255).toRGBA(); q.v[3].color = Color(255, 255, 255, 255).toRGBA(); q.v[0].uv = Vec2f(0.5f, 0.f); q.v[1].uv = Vec2f_ZERO; q.v[2].uv = Vec2f_Y_AXIS; q.v[3].uv = Vec2f(0.5f, 1.f); q.v[0].p = astart; q.v[1].p = astart + Vec3f(0.f, zz, 0.f); q.v[2].p = a + Vec3f(0.f, zz, 0.f); q.v[3].p = a; drawQuadRTP(mat, q); } { TexturedQuad q; q.v[0].color = Color(255, 255, 255, 255).toRGBA(); q.v[1].color = Color(0, 0, 90, 255).toRGBA(); q.v[2].color = Color(0, 0, 90, 255).toRGBA(); q.v[3].color = Color(255, 255, 255, 255).toRGBA(); q.v[0].uv = Vec2f(0.5f, 0.f); q.v[1].uv = Vec2f_X_AXIS; q.v[2].uv = Vec2f_ONE; q.v[3].uv = Vec2f(0.5f, 1.f); q.v[0].p = astart; q.v[1].p = astart - Vec3f(0.f, zz, 0.f); q.v[2].p = a - Vec3f(0.f, zz, 0.f); q.v[3].p = a; drawQuadRTP(mat, q); } zz *= glm::sin(glm::radians(fbeta)); { TexturedQuad q; q.v[0].color = Color(255, 255, 255, 255).toRGBA(); q.v[1].color = Color(0, 0, 90, 255).toRGBA(); q.v[2].color = Color(0, 0, 90, 255).toRGBA(); q.v[3].color = Color(255, 255, 255, 255).toRGBA(); q.v[0].uv = Vec2f(0.5f, 0.f); q.v[1].uv = Vec2f_X_AXIS; q.v[2].uv = Vec2f_ONE; q.v[3].uv = Vec2f(0.5f, 1.f); q.v[0].p = astart; q.v[1].p = astart + Vec3f(xx, 0.f, zz); q.v[2].p = a + Vec3f(xx, 0.f, zz); q.v[3].p = a; drawQuadRTP(mat, q); } { TexturedQuad q; q.v[0].color = Color(255, 255, 255, 255).toRGBA(); q.v[1].color = Color(0, 0, 90, 255).toRGBA(); q.v[2].color = Color(0, 0, 90, 255).toRGBA(); q.v[3].color = Color(255, 255, 255, 255).toRGBA(); q.v[0].uv = Vec2f(0.5f, 0.f); q.v[1].uv = Vec2f_ZERO; q.v[2].uv = Vec2f_Y_AXIS; q.v[3].uv = Vec2f(0.5f, 1.f); q.v[0].p = astart; q.v[1].p = astart - Vec3f(xx, 0.f, zz); q.v[2].p = a - Vec3f(xx, 0.f, zz); q.v[3].p = a; drawQuadRTP(mat, q); } } }
// TODO copy-paste spell effect Fissure void CSummonCreature::RenderFissure() { int i; float ff; Vec3f vt[4]; TexturedVertex vr[4]; Vec3f target; Vec3f etarget; etarget.x = fBetaRadCos; etarget.y = 0; etarget.z = fBetaRadSin; RenderMaterial mat; mat.setCulling(Renderer::CullNone); mat.setDepthTest(false); mat.setWrapMode(TextureStage::WrapClamp); mat.setBlendType(RenderMaterial::Opaque); mat.setLayer(RenderMaterial::EffectForeground); //------------------------------------------------------------------------- // computation des sommets 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)); float fTempCos = ff * fBetaRadCos; float fTempSin = ff * fBetaRadSin; va[i].x = v1a[i].x + sizeF * fTempCos; va[i].y = v1a[i].y; va[i].z = v1a[i].z + sizeF * fTempSin; vb[i].x = v1b[i].x - sizeF * fTempCos; vb[i].y = v1b[i].y; vb[i].z = v1b[i].z - sizeF * fTempSin; va[i].x += rnd() * 0.5f * fTempCos; va[i].z += rnd() * 0.5f * fTempSin; vb[i].x -= rnd() * 0.5f * fTempCos; vb[i].z -= rnd() * 0.5f * fTempSin; } //------------------------------------------------------------------------- // rendu de la fissure mat.setBlendType(RenderMaterial::Opaque); vr[0].color = vr[1].color = vr[2].color = vr[3].color = Color::black.toRGB(); if(bIntro) { for(i = 0; i < std::min(end, (int)fSizeIntro); i++) { vr[0].p = EE_RT(v1a[i]); vr[1].p = EE_RT(v1b[i]); vr[2].p = EE_RT(v1a[i+1]); vr[3].p = EE_RT(v1b[i+1]); drawTriangle(mat, &vr[0]); drawTriangle(mat, &vr[1]); } } else { for(i = 0; i < std::min(end, (int)fSizeIntro); i++) { vr[0].p = EE_RT(va[i]); vr[1].p = EE_RT(vb[i]); vr[2].p = EE_RT(va[i+1]); vr[3].p = EE_RT(vb[i+1]); drawTriangle(mat, &vr[0]); drawTriangle(mat, &vr[1]); } } //------------------------------------------------------------------------- // rendu de la bordure mat.setBlendType(RenderMaterial::Additive); vr[0].color = vr[1].color = Color::black.toRGB(); vr[2].color = vr[3].color = fColorBorder.toRGB(); for(i = 0; i < std::min(end, (int)fSizeIntro); i++) { vt[2] = va[i] - (va[i] - eSrc) * 0.2f; vt[3] = va[i + 1] - (va[i + 1] - eSrc) * 0.2f; vr[0].p = EE_RT(vt[3]); vr[1].p = EE_RT(vt[2]); vr[2].p = EE_RT(va[i+1]); vr[3].p = EE_RT(va[i]); drawTriangle(mat, &vr[0]); drawTriangle(mat, &vr[1]); vt[2] = vb[i] - (vb[i] - eSrc) * 0.2f; vt[3] = vb[i + 1] - (vb[i + 1] - eSrc) * 0.2f; vr[3].p = EE_RT(vb[i]); vr[2].p = EE_RT(vb[i+1]); vr[1].p = EE_RT(vt[2]); vr[0].p = EE_RT(vt[3]); drawTriangle(mat, &vr[0]); drawTriangle(mat, &vr[1]); } //------------------------------------------------------------------------- // rendu des faisceaux // blend additif ou mul // smooth sur les cotés ou pas .. // texture sympa avec glow au milieu ou uv wrap mat.setWrapMode(TextureStage::WrapMirror); mat.setTexture(tex_light); target.x = eSrc.x + -fBetaRadSin * (1.5f * sizeF); target.y = eSrc.y; target.z = eSrc.z + fBetaRadCos * (1.5f * sizeF); EE_RTP(vt[1], &vr[0]); vr[0].color = vr[1].color = fColorRays1.toRGB(); vr[2].color = vr[3].color = fColorRays2.toRGB(); 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] = va[i]; vt[1] = va[i + 1]; vt[2] = va[i] + (va[i] - target) * 2.f; vt[3] = va[i + 1] + (va[i + 1] - target) * 2.f; vr[0].color = (fColorRays1 * tfRaysa[i]).toRGB(); vr[1].color = (fColorRays1 * tfRaysa[i + 1]).toRGB(); vr[2].color = (fColorRays2 * tfRaysa[i]).toRGB(); vr[3].color = (fColorRays2 * tfRaysa[i + 1]).toRGB(); vr[3].p = EE_RT(vt[0]); vr[2].p = EE_RT(vt[1]); vr[1].p = EE_RT(vt[2]); vr[0].p = EE_RT(vt[3]); drawTriangle(mat, &vr[0]); drawTriangle(mat, &vr[1]); } if(i < fSizeIntro) { vt[0] = vb[i + 1]; vt[1] = vb[i]; vt[2] = vb[i + 1] + (vb[i + 1] - target) * 2.f; vt[3] = vb[i] + (vb[i] - target) * 2.f; vr[0].color = (fColorRays1 * tfRaysb[i]).toRGB(); vr[1].color = (fColorRays1 * tfRaysb[i + 1]).toRGB(); vr[2].color = (fColorRays2 * tfRaysb[i]).toRGB(); vr[3].color = (fColorRays2 * tfRaysb[i + 1]).toRGB(); vr[3].p = EE_RT(vt[0]); vr[2].p = EE_RT(vt[1]); vr[1].p = EE_RT(vt[2]); vr[0].p = EE_RT(vt[3]); drawTriangle(mat, &vr[0]); drawTriangle(mat, &vr[1]); } } }
// TODO copy-paste spell effect Fissure void CRiseDead::RenderFissure() { float ff; Vec3f vt[4]; TexturedVertexUntransformed vr[4]; Vec3f target; RenderMaterial mat; mat.setCulling(CullNone); mat.setDepthTest(false); mat.setWrapMode(TextureStage::WrapClamp); mat.setBlendType(RenderMaterial::Opaque); mat.setLayer(RenderMaterial::EffectForeground); //------------------------------------------------------------------------- // computation des sommets for(int 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)); float fTempCos = ff * fBetaRadCos; float fTempSin = ff * fBetaRadSin; va[i].x = v1a[i].x + sizeF * fTempCos; va[i].y = v1a[i].y; va[i].z = v1a[i].z + sizeF * fTempSin; vb[i].x = v1b[i].x - sizeF * fTempCos; vb[i].y = v1b[i].y; vb[i].z = v1b[i].z - sizeF * fTempSin; va[i].x += Random::getf(0.f, 0.5f) * fTempCos; va[i].z += Random::getf(0.f, 0.5f) * fTempSin; vb[i].x -= Random::getf(0.f, 0.5f) * fTempCos; vb[i].z -= Random::getf(0.f, 0.5f) * fTempSin; } //------------------------------------------------------------------------- // rendu de la fissure mat.setBlendType(RenderMaterial::Opaque); vr[0].color = vr[1].color = vr[2].color = vr[3].color = Color::black.toRGB(); if(bIntro) { for(int i = 0; i < std::min(end, (int)fSizeIntro); i++) { vr[0].p = v1a[i]; vr[1].p = v1b[i]; vr[2].p = v1a[i+1]; vr[3].p = v1b[i+1]; drawTriangle(mat, &vr[0]); drawTriangle(mat, &vr[1]); } } else { for(int i = 0; i < std::min(end, (int)fSizeIntro); i++) { vr[0].p = va[i]; vr[1].p = vb[i]; vr[2].p = va[i+1]; vr[3].p = vb[i+1]; drawTriangle(mat, &vr[0]); drawTriangle(mat, &vr[1]); } } //------------------------------------------------------------------------- // rendu de la bordure mat.setBlendType(RenderMaterial::Additive); vr[0].color = vr[1].color = Color::black.toRGB(); vr[2].color = vr[3].color = m_colorBorder.toRGB(); for(int i = 0; i < std::min(end, (int)fSizeIntro); i++) { vt[2] = va[i] - (va[i] - m_eSrc) * 0.2f; vt[3] = va[i + 1] - (va[i + 1] - m_eSrc) * 0.2f; vr[0].p = vt[3]; vr[1].p = vt[2]; vr[2].p = va[i+1]; vr[3].p = va[i]; drawTriangle(mat, &vr[0]); drawTriangle(mat, &vr[1]); vt[2] = vb[i] - (vb[i] - m_eSrc) * 0.2f; vt[3] = vb[i + 1] - (vb[i + 1] - m_eSrc) * 0.2f; vr[3].p = vb[i]; vr[2].p = vb[i+1]; vr[1].p = vt[2]; vr[0].p = vt[3]; drawTriangle(mat, &vr[0]); drawTriangle(mat, &vr[1]); } //------------------------------------------------------------------------- // rendu des faisceaux // blend additif ou mul // smooth sur les cotés ou pas .. // texture sympa avec glow au milieu ou uv wrap mat.setWrapMode(TextureStage::WrapMirror); mat.setTexture(tex_light); target.x = m_eSrc.x ; target.y = m_eSrc.y + 1.5f * sizeF; target.z = m_eSrc.z ; vr[0].color = vr[1].color = m_colorRays1.toRGB(); vr[2].color = vr[3].color = m_colorRays2.toRGB(); vr[0].uv = Vec2f(0, 1); vr[1].uv = Vec2f(1, 1); vr[2].uv = Vec2f(0, 0); vr[3].uv = Vec2f(1, 0); for(int i = 0; i < end - 1; i++) { float t = Random::getf(); if(t <= 0.15f) { if(tfRaysa[i] < 1.0f) tfRaysa[i] += 0.02f; if(tfRaysa[i+1] < 1.0f) tfRaysa[i+1] += 0.01f; if(tfRaysa[i] > 1.0f) tfRaysa[i] = 1.0f; if(tfRaysa[i+1] > 1.0f) tfRaysa[i+1] = 1.0f; } if(t >= 0.9f) { if(tfRaysa[i] > 0.0f) tfRaysa[i] -= 0.02f; if(tfRaysa[i+1] > 0.0f) tfRaysa[i+1] -= 0.01f; if(tfRaysa[i] < 0.0f) tfRaysa[i] = 0.0f; if(tfRaysa[i+1] < 0.0f) tfRaysa[i+1] = 0.0f; } float t2 = Random::getf(); if(t2 <= 0.15f) { if(tfRaysb[i] < 1.0f) tfRaysb[i] += 0.02f; if(tfRaysb[i+1] < 1.0f) tfRaysb[i+1] += 0.01f; if(tfRaysb[i] > 1.0f) tfRaysb[i] = 1.0f; if(tfRaysb[i+1] > 1.0f) tfRaysb[i+1] = 1.0f; } if(t2 >= 0.9f) { if(tfRaysb[i] > 0.0f) tfRaysb[i] -= 0.02f; if(tfRaysb[i+1] > 0.0f) tfRaysb[i+1] -= 0.01f; if(tfRaysb[i] < 0.0f) tfRaysb[i] = 0.0f; if(tfRaysb[i+1] < 0.0f) tfRaysb[i+1] = 0.0f; } if(i < fSizeIntro) { vt[0] = va[i]; vt[1] = va[i + 1]; vt[2].x = va[i].x ; vt[2].y = va[i].y + (va[i].y - target.y) * 2; vt[2].z = va[i].z ; vt[3].x = va[i+1].x ; vt[3].y = va[i+1].y + (va[i+1].y - target.y) * 2; vt[3].z = va[i+1].z ; vr[0].color = (m_colorRays1 * tfRaysa[i]).toRGB(); vr[1].color = (m_colorRays1* tfRaysa[i + 1]).toRGB(); vr[2].color = (m_colorRays2 * tfRaysa[i]).toRGB(); vr[3].color = (m_colorRays2 * tfRaysa[i + 1]).toRGB(); vr[0].p = vt[0]; vr[1].p = vt[1]; vr[2].p = vt[2]; vr[3].p = vt[3]; drawTriangle(mat, &vr[0]); drawTriangle(mat, &vr[1]); } if(i < fSizeIntro) { vt[0] = vb[i + 1]; vt[1] = vb[i]; vt[2].x = vb[i+1].x ; vt[2].y = vb[i+1].y + (vb[i+1].y - target.y) * 2; vt[2].z = vb[i+1].z ; vt[3].x = vb[i].x ; vt[3].y = vb[i].y + (vb[i].y - target.y) * 2; vt[3].z = vb[i].z ; vr[0].color = (m_colorRays1 * tfRaysb[i]).toRGB(); vr[1].color = (m_colorRays1 * tfRaysb[i + 1]).toRGB(); vr[2].color = (m_colorRays2 * tfRaysb[i]).toRGB(); vr[3].color = (m_colorRays2 * tfRaysb[i + 1]).toRGB(); vr[0].p = vt[0]; vr[1].p = vt[1]; vr[2].p = vt[2]; vr[3].p = vt[3]; drawTriangle(mat, &vr[0]); drawTriangle(mat, &vr[1]); } } }
void BlessSpell::Update(float timeDelta) { fRot += timeDelta * 0.25f; if(ValidIONum(m_target)) { m_pos = entities[m_target]->pos; if(m_target == PlayerEntityHandle) m_yaw = player.angle.getPitch(); else m_yaw = entities[m_target]->angle.getPitch(); } m_scale = (m_level + 10) * 6.f; Vec3f pos = m_pos + Vec3f(0, -5, 0); RenderMaterial mat; mat.setCulling(Renderer::CullNone); mat.setBlendType(RenderMaterial::Additive); mat.setDepthTest(true); mat.setLayer(RenderMaterial::Decal); mat.setTexture(tex_sol); float fBetaRadCos = glm::cos(glm::radians(MAKEANGLE(m_yaw))) * m_scale; float fBetaRadSin = glm::sin(glm::radians(MAKEANGLE(m_yaw))) * m_scale; ColorRGBA color = Color::white.toRGB(); { TexturedQuad q; q.v[0].color = color; q.v[1].color = color; q.v[2].color = color; q.v[3].color = color; q.v[0].uv = Vec2f_ZERO; q.v[1].uv = Vec2f_X_AXIS; q.v[2].uv = Vec2f_ONE; q.v[3].uv = Vec2f_Y_AXIS; q.v[0].p.x = pos.x + fBetaRadCos - fBetaRadSin; q.v[0].p.y = pos.y; q.v[0].p.z = pos.z + fBetaRadSin + fBetaRadCos; q.v[1].p.x = pos.x - fBetaRadCos - fBetaRadSin; q.v[1].p.y = pos.y; q.v[1].p.z = pos.z - fBetaRadSin + fBetaRadCos; q.v[2].p.x = pos.x - fBetaRadCos + fBetaRadSin; q.v[2].p.y = pos.y; q.v[2].p.z = pos.z - fBetaRadSin - fBetaRadCos; q.v[3].p.x = pos.x + fBetaRadCos + fBetaRadSin; q.v[3].p.y = pos.y; q.v[3].p.z = pos.z + fBetaRadSin - fBetaRadCos; drawQuadRTP(mat, q); } for(int i = 0; i < 12; i++) { PARTICLE_DEF * pd = createParticle(); if(!pd) { break; } pd->ov = m_pos - 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); } }
void CLevitate::Render() { if(this->key > 1) return; //calcul du cone TexturedVertex *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) { Vec3f d3dvs; d3dvs.x = m_pos.x + (vertex + 1)->x + ((vertex->x - (vertex + 1)->x) * m_coneScale); d3dvs.y = m_pos.y + (vertex + 1)->y + ((vertex->y - (vertex + 1)->y) * m_coneScale); d3dvs.z = m_pos.z + (vertex + 1)->z + ((vertex->z - (vertex + 1)->z) * m_coneScale); d3dv->p = EE_RT(d3dvs); col = Random::get(0, 80); if(!arxtime.is_paused()) d3dv->color = Color::grayb(col).toRGB(col); d3dv->uv.x = u; d3dv->uv.y = 0.f; vertex++; d3dv++; d3dvs.x = m_pos.x + vertex->x; d3dvs.y = m_pos.y; d3dvs.z = m_pos.z + vertex->z; d3dv->p = EE_RT(d3dvs); col = Random::get(0, 80); if(!arxtime.is_paused()) d3dv->color = Color::black.toRGB(col); d3dv->uv.x = u; d3dv->uv.y = 1.f; vertex++; d3dv++; u += du; nb--; } u = ddu; du = -du; } 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) { Vec3f d3dvs = m_pos + *vertex; d3dv->p = EE_RT(d3dvs); col = Random::get(0, 80); if(!arxtime.is_paused()) d3dv->color = Color::grayb(col).toRGB(col); d3dv->uv.x = u; d3dv->uv.y = 0.f; vertex++; d3dv++; d3dvs.x = m_pos.x + vertex->x; d3dvs.y = m_pos.y; d3dvs.z = m_pos.z + vertex->z; d3dv->p = EE_RT(d3dvs); col = Random::get(0, 80); if(!arxtime.is_paused()) d3dv->color = Color::black.toRGB(col); d3dv->uv.x = u; d3dv->uv.y = 1.f; vertex++; d3dv++; u += du; nb--; } u = ddu; du = -du; } break; } //tracé du cone back RenderMaterial mat; mat.setDepthTest(true); mat.setBlendType(RenderMaterial::Additive); mat.setWrapMode(TextureStage::WrapMirror); mat.setTexture(tsouffle); mat.setCulling(Renderer::CullCW); int i = cone[1].conenbfaces - 2; int j = 0; while(i--) { drawTriangle(mat, &cone[1].coned3d[j]); j++; } i = cone[0].conenbfaces - 2; j = 0; while(i--) { drawTriangle(mat, &cone[0].coned3d[j]); j++; } //tracé du cone front mat.setCulling(Renderer::CullCCW); i = cone[1].conenbfaces - 2; j = 0; while(i--) { drawTriangle(mat, &cone[1].coned3d[j]); j++; } i = cone[0].conenbfaces - 2; j = 0; while(i--) { drawTriangle(mat, &cone[0].coned3d[j]); j++; } this->DrawStone(); }
void CBless::Render() { int i = 0; float x = eSrc.x; float y = eSrc.y - 5; float z = eSrc.z; if(ulCurrentTime >= ulDuration) return; RenderMaterial mat; mat.setCulling(Renderer::CullNone); mat.setBlendType(RenderMaterial::Additive); mat.setDepthTest(true); mat.setLayer(RenderMaterial::Decal); mat.setTexture(tex_sol); float fBetaRadCos = glm::cos(glm::radians(MAKEANGLE(m_yaw))) * m_scale; float fBetaRadSin = glm::sin(glm::radians(MAKEANGLE(m_yaw))) * m_scale; ColorRGBA color = Color::white.toRGB(); { TexturedQuad q; q.v[0].color = color; q.v[1].color = color; q.v[2].color = color; q.v[3].color = color; q.v[0].uv = Vec2f_ZERO; q.v[1].uv = Vec2f_X_AXIS; q.v[2].uv = Vec2f_ONE; q.v[3].uv = Vec2f_Y_AXIS; q.v[0].p.x = x + fBetaRadCos - fBetaRadSin; q.v[0].p.y = y; q.v[0].p.z = z + fBetaRadSin + fBetaRadCos; q.v[1].p.x = x - fBetaRadCos - fBetaRadSin; q.v[1].p.y = y; q.v[1].p.z = z - fBetaRadSin + fBetaRadCos; q.v[2].p.x = x - fBetaRadCos + fBetaRadSin; q.v[2].p.y = y; q.v[2].p.z = z - fBetaRadSin - fBetaRadCos; q.v[3].p.x = x + fBetaRadCos + fBetaRadSin; q.v[3].p.y = y; q.v[3].p.z = z + fBetaRadSin - fBetaRadCos; drawQuadRTP(mat, q); } 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); } }
void CMagicMissile::Render() { Vec3f lastpos, newpos; Vec3f v; if(ulCurrentTime >= ulDuration) return; RenderMaterial mat; mat.setCulling(CullNone); mat.setDepthTest(true); mat.setBlendType(RenderMaterial::Additive); if(tex_mm) mat.setTexture(tex_mm); if(bMove) { float fOneOnDuration = 1.f / (float)(ulDuration); fTrail = (ulCurrentTime * fOneOnDuration) * (iBezierPrecision + 2) * 5; } newpos = lastpos = pathways[0]; for(int i = 0; i < 5; i++) { const Vec3f v1 = pathways[std::max(0, i - 1)]; const Vec3f v2 = pathways[i]; const Vec3f v3 = pathways[i + 1]; const Vec3f v4 = pathways[std::min(5, i + 2)]; for(int toto = 1; toto < iBezierPrecision; toto++) { if(fTrail < i * iBezierPrecision + toto) break; float t = toto * (1.0f / iBezierPrecision); v = glm::catmullRom(v1, v2, v3, v4, t); newpos = v; if(!((fTrail - (i * iBezierPrecision + toto)) > iLength)) { float c; if(fTrail < iLength) { c = 1.0f - ((fTrail - (i * iBezierPrecision + toto)) / fTrail); } else { c = 1.0f - ((fTrail - (i * iBezierPrecision + toto)) / (float)iLength); } float fsize = c; float alpha = c - 0.2f; if(alpha < 0.2f) alpha = 0.2f; c += Random::getf(-0.1f, 0.1f); c = glm::clamp(c, 0.f, 1.f); Color color = (m_trailColor * (c * alpha)).to<u8>(); if(fsize < 0.5f) fsize = fsize * 2 * 3; else fsize = (1.0f - fsize + 0.5f) * 2 * (3 * 0.5f); float fs = fsize * 6 + Random::getf(0.f, 0.3f); float fe = fsize * 6 + Random::getf(0.f, 0.3f); Draw3DLineTexNew(mat, lastpos, newpos, color, color, fs, fe); } Vec3f temp_vector = lastpos; lastpos = newpos; newpos = temp_vector; } } Vec3f av = newpos - lastpos; float bubu = getAngle(av.x, av.z, 0, 0); float bubu1 = getAngle(av.x, av.y, 0, 0); eCurPos = lastpos; Anglef stiteangle; stiteangle.setPitch(-glm::degrees(bubu)); stiteangle.setYaw(0); stiteangle.setRoll(-(glm::degrees(bubu1))); if(av.x < 0) stiteangle.setRoll(stiteangle.getRoll() - 90); if(av.x > 0) stiteangle.setRoll(stiteangle.getRoll() + 90); if(stiteangle.getRoll() < 0) stiteangle.setRoll(stiteangle.getRoll() + 360.0f); Draw3DObject(smissile, stiteangle, eCurPos, Vec3f_ONE, m_projectileColor, mat); }
void BlessSpell::Update() { fRot += g_gameTime.lastFrameDuration() / GameDurationMs(4); Entity * target = entities.get(m_target); if(target) { m_pos = target->pos; if(m_target == EntityHandle_Player) m_yaw = player.angle.getYaw(); else m_yaw = target->angle.getYaw(); } m_scale = (m_level + 10) * 6.f; Vec3f pos = m_pos + Vec3f(0, -5, 0); RenderMaterial mat; mat.setCulling(CullNone); mat.setBlendType(RenderMaterial::Additive); mat.setDepthTest(true); mat.setLayer(RenderMaterial::Decal); mat.setTexture(tex_sol); float fBetaRadCos = glm::cos(glm::radians(MAKEANGLE(m_yaw))) * m_scale; float fBetaRadSin = glm::sin(glm::radians(MAKEANGLE(m_yaw))) * m_scale; ColorRGBA color = Color::white.toRGB(); { TexturedQuad q; q.v[0].color = color; q.v[1].color = color; q.v[2].color = color; q.v[3].color = color; q.v[0].uv = Vec2f_ZERO; q.v[1].uv = Vec2f_X_AXIS; q.v[2].uv = Vec2f_ONE; q.v[3].uv = Vec2f_Y_AXIS; q.v[0].p.x = pos.x + fBetaRadCos - fBetaRadSin; q.v[0].p.y = pos.y; q.v[0].p.z = pos.z + fBetaRadSin + fBetaRadCos; q.v[1].p.x = pos.x - fBetaRadCos - fBetaRadSin; q.v[1].p.y = pos.y; q.v[1].p.z = pos.z - fBetaRadSin + fBetaRadCos; q.v[2].p.x = pos.x - fBetaRadCos + fBetaRadSin; q.v[2].p.y = pos.y; q.v[2].p.z = pos.z - fBetaRadSin - fBetaRadCos; q.v[3].p.x = pos.x + fBetaRadCos + fBetaRadSin; q.v[3].p.y = pos.y; q.v[3].p.z = pos.z + fBetaRadSin - fBetaRadCos; drawQuadRTP(mat, q); } for(int i = 0; i < 12; i++) { PARTICLE_DEF * pd = createParticle(); if(!pd) { break; } pd->ov = m_pos - Vec3f(0.f, 20.f, 0.f); pd->move = arx::linearRand(Vec3f(-3.f, 0.f, -3.f), Vec3f(3.f, 0.5f, 3.f)); pd->siz = 0.005f; pd->tolive = Random::getu(1000, 2000); pd->tc = tex_p1; pd->m_flags = FADE_IN_AND_OUT | ROTATING | DISSIPATING; pd->m_rotation = 0.0000001f; pd->rgb = Color3f(0.7f, 0.6f, 0.2f); } }