Skip to content

Commit 590f0f8

Browse files
committed
Impl. starfield, reduce UI jitter
1 parent f504208 commit 590f0f8

File tree

7 files changed

+177
-51
lines changed

7 files changed

+177
-51
lines changed

command_panel.py

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
def use_command_panel(vessels, bodies, surface_points, barycenters, maneuvers, radiation_pressures, atmospheric_drags, schwarzschilds, lensethirrings,
77
proximity_zones, projections, resources, plots, auto_dt_buffer, sim_time, delta_t, cycle_time, output_rate, cam_strafe_speed,
8-
cam_rotate_speed, rapid_compute_buffer, scene_lock, scene_rot_target, solver_type, tolerance):
8+
cam_rotate_speed, rapid_compute_buffer, scene_lock, scene_rot_target, solver_type, tolerance, starfield, default_star_num):
99
command_buffer = []
1010

1111
def on_panel_close():
@@ -117,6 +117,12 @@ def set_vars_field():
117117
vars_text += "Scene Rot. Target: " + str(scene_rot_target) + "\n"
118118
else:
119119
vars_text += "Scene Rot. Target: None\n"
120+
121+
if starfield:
122+
vars_text += "Strfld. Star Count: " + str(len(starfield)) + "\n"
123+
else:
124+
vars_text += "Strfld. Disabled\n"
125+
120126
sim_variables_field.delete(1.0, "end")
121127
sim_variables_field.insert(1.0, vars_text)
122128
sim_variables_field.config(state="disabled")
@@ -424,6 +430,28 @@ def generate_s2():
424430
clear_s1_button.grid(row=1, column=0)
425431
clear_s2_button.grid(row=2, column=0)
426432
clear_s3_button.grid(row=3, column=0)
433+
434+
elif cmd_a == "generate_starfield":
435+
gsf_help_text = "'generate_starfield' command generates a starfield to aid the eye with camera rotations as well as make the sky look a bit more familiar.\nDefault number of stars is " + str(default_star_num) + ", you can click the button without entering a number to use the default.\nDefault number can be modified by editing the config file (requires restart)."
436+
gsf_help = tk.Label(entry_panel, text=gsf_help_text)
437+
gsf_help.grid(row=0, column=0, columnspan=10)
438+
439+
gsf_s1t1_label = tk.Label(entry_panel, text="Num. of Stars")
440+
gsf_s1t1_label.grid(row=1, column=1)
441+
442+
gsf_s1t1 = tk.Text(entry_panel, width=20, height=1)
443+
gsf_s1t1.grid(row=2, column=1)
444+
445+
def generate_s1():
446+
if gsf_s1t1.get("1.0","end-1c"):
447+
command = "generate_starfield " + gsf_s1t1.get("1.0","end-1c")
448+
else:
449+
command = "generate_starfield"
450+
451+
add_to_buffer(command)
452+
453+
gsf_s1_button = tk.Button(entry_panel, text="Gen. Strfld.", command=generate_s1)
454+
gsf_s1_button.grid(row=2, column=0)
427455

428456
elif cmd_a == "create_vessel":
429457
cv_help = tk.Label(entry_panel, text="'create_vessel' command adds a new space vessel to the simulation.")
@@ -1873,6 +1901,13 @@ def generate_s1():
18731901
point_size_button = tk.Button(cmd_window, text="Point Size", command=lambda:enter_cmd("point_size"))
18741902
point_size_button.config(width=15, height=1)
18751903
point_size_button.grid(row=current_row, column=1)
1904+
current_row += 1
1905+
generate_starfield_button = tk.Button(cmd_window, text="Gen. Starfield", command=lambda:enter_cmd("generate_starfield"))
1906+
generate_starfield_button.config(width=15, height=1)
1907+
generate_starfield_button.grid(row=current_row, column=0)
1908+
clear_starfield_button = tk.Button(cmd_window, text="Clear Starfield", command=lambda:add_to_buffer("clear_starfield"))
1909+
clear_starfield_button.config(width=15, height=1)
1910+
clear_starfield_button.grid(row=current_row, column=1)
18761911

