void NegateMagicSpell::Update() { LaunchAntiMagicField(); if(m_target == EntityHandle_Player) { m_pos = player.basePosition(); } else { Entity * target = entities.get(m_target); if(target) { m_pos = target->pos; } } Vec3f stitepos = m_pos - Vec3f(0.f, 10.f, 0.f); RenderMaterial mat; mat.setLayer(RenderMaterial::Decal); mat.setDepthTest(true); mat.setTexture(tex_sol); mat.setBlendType(RenderMaterial::Additive); for(int i = 0; i < 360; i++) { float t = Random::getf(); if(t < 0.04f) { PARTICLE_DEF * pd = createParticle(); if(!pd) { break; } pd->ov = stitepos + arx::randomOffsetXZ(150.f); pd->move = Vec3f(0.f, Random::getf(-3.f, 0.f), 0.f); pd->siz = 0.3f; pd->tolive = Random::getu(2000, 4000); pd->tc = tex_p2; pd->m_flags = FADE_IN_AND_OUT | ROTATING | DISSIPATING | SUBSTRACT; pd->m_rotation = 0.0000001f; } } float rot = timeWaveSaw(g_gameTime.now(), GameDurationMs(18000)) * 360.f; Anglef stiteangle(0.f, -rot, 0.f); float scalediff = timeWaveSin(g_gameTime.now(), GameDurationMsf(1570.79632f)); { Color3f stitecolor = Color3f::gray(.4f); Vec3f stitescale = Vec3f(3.f + 0.5f * scalediff); Draw3DObject(ssol, stiteangle, stitepos, stitescale, stitecolor, mat); } { Color3f stitecolor = Color3f(.5f, 0.f, .5f); Vec3f stitescale = Vec3f(3.1f + 0.2f * scalediff); Draw3DObject(ssol, stiteangle, stitepos, stitescale, stitecolor, mat); } }
void NegateMagicSpell::Update() { LaunchAntiMagicField(); if(m_target == PlayerEntityHandle) { m_pos = player.basePosition(); } else { m_pos = entities[m_target]->pos; } Vec3f stitepos = m_pos - Vec3f(0.f, 10.f, 0.f); RenderMaterial mat; mat.setLayer(RenderMaterial::Decal); mat.setDepthTest(true); mat.setTexture(tex_sol); mat.setBlendType(RenderMaterial::Additive); for(int i = 0; i < 360; i++) { float t = Random::getf(); if(t < 0.04f) { PARTICLE_DEF * pd = createParticle(); if(!pd) { break; } pd->ov = stitepos + Vec3f(Random::getf(-150.f, 150.f), 0.f, Random::getf(-150.f, 150.f)); pd->move = Vec3f(0.f, Random::getf(-3.f, 0.f), 0.f); pd->siz = 0.3f; pd->tolive = Random::getu(2000, 4000); pd->tc = tex_p2; pd->special = FADE_IN_AND_OUT | ROTATING | MODULATE_ROTATION | DISSIPATING | SUBSTRACT; pd->fparam = 0.0000001f; } } float now = arxtime.now_f(); Anglef stiteangle(0.f, -now * 0.02f, 0.f); float scalediff = std::sin(now * 0.004f); { Color3f stitecolor = Color3f::gray(.4f); Vec3f stitescale = Vec3f(3.f + 0.5f * scalediff); Draw3DObject(ssol, stiteangle, stitepos, stitescale, stitecolor, mat); } { Color3f stitecolor = Color3f(.5f, 0.f, .5f); Vec3f stitescale = Vec3f(3.1f + 0.2f * scalediff); Draw3DObject(ssol, stiteangle, stitepos, stitescale, stitecolor, mat); } }
void CNegateMagic::Render() { int i = 0; Vec3f stitepos = eSrc - Vec3f(0.f, 10.f, 0.f); if(ulCurrentTime >= ulDuration) return; RenderMaterial mat; mat.setLayer(RenderMaterial::Decal); mat.setDepthTest(true); mat.setTexture(tex_sol); mat.setBlendType(RenderMaterial::Additive); for(i = 0; i < 360; i++) { float t = rnd(); if(t < 0.04f) { PARTICLE_DEF * pd = createParticle(); if(!pd) { break; } pd->ov = stitepos + Vec3f(frand2() * 150.f, 0.f, frand2() * 150.f); pd->move = Vec3f(0.f, -3.0f * rnd(), 0.f); pd->siz = 0.3f; pd->tolive = Random::get(2000, 4000); pd->tc = tex_p2; pd->special = FADE_IN_AND_OUT | ROTATING | MODULATE_ROTATION | DISSIPATING | SUBSTRACT; pd->fparam = 0.0000001f; } } Anglef stiteangle(0.f, -(float) ulCurrentTime * 0.02f, 0.f); Color3f stitecolor = Color3f::gray(.4f); float scalediff = std::sin(ulCurrentTime * 0.004f); Vec3f stitescale = Vec3f(3.f + 0.5f * scalediff); Draw3DObject(ssol, stiteangle, stitepos, stitescale, stitecolor, mat); stitecolor = Color3f(.5f, 0.f, .5f); stitescale = Vec3f(3.1f + 0.2f * scalediff); Draw3DObject(ssol, stiteangle, stitepos, stitescale, stitecolor, mat); }
void ARXDRAW_DrawPolyBoom() { ARX_PROFILE_FUNC(); TexturedVertex ltv[4]; GRenderer->SetFogColor(Color::none); // TODO: not handled by RenderMaterial unsigned long tim = (unsigned long)(arxtime); RenderMaterial mat = RenderMaterial::getCurrent(); mat.setDepthBias(8); mat.setLayer(RenderMaterial::Decal); std::vector<POLYBOOM>::iterator pb = polyboom.begin(); while (pb != polyboom.end()) { if(pb->type & 128) { if(pb->timecreation - framedelay > 0) { float fCalc = pb->timecreation - framedelay; pb->timecreation = checked_range_cast<unsigned long>(fCalc); } if(pb->timecreation - framedelay > 0) { float fCalc = pb->timecreation - framedelay; pb->timecreation = checked_range_cast<unsigned long>(fCalc); } } float t = (float)pb->timecreation + (float)pb->tolive - (float)tim; if(t <= 0) { pb = polyboom.erase(pb); continue; } long typp = pb->type; typp &= ~128; switch(typp) { case 0: { float tt = t / (float)pb->tolive * 0.8f; IncrementPolyWithNormalOutput(pb->ep,ltv); for(long k = 0; k < pb->nbvert; k++) { ltv[k].p = EE_RT(ltv[k].p); ltv[k].uv.x=pb->u[k]; ltv[k].uv.y=pb->v[k]; ltv[k].color = (player.m_improve ? (Color3f::red * (tt*.5f)) : Color3f::gray(tt)).toRGB(); } if(player.m_improve) { mat.setBlendType(RenderMaterial::Additive); } else { mat.setBlendType(RenderMaterial::Subtractive); } mat.setTexture(Boom); drawTriangle(mat, <v[0]); if(pb->nbvert & 4) { drawTriangle(mat, <v[1]); } break; } case 1: { // Blood float div = 1.f / (float)pb->tolive; float tt = t * div; float tr = std::max(1.f, tt * 2 - 0.5f); ColorRGBA col = (pb->rgb * tt).toRGB(glm::clamp(tt * 1.5f, 0.f, 1.f) * 255); IncrementPolyWithNormalOutput(pb->ep, ltv); for(long k = 0; k < pb->nbvert; k++) { ltv[k].p = EE_RT(ltv[k].p); ltv[k].uv.x=(pb->u[k]-0.5f)*(tr)+0.5f; ltv[k].uv.y=(pb->v[k]-0.5f)*(tr)+0.5f; ltv[k].color = col; } mat.setWrapMode(TextureStage::WrapClamp); mat.setBlendType(RenderMaterial::Subtractive2); mat.setTexture(pb->tc); drawTriangle(mat, <v[0]); if(pb->nbvert & 4) { drawTriangle(mat, <v[1]); } break; } case 2: { // Water float div = 1.f / (float)pb->tolive; float tt = t * div; float tr = std::max(1.f, tt * 2 - 0.5f); float ttt = tt * 0.5f; ColorRGBA col = (pb->rgb * ttt).toRGB(); IncrementPolyWithNormalOutput(pb->ep,ltv); for(long k = 0; k < pb->nbvert; k++) { ltv[k].p = EE_RT(ltv[k].p); ltv[k].uv.x=(pb->u[k]-0.5f)*(tr)+0.5f; ltv[k].uv.y=(pb->v[k]-0.5f)*(tr)+0.5f; ltv[k].color=col; } if ( (ltv[0].uv.x<0.f) && (ltv[1].uv.x<0.f) && (ltv[2].uv.x<0.f) && (ltv[3].uv.x<0.f) ) break; if ( (ltv[0].uv.y<0.f) && (ltv[1].uv.y<0.f) && (ltv[2].uv.y<0.f) && (ltv[3].uv.y<0.f) ) break; if ( (ltv[0].uv.x>1.f) && (ltv[1].uv.x>1.f) && (ltv[2].uv.x>1.f) && (ltv[3].uv.x>1.f) ) break; if ( (ltv[0].uv.y>1.f) && (ltv[1].uv.y>1.f) && (ltv[2].uv.y>1.f) && (ltv[3].uv.y>1.f) ) break; mat.setWrapMode(TextureStage::WrapClamp); mat.setBlendType(RenderMaterial::Screen); mat.setTexture(pb->tc); drawTriangle(mat, <v[0]); if(pb->nbvert & 4) { drawTriangle(mat, <v[1]); } break; } } ++pb; } GRenderer->SetFogColor(ulBKGColor); }
// 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 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 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); } }