Skip to content
Snippets Groups Projects
Select Git revision
  • fe882640699fe4ec3ddf9b38b41b3f5b0dc11bc3
  • main default protected
2 results

CelestialObject.c

Blame
  • CelestialObject.c 2.27 KiB
    #include "CelestialObject.h"
    
    #include <GL/glut.h>
    #include <stdlib.h>
    #include <string.h>
    
    #include "drawing.h"
    
    const int32_t PREVIOUS_POSITIONS_LENGTH = 200;
    
    CelestialObject *celestial_object_create(char *name, double mass, double semi_major_axis, double eccentricity, uint32_t drawing_disc_radius, uint32_t drawing_color) {
        CelestialObject *object = (CelestialObject *)malloc(sizeof(CelestialObject));
    
        strcpy(object->name, name);
        object->mass = mass;
        object->previous_position = vector2_create_zero();
    
        double periapsis = semi_major_axis * (1 - eccentricity);
        object->current_position = vector2_create(-periapsis, 0);
    
        object->semi_major_axis = semi_major_axis;
        object->eccentricity = eccentricity;
    
        object->drawing_disc_radius = drawing_disc_radius;
        object->drawing_color = drawing_color;
    
        object->previous_positions = (Vector2 *)malloc(sizeof(Vector2) * PREVIOUS_POSITIONS_LENGTH);
        object->previous_positions_length = 0;
    
        return object;
    }
    
    uint32_t get_zoomed_drawing_disc_radius(CelestialObject *object, double zoom_factor) {
        if (zoom_factor < 1) {
            return object->drawing_disc_radius * zoom_factor;
        }
    
        return object->drawing_disc_radius;
    }
    
    void celestial_object_draw(CelestialObject *object, Vector2 reference_frame, double zoom_factor) {
        uint32_t color = object->drawing_color;
        glColor3ub((color & 0xFF0000) >> 16, (color & 0x00FF00) >> 8, (color & 0x0000FF) >> 0);
    
        Vector2 scaled_position = scale_position(zoom_factor, object->current_position, reference_frame);
        draw_disc(scaled_position, get_zoomed_drawing_disc_radius(object, zoom_factor));
    
        if (strcmp(object->name, "Moon") != 0) {
            draw_scaled_lines(object->previous_positions, object->previous_positions_length, reference_frame, zoom_factor);
        }
    }
    
    void celestial_object_draw_name(CelestialObject *object, Vector2 reference_frame, double zoom_factor) {
        Vector2 scaled_position = scale_position(zoom_factor, object->current_position, reference_frame);
    
        if (strcmp(object->name, "Moon") == 0 && zoom_factor < 36) {
            return;
        }
    
        uint32_t zoomed_drawing_disc_radius = get_zoomed_drawing_disc_radius(object, zoom_factor);
        draw_text(object->name, vector2_add(scaled_position, vector2_create(zoomed_drawing_disc_radius + 5, -10)));
    }