Skip to content
Snippets Groups Projects
CelestialObject.c 2.36 KiB
#include "CelestialObject.h"

#include <GL/glut.h>
#include <stdlib.h>
#include <string.h>

#include "drawing.h"

#define G 6.67e-11
#define SUN_MASS 1.989e30

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->points = (Vector2 *)malloc(sizeof(Vector2) * 200);
    object->points_length = 0;

    return object;
}

void celestial_object_draw(CelestialObject *object, Vector2 reference_frame, double zoom_factor) {
    Vector2 scaled_position = scale_position(zoom_factor, object->current_position, reference_frame);

    uint32_t color = object->drawing_color;
    glColor3ub((color & 0xFF0000) >> 16, (color & 0x00FF00) >> 8, (color & 0x0000FF) >> 0);

    if (zoom_factor < 1)
        draw_disc(scaled_position, object->drawing_disc_radius * zoom_factor);
    else
        draw_disc(scaled_position, object->drawing_disc_radius);

    if (strcmp(object->name, "Moon") != 0) {
        if (zoom_factor < 1)
            glLineWidth(4.0 * zoom_factor);
        else
            glLineWidth(4.0);

        for (int32_t j = 0; j < object->points_length - 1; j += 1) {
            Vector2 p1 = scale_position(zoom_factor, object->points[j], reference_frame);
            Vector2 p2 = scale_position(zoom_factor, object->points[j + 1], reference_frame);
            draw_line(p1, p2);
        }
    }

    // celestial_object_draw_name(object, 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;
    }

    draw_text(object->name, vector2_add(scaled_position, vector2_create(object->drawing_disc_radius + 8, 7)));
}