void CCloud::Draw() { if (! m_enabled) return; if (m_level == 0.0f) return; if (m_lines.empty()) return; std::vector<VertexTex2> vertices((m_brickCount+2)*2, VertexTex2()); float iDeep = m_engine->GetDeepView(); float deep = (m_brickCount*m_brickSize)/2.0f; m_engine->SetDeepView(deep); m_engine->SetFocus(m_engine->GetFocus()); m_engine->UpdateMatProj(); // increases the depth of view float fogStart = deep*0.15f; float fogEnd = deep*0.24f; CDevice* device = m_engine->GetDevice(); // TODO: do this better? device->SetFogParams(FOG_LINEAR, m_engine->GetFogColor( m_engine->GetRankView() ), fogStart, fogEnd, 1.0f); device->SetTransform(TRANSFORM_VIEW, m_engine->GetMatView()); Material material; material.diffuse = m_diffuse; material.ambient = m_ambient; m_engine->SetMaterial(material); m_engine->SetTexture(m_fileName, 0); m_engine->SetTexture(m_fileName, 1); m_engine->SetState(ENG_RSTATE_TTEXTURE_BLACK | ENG_RSTATE_FOG | ENG_RSTATE_WRAP); Math::Matrix matrix; matrix.LoadIdentity(); device->SetTransform(TRANSFORM_WORLD, matrix); float size = m_brickSize/2.0f; Math::Vector eye = m_engine->GetEyePt(); Math::Vector n = Math::Vector(0.0f, -1.0f, 0.0f); // Draws all the lines for (int i = 0; i < static_cast<int>( m_lines.size() ); i++) { Math::Vector pos; pos.y = m_level; pos.z = m_lines[i].pz; pos.x = m_lines[i].px1; int vertexIndex = 0; Math::Vector p; Math::Point uv1, uv2; p.x = pos.x-size; p.z = pos.z+size; p.y = pos.y; AdjustLevel(p, eye, deep, uv1, uv2); vertices[vertexIndex++] = VertexTex2(p, n, uv1, uv2); p.x = pos.x-size; p.z = pos.z-size; p.y = pos.y; AdjustLevel(p, eye, deep, uv1, uv2); vertices[vertexIndex++] = VertexTex2(p, n, uv1, uv2); for (int j = 0; j < m_lines[i].len; j++) { p.x = pos.x+size; p.z = pos.z+size; p.y = pos.y; AdjustLevel(p, eye, deep, uv1, uv2); vertices[vertexIndex++] = VertexTex2(p, n, uv1, uv2); p.x = pos.x+size; p.z = pos.z-size; p.y = pos.y; AdjustLevel(p, eye, deep, uv1, uv2); vertices[vertexIndex++] = VertexTex2(p, n, uv1, uv2); pos.x += size*2.0f; } device->DrawPrimitive(PRIMITIVE_TRIANGLE_STRIP, &vertices[0], vertexIndex); m_engine->AddStatisticTriangle(vertexIndex - 2); } m_engine->SetDeepView(iDeep); m_engine->SetFocus(m_engine->GetFocus()); m_engine->UpdateMatProj(); // gives depth to initial }
void CLightning::Draw() { if (!m_lightningExists) return; if (m_phase != LP_FLASH) return; CDevice* device = m_engine->GetDevice(); Math::Matrix mat; mat.LoadIdentity(); device->SetTransform(TRANSFORM_WORLD, mat); m_engine->SetTexture("effect00.png"); m_engine->SetState(ENG_RSTATE_TTEXTURE_BLACK); Math::Point texInf; texInf.x = 64.5f/256.0f; texInf.y = 33.0f/256.0f; Math::Point texSup; texSup.x = 95.5f/256.0f; texSup.y = 34.0f/256.0f; // blank Math::Vector p1 = m_pos; Math::Vector eye = m_engine->GetEyePt(); float a = Math::RotateAngle(eye.x-p1.x, eye.z-p1.z); Math::Vector n = Math::Normalize(p1-eye); Math::Vector corner[4]; Vertex vertex[4]; for (int i = 0; i < FLASH_SEGMENTS-1; i++) { Math::Vector p2 = p1; p2.y += 8.0f+0.2f*i; Math::Point rot; Math::Vector p = p1; p.x += m_width[i]; rot = Math::RotatePoint(Math::Point(p1.x, p1.z), a+Math::PI/2.0f, Math::Point(p.x, p.z)); corner[0].x = rot.x+m_shift[i].x; corner[0].y = p1.y; corner[0].z = rot.y+m_shift[i].y; rot = Math::RotatePoint(Math::Point(p1.x, p1.z), a-Math::PI/2.0f, Math::Point(p.x, p.z)); corner[1].x = rot.x+m_shift[i].x; corner[1].y = p1.y; corner[1].z = rot.y+m_shift[i].y; p = p2; p.x += m_width[i+1]; rot = Math::RotatePoint(Math::Point(p2.x, p2.z), a+Math::PI/2.0f, Math::Point(p.x, p.z)); corner[2].x = rot.x+m_shift[i+1].x; corner[2].y = p2.y; corner[2].z = rot.y+m_shift[i+1].y; rot = Math::RotatePoint(Math::Point(p2.x, p2.z), a-Math::PI/2.0f, Math::Point(p.x, p.z)); corner[3].x = rot.x+m_shift[i+1].x; corner[3].y = p2.y; corner[3].z = rot.y+m_shift[i+1].y; if (p2.y < p1.y) { vertex[0] = Vertex(corner[1], n, Math::Point(texSup.x, texSup.y)); vertex[1] = Vertex(corner[0], n, Math::Point(texInf.x, texSup.y)); vertex[2] = Vertex(corner[3], n, Math::Point(texSup.x, texInf.y)); vertex[3] = Vertex(corner[2], n, Math::Point(texInf.x, texInf.y)); } else { vertex[0] = Vertex(corner[0], n, Math::Point(texSup.x, texSup.y)); vertex[1] = Vertex(corner[1], n, Math::Point(texInf.x, texSup.y)); vertex[2] = Vertex(corner[2], n, Math::Point(texSup.x, texInf.y)); vertex[3] = Vertex(corner[3], n, Math::Point(texInf.x, texInf.y)); } device->DrawPrimitive(PRIMITIVE_TRIANGLE_STRIP, vertex, 4); m_engine->AddStatisticTriangle(2); p1 = p2; } }