18771912
current_row += 1
18781913
selective_precision_commands_label = tk.Label(cmd_window, text="Selective Precision")

config_utils.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,9 @@ def get_char_in_line(line):
149149
batch_autoload = 1
150150
solver_type = 0
151151
tolerance = 1e-8
152+
153+
default_star_num = 1000
154+
autostarfield = 1
152155

153156
try:
154157
current_cfg_file = open("data/config/current.cfg", "r")
@@ -244,7 +247,12 @@ def get_char_in_line(line):
244247
elif line[:-1].startswith("tolerance"):
245248
tolerance = float(get_float_in_line(line[:-1]))
246249

250+
elif line[:-1].startswith("default_star_num"):
251+
default_star_num = int(get_float_in_line(line[:-1]))
252+
elif line[:-1].startswith("autostarfield"):
253+
autostarfield = int(get_float_in_line(line[:-1]))
254+
247255
return sim_time, delta_t, cycle_time, output_rate, cam_pos_x, cam_pos_y, cam_pos_z, cam_strafe_speed, cam_rotate_speed,\
248256
window_x, window_y, fov, near_clip, far_clip, cam_yaw_right, cam_yaw_left, cam_pitch_down, cam_pitch_up, cam_roll_cw, cam_roll_ccw,\
249257
cam_strafe_left, cam_strafe_right, cam_strafe_forward, cam_strafe_backward, cam_strafe_up, cam_strafe_down, cam_increase_speed, cam_decrease_speed, warn_cycle_time,\
250-
maneuver_auto_dt, draw_mode, point_size, labels_visible, vessel_body_collision, batch_autoload, solver_type, tolerance
258+
maneuver_auto_dt, draw_mode, point_size, labels_visible, vessel_body_collision, batch_autoload, solver_type, tolerance, default_star_num, autostarfield

data/config/current.cfg

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ fov = 70
2020
near_clip = 0.05
2121
far_clip = 5000000
2222

23+
; STARFIELD
24+
; autostarfield makes it so the program automatically generates one at scenario setup
25+
default_star_num = 1000
26+
autostarfield = 1
27+
2328
; KEYBOARD CONTROLS
2429

2530
cam_yaw_right = d

data/config/default.cfg

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ fov = 70
2020
near_clip = 0.05
2121
far_clip = 5000000
2222

23+
; STARFIELD
24+
; autostarfield makes it so the program automatically generates one at scenario setup
25+
default_star_num = 1000
26+
autostarfield = 1
27+
2328
; KEYBOARD CONTROLS
2429

2530
cam_yaw_right = d

graphics.py

Lines changed: 38 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -306,27 +306,27 @@ def drawBarycenters(barycenters, active_cam):
306306
glEnd()
307307
glPopMatrix()
308308

309-
def drawBarycenterLabels(bcs, cam, offset=0.05):
309+
def drawBarycenterLabels(bcs, cam, offset=0.05, far_clip=1e6):
310310

311311
for bc in bcs:
312312

313313
if world2cam(bc.get_pos().tolist(), cam):
314314
label_render_start = world2cam(bc.get_pos().tolist(), cam)
315315
label_render_start[0] += offset
316316
label_render_start[1] -= offset
317-
render_AN(bc.get_name(), vector_scale(bc.get_color(), 2), label_render_start, cam)
317+
render_AN(bc.get_name(), vector_scale(bc.get_color(), 2), label_render_start, cam, 0.1, far_clip)
318318

319-
def drawBodyLabels(bs, cam, offset=0.05):
319+
def drawBodyLabels(bs, cam, offset=0.05, far_clip=1e6):
320320

321321
for b in bs:
322322

323323
if world2cam(b.get_pos().tolist(), cam):
324324
label_render_start = world2cam(b.get_pos().tolist(), cam)
325325
label_render_start[0] += offset
326326
label_render_start[1] -= offset
327-
render_AN(b.get_name(), vector_scale(b.get_color(), 2), label_render_start, cam)
327+
render_AN(b.get_name(), vector_scale(b.get_color(), 2), label_render_start, cam, 0.1, far_clip)
328328

