void CCreateField::RenderQuad(const Vec3f & p1, const Vec3f & p2, const Vec3f & p3, const Vec3f & p4, int rec, Vec3f norm, RenderMaterial & mat) { if(rec < 3) { rec++; Vec3f v[5] = { p1 + (p3 - p1) * 0.5f, p1 + (p4 - p1) * 0.5f, p2 + (p3 - p2) * 0.5f, p4 + (p3 - p4) * 0.5f, p1 + (p2 - p1) * 0.5f, }; float patchsize = 0.005f; v[0].x += glm::sin(glm::radians((v[0].x - eSrc.x) * patchsize + fwrap)) * 5; v[0].y += glm::sin(glm::radians((v[0].y - eSrc.y) * patchsize + fwrap)) * 5; v[0].z += glm::sin(glm::radians((v[0].z - eSrc.z) * patchsize + fwrap)) * 5; v[1].x += glm::sin(glm::radians((v[1].x - eSrc.x) * patchsize + fwrap)) * 5; v[1].y += glm::sin(glm::radians((v[1].y - eSrc.y) * patchsize + fwrap)) * 5; v[1].z += glm::sin(glm::radians((v[1].z - eSrc.z) * patchsize + fwrap)) * 5; v[2].x += glm::sin(glm::radians((v[2].x - eSrc.x) * patchsize + fwrap)) * 5; v[2].y += glm::sin(glm::radians((v[2].y - eSrc.y) * patchsize + fwrap)) * 5; v[2].z += glm::sin(glm::radians((v[2].z - eSrc.z) * patchsize + fwrap)) * 5; v[3].x += glm::sin(glm::radians((v[3].x - eSrc.x) * patchsize + fwrap)) * 5; v[3].y += glm::sin(glm::radians((v[3].y - eSrc.y) * patchsize + fwrap)) * 5; v[3].z += glm::sin(glm::radians((v[3].z - eSrc.z) * patchsize + fwrap)) * 5; v[4].x += glm::sin(glm::radians((v[4].x - eSrc.x) * patchsize + fwrap)) * 5; v[4].y += glm::sin(glm::radians((v[4].y - eSrc.y) * patchsize + fwrap)) * 5; v[4].z += glm::sin(glm::radians((v[4].z - eSrc.z) * patchsize + fwrap)) * 5; RenderQuad(p1, v[4], v[0], v[1], rec, norm, mat); RenderQuad(v[4], p2, v[2], v[0], rec, norm, mat); RenderQuad(v[0], v[2], p3, v[3], rec, norm, mat); RenderQuad(v[1], v[0], v[3], p4, rec, norm, mat); } else if(rec == 3) { float zab = glm::sin(glm::radians(ft)); TexturedQuad q; q.v[0].uv.x = 0 + zab; q.v[0].uv.y = 0 + zab; q.v[1].uv.x = 1 + zab; q.v[1].uv.y = 0 + zab; q.v[2].uv.x = 1 + zab; q.v[2].uv.y = 1 + zab; q.v[3].uv.x = 0 + zab; q.v[3].uv.y = 1 + zab; q.v[1].color = q.v[2].color = Color3f(falpha * .3f + Random::getf(0.f, .025f), 0.f, falpha * .5f + Random::getf(0.f, .025f)).toRGB(); q.v[0].color = q.v[3].color = Color3f(falpha * .3f + Random::getf(0.f, .025f), 0.f, falpha * .5f + Random::getf(0.f, .025f)).toRGB(); q.v[0].p = p1; q.v[1].p = p2; q.v[2].p = p3; q.v[3].p = p4; drawQuadRTP(mat, q); } }
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); } } }
void Draw3DLineTexNew(const RenderMaterial & mat, Vec3f startPos, Vec3f endPos, Color startColor, Color endColor, float startSize, float endSize) { float fBeta = MAKEANGLE(player.angle.getPitch()); float xxs = startSize * glm::cos(glm::radians(fBeta)); float xxe = endSize * glm::cos(glm::radians(fBeta)); float zzs = startSize; float zze = endSize; { TexturedQuad q1; q1.v[0].color = q1.v[1].color = startColor.toRGBA(); q1.v[2].color = q1.v[3].color = endColor.toRGBA(); q1.v[0].uv = Vec2f_ZERO; q1.v[1].uv = Vec2f_X_AXIS; q1.v[2].uv = Vec2f_ONE; q1.v[3].uv = Vec2f_Y_AXIS; q1.v[0].p.x = startPos.x; q1.v[0].p.y = startPos.y + zzs; q1.v[0].p.z = startPos.z; q1.v[1].p.x = startPos.x; q1.v[1].p.y = startPos.y - zzs; q1.v[1].p.z = startPos.z; q1.v[2].p.x = endPos.x; q1.v[2].p.y = endPos.y - zze; q1.v[2].p.z = endPos.z; q1.v[3].p.x = endPos.x; q1.v[3].p.y = endPos.y + zze; q1.v[3].p.z = endPos.z; drawQuadRTP(mat, q1); } zzs *= glm::sin(glm::radians(fBeta)); zze *= glm::sin(glm::radians(fBeta)); { TexturedQuad q2; q2.v[0].color = q2.v[1].color = startColor.toRGBA(); q2.v[2].color = q2.v[3].color = endColor.toRGBA(); q2.v[0].uv = Vec2f_ZERO; q2.v[1].uv = Vec2f_X_AXIS; q2.v[2].uv = Vec2f_ONE; q2.v[3].uv = Vec2f_Y_AXIS; q2.v[0].p.x = startPos.x + xxs; q2.v[0].p.y = startPos.y; q2.v[0].p.z = startPos.z + zzs; q2.v[1].p.x = startPos.x - xxs; q2.v[1].p.y = startPos.y; q2.v[1].p.z = startPos.z - zzs; q2.v[2].p.x = endPos.x - xxe; q2.v[2].p.y = endPos.y; q2.v[2].p.z = endPos.z - zze; q2.v[3].p.x = endPos.x + xxe; q2.v[3].p.y = endPos.y; q2.v[3].p.z = endPos.z + zze; drawQuadRTP(mat, q2); } }
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); } }