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 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); }