Welcome to Fractal Forums

Fractal Software => Programming => Topic started by: Dratone on November 17, 2009, 02:14:02 PM




Title: Any opensource renderer
Post by: Dratone on November 17, 2009, 02:14:02 PM
Hi,

I want to learn how to start about programming something like this. I've already got some experience in programming (PHP, C++, VB, C#), but have never so far started anything graphically.

As I want to start this, I'd like an example to study. Are there any opensource renderers? and/or could you guys give me a few pointers?


Title: Re: Any opensource renderer
Post by: cKleinhuis on November 17, 2009, 03:22:05 PM
you should perhaps start with plain opengl, 3d polygonal rendering
and then implement your renderer on a ray base  :police:


Title: Re: Any opensource renderer
Post by: Duncan C on November 27, 2009, 05:06:55 AM
Hi,

I want to learn how to start about programming something like this. I've already got some experience in programming (PHP, C++, VB, C#), but have never so far started anything graphically.

As I want to start this, I'd like an example to study. Are there any opensource renderers? and/or could you guys give me a few pointers?

XAOS is a cross platform open source fractal renderer. It's claim to fame is very fast live zooming. I took a look at the code a couple of years ago and found it hard to figure it out. It's a fairly big, complex application.

There are probably others. You might want to do a search on sourceforge.net for fractal renderers.

Are you looking for 2D or 3D rendering? What types of fractals? What platform? Since you mention C#, I would assume that you are developing for Windows?

Good luck, and let us know what you find.


Regards,

Duncan C


Title: Re: Any opensource renderer
Post by: Dratone on December 29, 2009, 04:20:23 PM
XAOS is a cross platform open source fractal renderer. It's claim to fame is very fast live zooming. I took a look at the code a couple of years ago and found it hard to figure it out. It's a fairly big, complex application.
Thanks, I'll take a look at that.
There are probably others. You might want to do a search on sourceforge.net for fractal renderers.

Are you looking for 2D or 3D rendering? What types of fractals? What platform? Since you mention C#, I would assume that you are developing for Windows?
I really prefer linux - however since I've had to do some development work in VB and C#, windows is a 'can do' for me, but deffinitly a 'prefer not to' :)
Good luck, and let us know what you find.


Regards,

Duncan C



Title: Re: Any opensource renderer
Post by: Buddhi on December 29, 2009, 08:51:10 PM
Hello Dratone,

I had the same problem when I started with fractals (about 15 years ago). I didn't know how to draw something on screen or how to calculate fractal iteration. But during this time I wrote fractal renderers in Atari Basic, Amos Basic (Amiga), Matlab, Delphi, TurboPascal, C++ on Amiga (for Motorola 68040 and PowerPC), Microsoft Visual Basic, Borland C++, on Windows and latest in C++ on Linux. I know that some basic example is very helpful at the beginning. I prepared sample code for you in C / C++ for Linux GTK environment (I'm using Ubuntu Linux 9.10 x64). This program is for rendering simple 2D Mandelbrot sets

Code:
#include <gtk/gtk.h>
#include <math.h>
#include <jpeglib.h>
#include <setjmp.h>
#include <stdio.h>

#define IMAGE_WIDTH 800
#define IMAGE_HEIGHT 800

guchar *rgbbuf;

gboolean on_darea_expose(GtkWidget *widget, GdkEventExpose *event, gpointer user_data);

struct sFractal
{
double amin;
double amax;
double bmin;
double bmax;
int N;
double da;
double db;
};

struct sParam
{
int start;
int index;
sFractal fractal;
};

int CalculateIterations(double &a, double &b, int &N)
{
double x = a;
double y = b;

int i;

for (i = 0; i < N; i++)
{
double tempx = x * x - y * y + a;
y = 2.0 * x * y + b;
x = tempx;
double r = x * x + y * y;
if (r > 4) break;
}

return i;
}

