summaryrefslogtreecommitdiff
path: root/src/modules/stars/stars.c
diff options
context:
space:
mode:
authorPhilip J Freeman <elektron@halo.nu>2019-12-16 16:15:27 -0800
committerPhilip J Freeman <elektron@halo.nu>2019-12-30 14:02:32 -0800
commitebaacbbb4af1e4445c015f7133b337b698185ba7 (patch)
tree6d579b008be452ee83dd9908070aa698fa8c071a /src/modules/stars/stars.c
parent036f737f7201cb9f2ae9502088773a066f168303 (diff)
stars: fix bugs, big refactor for resizing
- use a context not globals - use floats and a "unit cube" to simulate the starfield
Diffstat (limited to 'src/modules/stars/stars.c')
-rw-r--r--src/modules/stars/stars.c152
1 files changed, 121 insertions, 31 deletions
diff --git a/src/modules/stars/stars.c b/src/modules/stars/stars.c
index 63ff73c..9c1de5b 100644
--- a/src/modules/stars/stars.c
+++ b/src/modules/stars/stars.c
@@ -5,56 +5,146 @@
#include <time.h>
#include <sys/types.h>
#include <unistd.h>
+#include <math.h>
#include "draw.h"
#include "fb.h"
#include "rototiller.h"
-#include "starslib.h"
-/* Copyright (C) 2017 Philip J. Freeman <elektron@halo.nu> */
+/* Copyright (C) 2017-19 Philip J. Freeman <elektron@halo.nu> */
-static void stars_render_fragment(void *context, unsigned cpu, fb_fragment_t *fragment)
+struct points
+{
+ float x, y, z;
+ struct points *next;
+};
+
+
+typedef struct stars_context_t {
+ struct points* points;
+} stars_context_t;
+
+
+float get_random_unit_coord() {
+ return (((float)rand()/(float)RAND_MAX)*2.0)-1.0;
+}
+
+
+static void * stars_create_context(unsigned num_cpus)
{
- static int initialized, z;
- static struct universe* u;
-
- struct return_point rp;
- int x, y, width = fragment->width, height = fragment->height;
-
- if (!initialized) {
- z = 128;
- srand(time(NULL) + getpid());
-
- // Initialize the stars lib (and pre-add a bunch of stars)
- new_universe(&u, width, height, z);
- for(y=0; y<z; y++) {
- while (process_point(u, &rp) != 0);
- for(x=0; x<rand()%128; x++){
- new_point(u);
- }
+ stars_context_t *ctxt;
+ float z;
+ struct points* p_ptr = NULL;
+
+ ctxt = malloc(sizeof(stars_context_t));
+ if (!ctxt)
+ return NULL;
+
+ ctxt->points = NULL;
+
+ //add a bunch of points
+ for(z=0.01; z<1; z=z+0.01) {
+ for(int i=0; i<rand()%16; i++){
+ p_ptr = malloc(sizeof(struct points));
+ if (!p_ptr)
+ return NULL;
+ p_ptr->x = get_random_unit_coord();
+ p_ptr->y = get_random_unit_coord();
+ p_ptr->z = z;
+ p_ptr->next = ctxt->points;
+ ctxt->points = p_ptr;
}
- initialized = 1;
}
+ return ctxt;
+}
+
+static void stars_destroy_context(void *context)
+{
+ stars_context_t *ctxt = context;
+ struct points* p_ptr;
+ struct points* last_ptr=NULL;
+
+ for ( p_ptr=ctxt->points; p_ptr != NULL; p_ptr = p_ptr->next)
+ {
+ if (last_ptr!=NULL)
+ free(last_ptr);
+
+ last_ptr=p_ptr;
+ }
+
+ free(last_ptr);
+
+ free(context);
+}
+
+
+static void stars_render_fragment(void *context, unsigned cpu, fb_fragment_t *fragment)
+{
+ stars_context_t *ctxt = context;
+ struct points* iterator;
+ struct points* tmp_ptr;
+ struct points* last_ptr=NULL;
+ float x, y, pos_x, pos_y, opacity;
+ int width = fragment->width, height = fragment->height;
+
- // draw space (or blank the frame, if you prefer)
fb_fragment_zero(fragment);
- // draw stars
- for (;;) {
- int ret = process_point( u, &rp );
- if (ret==0) break;
- if (ret==1) fb_fragment_put_pixel_unchecked(fragment, rp.x+(width/2), rp.y+(height/2),
- makergb(0xFF, 0xFF, 0xFF, (float)rp.opacity/OPACITY_MAX)
- );
+ iterator=ctxt->points;
+ for(;;)
+ {
+ if(iterator == NULL)
+ break;
+
+ if(iterator->z >= 1) {
+ if(last_ptr == NULL)
+ ctxt->points = iterator->next;
+ else
+ last_ptr->next = iterator->next;
+ tmp_ptr = iterator;
+ iterator = iterator->next;
+ free(tmp_ptr);
+ continue;
+ }
+
+ x = iterator->x / (1.f - iterator->z);
+ y = iterator->y / (1.f - iterator->z);
+
+ pos_x = ((x+1.f)*.5f)*(float)width;
+ pos_y = ((y+1.f)*.5f)*(float)height;
+
+ if (pos_x>0 && pos_x<width && pos_y >0 && pos_y < height) {
+ if(iterator->z<0.1)
+ opacity = iterator->z*10;
+ else
+ opacity = 1;
+
+ fb_fragment_put_pixel_unchecked(fragment, pos_x, pos_y,
+ makergb(0xFF, 0xFF, 0xFF, opacity));
+
+ }
+
+ iterator->z += 0.01;
+ last_ptr=iterator;
+ iterator=iterator->next;
}
// add stars at horizon
- for (x=0; x<rand()%128; x++) {
- new_point(u);
+ for(int i=0; i<rand()%16; i++){
+ tmp_ptr = malloc(sizeof(struct points));
+ if (!tmp_ptr)
+ break;
+ tmp_ptr->x = get_random_unit_coord();
+ tmp_ptr->y = get_random_unit_coord();
+ tmp_ptr->z = 0.01;
+ tmp_ptr->next = ctxt->points;
+ ctxt->points = tmp_ptr;
}
}
rototiller_module_t stars_module = {
+ .create_context = stars_create_context,
+ .destroy_context = stars_destroy_context,
.render_fragment = stars_render_fragment,
.name = "stars",
.description = "Basic starfield",
© All Rights Reserved