/
wmigor
/
z-plane
Обзор
Документация
Войти
/
wmigor
/
z-plane
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
app/src/Grid.cpp
111 строк
4 KB
wmigor
Исправлен мотор в выключенном состоянии
03 июн 2026, 11:57
03 июн 2026, 11:57
e43d646
Код
Авторство
О чём код?
#include "Grid.h" #include <osg/Geometry> #include <osg/Geode> #include "converters.h" Grid::Grid(Aircraft *aircraft, double cellSize, int cellCount, double verticalOffset) { auto vertices = new osg::Vec3Array(); auto colors = new osg::Vec4Array(); auto opacity = 1.0; auto upColor = osg::Vec4(0.0, 1.0, 0.0, opacity); auto rightColor = osg::Vec4(1.0, 0.0, 0.0, opacity); auto forwardColor = osg::Vec4(0.0, 0.0, 1.0, opacity); auto halfSize = cellSize * cellCount * 0.5; auto lineCount = cellCount + 1; for (auto i = 0; i < lineCount; ++i) { auto a = -halfSize + (i * cellSize); for (auto j = 0; j < lineCount; ++j) { auto b = -halfSize + (j * cellSize); vertices->push_back(osg::Vec3(-halfSize - cellSize, a, b)); vertices->push_back(osg::Vec3(halfSize + cellSize, a, b)); colors->push_back(rightColor); colors->push_back(rightColor); vertices->push_back(osg::Vec3(a, -halfSize - cellSize, b)); vertices->push_back(osg::Vec3(a, halfSize + cellSize, b)); colors->push_back(upColor); colors->push_back(upColor); vertices->push_back(osg::Vec3(a, b, -halfSize - cellSize)); vertices->push_back(osg::Vec3(a, b, halfSize + cellSize)); colors->push_back(forwardColor); colors->push_back(forwardColor); } } for (auto i = 0u; i < vertices->size(); i++) colors->push_back(osg::Vec4(0.3, 0.5, 0.9, 0.5)); auto geometry = new osg::Geometry(); geometry->setVertexArray(vertices); geometry->setColorArray(colors); geometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX); geometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINES, 0, vertices->size())); auto state = geometry->getOrCreateStateSet(); state->setMode(GL_BLEND, osg::StateAttribute::ON); state->setMode(GL_LIGHTING, osg::StateAttribute::OFF); auto geode = new osg::Geode(); geode->addDrawable(geometry); addChild(geode); setUpdateCallback(new GridCallback(aircraft, cellSize, verticalOffset)); auto vertexShaderSource = "varying vec4 viewPos;\n" "void main() {\n" " viewPos = gl_ModelViewMatrix * gl_Vertex;\n" " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n" " gl_FrontColor = gl_Color;\n" "}\n"; auto fragmentShaderSource = "varying vec4 viewPos;\n" "uniform float maxDistance;\n" "void main() {\n" " float distance = length(viewPos.xyz);\n" " float fade = 1.0 - smoothstep(maxDistance * 0.3, maxDistance, distance);\n" " vec4 color = gl_Color;\n" " color.a *= fade;\n" " gl_FragColor = color;\n" "}\n"; osg::ref_ptr<osg::Program> program = new osg::Program(); program->addShader(new osg::Shader(osg::Shader::VERTEX, vertexShaderSource)); program->addShader(new osg::Shader(osg::Shader::FRAGMENT, fragmentShaderSource)); state->setAttributeAndModes(program.get(), osg::StateAttribute::ON); osg::ref_ptr<osg::Uniform> maxDistUniform = new osg::Uniform("maxDistance", (float) halfSize); state->addUniform(maxDistUniform.get()); } GridCallback::GridCallback(Aircraft* aircraft, double cellSize, double verticalOffset): _aircraft(aircraft), _cellSize(cellSize), _verticalOffset(verticalOffset) { } void GridCallback::operator()(osg::Node *node, osg::NodeVisitor *nv) { auto transform = dynamic_cast<osg::MatrixTransform *>(node); if (transform == NULL) { traverse(node, nv); return; } auto cell = _aircraft->getBody()->position / _cellSize; cell.x = (int) cell.x; cell.y = (int) cell.y; cell.z = (int) cell.z; osg::Matrix matrix; matrix.setTrans(toVec3(cell * _cellSize + glm::dvec3(0.0, _verticalOffset, 0.0))); transform->setMatrix(matrix); traverse(node, nv); }