329-
def drawSurfacePointLabels(sps, cam, offset=0.05):
329+
def drawSurfacePointLabels(sps, cam, offset=0.05, far_clip=1e6):
330330

331331
for sp in sps:
332332

@@ -343,19 +343,19 @@ def drawSurfacePointLabels(sps, cam, offset=0.05):
343343
label_render_start = world2cam(sp.get_pos().tolist(), cam)
344344
label_render_start[0] += offset
345345
label_render_start[1] -= offset
346-
render_AN(sp.get_name(), vector_scale(sp.get_color(), 2), label_render_start, cam)
346+
render_AN(sp.get_name(), vector_scale(sp.get_color(), 2), label_render_start, cam, 0.1, far_clip)
347347

348-
def drawVesselLabels(vs, cam, offset=0.05):
348+
def drawVesselLabels(vs, cam, offset=0.05, far_clip=1e6):
349349

350350
for v in vs:
351351

352352
if world2cam(v.get_pos().tolist(), cam):
353353
label_render_start = world2cam(v.get_pos().tolist(), cam)
354354
label_render_start[0] += offset
355355
label_render_start[1] -= offset
356-
render_AN(v.get_name(), vector_scale(v.get_color(), 2), label_render_start, cam)
356+
render_AN(v.get_name(), vector_scale(v.get_color(), 2), label_render_start, cam, 0.1, far_clip)
357357

358-
def drawProjectionLabels(ps, cam, offset=0.05, size=0.05):
358+
def drawProjectionLabels(ps, cam, offset=0.05, size=0.05, far_clip=1e6):
359359

360360
for p in ps:
361361
pe_adjusted = p.draw_pe + p.get_body().get_draw_pos()
@@ -372,31 +372,45 @@ def drawProjectionLabels(ps, cam, offset=0.05, size=0.05):
372372
label_render_start = world2cam(pe_adjusted.tolist(), cam)
373373
label_render_start[0] += offset
374374
label_render_start[1] -= offset
375-
render_AN(("PERI " + str(p.get_periapsis_alt())), p.vessel.get_color(), label_render_start, cam, size)
375+
render_AN(("PERI " + str(p.get_periapsis_alt())), p.vessel.get_color(), label_render_start, cam, size, far_clip)
376376

377377
if world2cam(ap_adjusted, cam):
378378
label_render_start = world2cam(ap_adjusted.tolist(), cam)
379379
label_render_start[0] += offset
380380
label_render_start[1] -= offset
381-
render_AN(("APO " + str(p.get_apoapsis_alt())), p.vessel.get_color(), label_render_start, cam, size)
381+
render_AN(("APO " + str(p.get_apoapsis_alt())), p.vessel.get_color(), label_render_start, cam, size, far_clip)
382382

383383
if world2cam(an_adjusted, cam):
384384
label_render_start = world2cam(an_adjusted.tolist(), cam)
385385
label_render_start[0] += offset
386386
label_render_start[1] -= offset
387-
render_AN(("ASCN " + str(p.get_inclination())), p.vessel.get_color(), label_render_start, cam, size)
387+
render_AN(("ASCN " + str(p.get_inclination())), p.vessel.get_color(), label_render_start, cam, size, far_clip)
388388

389389
if world2cam(dn_adjusted, cam):
390390
label_render_start = world2cam(dn_adjusted.tolist(), cam)
391391
label_render_start[0] += offset
392392
label_render_start[1] -= offset
393-
render_AN(("DSCN " + str(p.get_inclination())), p.vessel.get_color(), label_render_start, cam, size)
393+
render_AN(("DSCN " + str(p.get_inclination())), p.vessel.get_color(), label_render_start, cam, size, far_clip)
394+
395+
def drawStarfield(starfield, cam, far_clip):
396+
star_dist = far_clip * 0.5
397+
398+
glPushMatrix()
399+
glColor(1, 1, 1)
400+
glTranslate(-cam.pos[0], -cam.pos[1], -cam.pos[2])
401+
glBegin(GL_POINTS)
402+
for s in starfield:
403+
glVertex3f(s[0] * star_dist, s[1] * star_dist, s[2] * star_dist)
404+
405+
glEnd()
406+
glPopMatrix()
394407