//function for saving JPG file using jpeglib
void SaveJPEG(char *filename, int quality, int width, int height, JSAMPLE *image)
{
struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;
FILE * outfile;
JSAMPROW row_pointer[1];
int row_stride;

cinfo.err = jpeg_std_error(&jerr);
jpeg_create_compress(&cinfo);

if ((outfile = fopen(filename, "wb")) == NULL)
{
fprintf(stderr, "can't open %s\n", filename);
return;
}
jpeg_stdio_dest(&cinfo, outfile);

cinfo.image_width = width;
cinfo.image_height = height;
cinfo.input_components = 3; /* # of color components per pixel */
cinfo.in_color_space = JCS_RGB; /* colorspace of input image */

jpeg_set_defaults(&cinfo);
jpeg_set_quality(&cinfo, quality, TRUE);

jpeg_start_compress(&cinfo, TRUE);

row_stride = width * 3; /* JSAMPLEs per row in image_buffer */

while (cinfo.next_scanline < cinfo.image_height)
{
row_pointer[0] = &image[cinfo.next_scanline * row_stride];
(void) jpeg_write_scanlines(&cinfo, row_pointer, 1);
}

jpeg_finish_compress(&cinfo);
fclose(outfile);
jpeg_destroy_compress(&cinfo);
}

//********************************** MAIN *******************************
int main(int argc, char *argv[])
{
//gtk widgets
GtkWidget *window, *darea, *box;

//allocation memory for graphics
rgbbuf = new guchar[IMAGE_WIDTH * IMAGE_HEIGHT * 3];

//main window
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_main_quit), NULL);

//,ain box in window
box = gtk_vbox_new(FALSE, 0);
gtk_container_set_border_width(GTK_CONTAINER(box), 5);

//drawing area
darea = gtk_drawing_area_new();
gtk_widget_set_size_request(darea, IMAGE_WIDTH, IMAGE_HEIGHT);
gtk_signal_connect(GTK_OBJECT(darea), "expose-event", GTK_SIGNAL_FUNC(on_darea_expose), NULL);

//putting darea to box
gtk_box_pack_start(GTK_BOX(box), darea, FALSE, FALSE, 0);

//putting box to window
gtk_container_add(GTK_CONTAINER(window), box);

gtk_widget_show_all(window);

//main parameters of fractal
sFractal fractal;

fractal.amin = -2.2;
fractal.amax = 0.8;
fractal.bmin = -1.5;
fractal.bmax = 1.5;
fractal.N = 32;

fractal.da = (fractal.amax - fractal.amin) / IMAGE_WIDTH;
fractal.db = (fractal.bmax - fractal.bmin) / IMAGE_HEIGHT;

//rendering

for (int x = 0; x < IMAGE_WIDTH; x++)
{
for (int y = 0; y < IMAGE_HEIGHT; y++)
{
double a = fractal.amin + x * fractal.da;
double b = fractal.bmin + y * fractal.db;

int L = CalculateIterations(a, b, fractal.N);

int brightness = 255.0 * ((double) L / fractal.N);

int address = (x + y * IMAGE_WIDTH) * 3;
rgbbuf[address] = brightness * 1.0; // red
rgbbuf[address + 1] = brightness * 0.9; //green
rgbbuf[address + 2] = brightness * 0.5; //blue
}
}

//end of rendering

//draw offscreen image in window
gdk_draw_rgb_image(darea->window, darea->style->fg_gc[GTK_STATE_NORMAL], 0, 0, IMAGE_WIDTH, IMAGE_HEIGHT, GDK_RGB_DITHER_NONE, rgbbuf, IMAGE_WIDTH * 3);

//saving image in JPG file
SaveJPEG("/media/Dane/Roboczy2/test.jpg", 90, IMAGE_WIDTH, IMAGE_HEIGHT, (JSAMPLE*) rgbbuf);

//wait for refreshing interface (it is necessary when fractal is rendering in animation loop)
while (gtk_events_pending())
gtk_main_iteration();

printf("End of rendering");
gtk_main();
return 0;
}

//This function refreshes graphinc when window is exposured
gboolean on_darea_expose(GtkWidget *widget, GdkEventExpose *event, gpointer user_data)
{
gdk_draw_rgb_image(widget->window, widget->style->fg_gc[GTK_STATE_NORMAL], 0, 0, IMAGE_WIDTH, IMAGE_HEIGHT, GDK_RGB_DITHER_MAX, rgbbuf, IMAGE_WIDTH * 3);
return TRUE;
}


For compile this I'm using gcc or g++ with following parameters (this is example for Eclipse SDK C++):
g++ -O2 -march=native -mfpmath=387,sse -ffast-math -Wall -c -fmessage-length=0 `pkg-config --cflags gtk+-2.0;` -MMD -MP -MF"Fractal2D.d" -MT"Fractal2D.d" -o"Fractal2D.o" "../Fractal2D.cpp"
and for linker: g++ `pkg-config --libs gtk+-2.0` -o"Fractal2D"  ./Fractal2D.o   -ljpeg

If you have some additional questions please don't hesitate to ask.