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); }
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++; } }
// 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 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 CCreateField::Render() { if(!VisibleSphere(eSrc - Vec3f(0.f, 120.f, 0.f), 400.f)) return; if(ulCurrentTime >= ulDuration) return; float fOneOnDuration = 1.f / (float)(ulDuration); falpha = 1.f - (((float)(ulCurrentTime)) * fOneOnDuration); if (falpha > 1.f) falpha = 1.f; //------------------------------------------------------------------------- // rendu if(youp) { fglow += 0.5f; if(fglow >= 50) { youp = false; } } else { fglow -= 0.5f; if(fglow <= 0) { youp = true; } } ysize = std::min(1.0f, ulCurrentTime * 0.001f); if(ysize >= 1.0f) { size = std::min(1.0f, (ulCurrentTime - 1000) * 0.001f); size = std::max(size, 0.1f); } // ondulation ft += 0.01f; if(ft > 360.0f) { ft = 0.0f; } falpha = glm::sin(glm::radians(fglow)) + rnd() * 0.2f; falpha = glm::clamp(falpha, 0.f, 1.f); float x = eSrc.x; float y = eSrc.y; float z = eSrc.z; float smul = 100 * size; // bottom points b[0].x = x - smul; b[0].y = y; b[0].z = z - smul; b[1].x = x + smul; b[1].y = y; b[1].z = z - smul; b[2].x = x + smul; b[2].y = y; b[2].z = z + smul; b[3].x = x - smul; b[3].y = y; b[3].z = z + smul; // top points t[0].x = x - smul; t[0].y = y - 250 * ysize; t[0].z = z - smul; t[1].x = x + smul; t[1].y = y - 250 * ysize; t[1].z = z - smul; t[2].x = x + smul; t[2].y = y - 250 * ysize; t[2].z = z + smul; t[3].x = x - smul; t[3].y = y - 250 * ysize; t[3].z = z + smul; fwrap -= 5.0f; // TODO ignores the frame delay while(fwrap < 0) { fwrap += 360; } RenderMaterial mat = RenderMaterial::getCurrent(); mat.setTexture(tex_jelly); mat.setWrapMode(TextureStage::WrapRepeat); mat.setDepthTest(true); mat.setBlendType(RenderMaterial::Additive); RenderSubDivFace(b, b, 0, 1, 2, 3, mat); RenderSubDivFace(t, t, 0, 3, 2, 1, mat); RenderSubDivFace(b, t, 1, 0, 0, 1, mat); RenderSubDivFace(b, t, 3, 2, 2, 3, mat); RenderSubDivFace(b, t, 0, 3, 3, 0, mat); RenderSubDivFace(b, t, 2, 1, 1, 2, mat); if(lightHandleIsValid(lLightId)) { EERIE_LIGHT * light = lightHandleGet(lLightId); light->intensity = 0.7f + 2.3f * falpha; light->fallend = 500.f; light->fallstart = 400.f; light->rgb.r = 0.8f; light->rgb.g = 0.0f; light->rgb.b = 1.0f; light->pos.x = eSrc.x; light->pos.y = eSrc.y - 150; light->pos.z = eSrc.z; light->duration = 800; } //return falpha; }