395408
def drawRapidCompute(cam, size=0.2):
396409
render_AN("RAPID COMPUTE ACTIVE", (1,0,0), [-5, 0.5], cam, size)
397410
render_AN("PLEASE BE PATIENT", (1,0,0), [-3, -0.5], cam, size/1.5)
398411

399-
def drawScene(bodies, vessels, surface_points, barycenters, projections, maneuvers, active_cam, show_trajectories=True, draw_mode=1, labels_visible=True, scene_lock=None, point_size=2, grid_active=False, scene_rot_target=None):
412+
def drawScene(bodies, vessels, surface_points, barycenters, projections, maneuvers, active_cam, show_trajectories=True, draw_mode=1,
413+
labels_visible=True, scene_lock=None, point_size=2, grid_active=False, scene_rot_target=None, starfield=[], far_clip=1e6):
400414

401415
# sort the objects by their distance to the camera so we can draw the ones in the front last
402416
# and it won't look like a ridiculous mess on screen
@@ -405,6 +419,9 @@ def drawScene(bodies, vessels, surface_points, barycenters, projections, maneuve
405419
vessels.sort(key=lambda x: (-x.get_draw_pos() - active_cam.get_pos()).mag(), reverse=True)
406420
surface_points.sort(key=lambda x: (-x.get_draw_pos() - active_cam.get_pos()).mag(), reverse=True)
407421

422+
if starfield:
423+
drawStarfield(starfield, active_cam, far_clip)
424+
408425
if grid_active:
409426
spacing = drawGridPlane(active_cam, bodies, vessels)
410427

@@ -417,15 +434,15 @@ def drawScene(bodies, vessels, surface_points, barycenters, projections, maneuve
417434

418435
if labels_visible:
419436
glEnable(GL_LINE_SMOOTH)
420-
drawBarycenterLabels(barycenters, active_cam)
421-
drawBodyLabels(bodies, active_cam)
422-
drawSurfacePointLabels(surface_points, active_cam)
423-
drawVesselLabels(vessels, active_cam)
437+
drawBarycenterLabels(barycenters, active_cam, 0.05, far_clip)
438+
drawBodyLabels(bodies, active_cam, 0.05, far_clip)
439+
drawSurfacePointLabels(surface_points, active_cam, 0.05, far_clip)
440+
drawVesselLabels(vessels, active_cam, 0.05, far_clip)
424441
glDisable(GL_LINE_SMOOTH)
425442

426443
drawProjections(projections)
427444
if labels_visible:
428-
drawProjectionLabels(projections, active_cam)
445+
drawProjectionLabels(projections, active_cam, 0.05, 0.05, far_clip)
429446
# draw trajectory and predictions
430447
if show_trajectories:
431448
glEnable(GL_LINE_SMOOTH)
@@ -435,7 +452,7 @@ def drawScene(bodies, vessels, surface_points, barycenters, projections, maneuve
435452

436453
if grid_active and spacing:
437454
spacing_exp = int(math.log(spacing, 10) + 0.5)
438-
render_AN("GRID SPACING 1e" + str(spacing_exp) + " M", (1, 0, 0), [-11.5, 5.5], active_cam, 0.1)
455+
render_AN("GRID SPACING 1e" + str(spacing_exp) + " M", (1, 0, 0), [-11.5, 5.5], active_cam, 0.1, far_clip)
439456

440457
if scene_rot_target:
441-
render_AN("ROTATING REFERENCE FRAME", (1, 0, 0), [-11.5, -5.5], active_cam, 0.1)
458+
render_AN("ROTATING REFERENCE FRAME", (1, 0, 0), [-11.5, -5.5], active_cam, 0.1, far_clip)

0 commit comments

Comments
 (0)