pass shape params

This commit is contained in:
numzero 2026-07-20 04:24:25 +03:00
parent db18de85ad
commit 14d9570478
4 changed files with 18 additions and 8 deletions

View File

@ -96,7 +96,7 @@ impl Core {
} }
fn render(&self, output: &wgpu::Texture, args: &RedrawArgs) { fn render(&self, output: &wgpu::Texture, args: &RedrawArgs) {
let mesh = mesh::generate(); let mesh = mesh::generate(&args.shape);
let mesh = faceted_mesh(&mesh); let mesh = faceted_mesh(&mesh);
let mesh = render::Mesh::new(&self.device, &mesh); let mesh = render::Mesh::new(&self.device, &mesh);

View File

@ -7,21 +7,22 @@ pub struct Mesh {
pub faces: Vec<[usize; 3]>, pub faces: Vec<[usize; 3]>,
} }
pub fn generate() -> Mesh { pub fn generate(shape: &crate::ShapeArgs) -> Mesh {
let mut vertices = Vec::<Vec3>::new(); let mut vertices = Vec::<Vec3>::new();
let mut faces = Vec::<[usize; 3]>::new(); let mut faces = Vec::<[usize; 3]>::new();
let sides: usize = 24; let sides = shape.sides as usize;
let layers = 12; let layers = (shape.layers_up + shape.layers_down) as usize;
let base_layer = 4; let base_layer = shape.layers_down;
let diameter = 36.0; let diameter = shape.base_diameter;
let radius = diameter / 2.; let radius = diameter / 2.;
let height = 120.; let height = shape.height;
let bottom_angle = (PI / sides as f32) * -(base_layer as f32); let bottom_angle = (PI / sides as f32) * -(base_layer as f32);
let top_angle = (PI / sides as f32) * (layers as f32 - base_layer as f32); let top_angle = (PI / sides as f32) * (layers as f32 - base_layer as f32);
let bottom_y = radius * bottom_angle.tan(); let bottom_y = radius * bottom_angle.tan();
let top_y = radius * top_angle.tan(); let top_y = radius * top_angle.tan();
let incline = height / (top_y - bottom_y); let incline = height / (top_y - bottom_y);
let elevation = -height / 2. - incline * bottom_y;
let base = vertices.len(); let base = vertices.len();
for side in 0..(sides - 2) { for side in 0..(sides - 2) {
@ -31,7 +32,7 @@ pub fn generate() -> Mesh {
let angle = (PI / sides as f32) * (layer as f32 - base_layer as f32); let angle = (PI / sides as f32) * (layer as f32 - base_layer as f32);
let x = radius; let x = radius;
let y = angle.tan() * x; let y = angle.tan() * x;
let z = incline * y; let z = elevation + incline * y;
for side in 0..sides { for side in 0..sides {
let angle = (2. * PI / sides as f32) * side as f32; let angle = (2. * PI / sides as f32) * side as f32;
let rot = Mat2::from_angle(angle); let rot = Mat2::from_angle(angle);

View File

@ -12,6 +12,9 @@ Hyperboloid::Hyperboloid(QWidget* parent)
Hyperboloid::~Hyperboloid() = default; Hyperboloid::~Hyperboloid() = default;
void Hyperboloid::updateView() { void Hyperboloid::updateView() {
const int max_layers = (m_ui->sides->value() - 1) / 2;
m_ui->layersUp->setMaximum(max_layers);
m_ui->layersDown->setMaximum(max_layers);
const auto color = m_ui->inBackground->color(); const auto color = m_ui->inBackground->color();
const ShapeArgs shape { const ShapeArgs shape {
.sides = (std::uint32_t)m_ui->sides->value(), .sides = (std::uint32_t)m_ui->sides->value(),

View File

@ -174,6 +174,9 @@
<property name="maximum"> <property name="maximum">
<number>11</number> <number>11</number>
</property> </property>
<property name="value">
<number>8</number>
</property>
</widget> </widget>
</item> </item>
<item> <item>
@ -188,6 +191,9 @@
<property name="maximum"> <property name="maximum">
<number>11</number> <number>11</number>
</property> </property>
<property name="value">
<number>4</number>
</property>
</widget> </widget>
</item> </item>
</layout> </layout>