Esempio n. 1
0
int
main(int argc, char **argv)
{
	struct state state;

	if (initialize_state(&state)) {
		printf("ERROR in initialization\n");
		return 1;
	}

	if (parse_args(argc, argv, &state)) {
		printf("ERROR parsing arguments\n");
		return 1; // TODO: cleanup_state()
	}

	if (bmp_load(state.inf, state.inname, &state)) {
		printf("ERROR loading BMP!\n");
		return 1; // TODO: cleanup_state()
	}

	if (font_save(state.outf, state.outname, &state)) {
		printf("ERROR saving font!\n");
		return 1; // TODO: cleanup_state()
	}

	cleanup_state(&state);
	return 0;
}
Esempio n. 2
0
//generic constructing function for Control.
Control * ControlCreate(char * filename, SDL_Rect * rect)
{
	Control * ctl = mymalloc (sizeof (Control));
	//handle memory failure.
	//TODO make global function/macro.
	if (!ctl)
	{
		return NULL;
	};

	ctl->surface = NULL;
	ctl->rect = rect;
	ctl->children = NULL;
	ctl->parent = NULL;
	ctl->extra_data = NULL;
	//by default a control does nothing.
	ctl->HandleEvents = NULL;

	//load the image (if exists) into ctl's surface
	if (filename)
	{
		bmp_load(filename, &(ctl->surface));
	}
	return ctl;
}
Esempio n. 3
0
int main2 ()
{
	/* Initialize SDL and make sure it quits*/
	if (SDL_Init(SDL_INIT_VIDEO) < 0) {
		printf("ERROR: unable to init SDL: %s\n", SDL_GetError());
		return 1;
	}
	atexit(SDL_Quit);

	//initialize screen/window
	SDL_Surface * screen;
    /*
     * Initialize the display in a 640x480 8-bit palettized mode,
     * requesting a software surface
     */
    screen = SDL_SetVideoMode(WIN_W, WIN_H, 0, SDL_SWSURFACE | SDL_DOUBLEBUF);
    if ( screen == NULL )
    {
        fprintf(stderr, "Couldn't set video mode: %s\n",
                        SDL_GetError());
        exit(1);
    }

    //load background image
    bmp_load("imgs/background.bmp", &screen);

    //display ?
    //is done seperately

    //poll events
    int quit = 0 ;

    while (!quit)
    {
		/* Poll for keyboard & mouse events*/
		SDL_Event e;
		while (SDL_PollEvent(&e) != 0) {
			switch (e.type) {
				case (SDL_QUIT):
					quit = 1;
					break;
				case (SDL_KEYUP):
					if (e.key.keysym.sym == SDLK_ESCAPE)
					{
						quit = 1;
					}
					break;
				case (SDL_MOUSEBUTTONUP):
					//if ((e.button.x > rect.x) && (e.button.x < rect.x + rect.w) && (e.button.y > rect.y) && (e.button.y < rect.y+rect.h))
					quit = 1;
					break;
				default:
					break;
			}
		}
		/* Wait a little before redrawing*/
		SDL_Delay(200);
    }
    return 0;
}
Esempio n. 4
0
static int bmp_show(char* file)
{
    void* bmp = bmp_load(file, 1);
    if (!bmp) return 0;
    bmp_draw_scaled_ex(bmp, 0, 0, 720, 480, 0);
    free(bmp);
    return 1;
}
Esempio n. 5
0
void menu_help_show_page(int page)
{
    menu_help_active = 1;
    
#ifndef CONFIG_RELEASE_BUILD
    if (page == 1) { draw_beta_warning(); return; } // display this instead of the main About page
#endif

    if (page == 0) { draw_404_page(); return; } // help page not found
    if (page == -1) { draw_help_not_installed_page(); return; } // help page not found
    
    char path[100];
    struct bmp_file_t * doc = (void*) -1;

#ifdef CONFIG_HELP_CACHE
    char rpath[30];
    snprintf(rpath, sizeof(rpath), CARD_DRIVE "ML/doc/page-%03d.vrm", page);
    if (load_vram(rpath)==-1)
#endif
    {
        snprintf(path, sizeof(path), CARD_DRIVE "ML/doc/page-%03d.bmh", page);
        doc = bmp_load(path, 1);
        if (!doc)
        {
            snprintf(path, sizeof(path), CARD_DRIVE "ML/doc/page-%03d.bmp", page);
            doc = bmp_load(path, 1);
        }

        if (doc)
        {
            bmp_draw_scaled_ex(doc, 0, 0, 720, 480, 0);
            #ifdef CONFIG_HELP_CACHE
            extern int _bmp_draw_should_stop;
            if (!_bmp_draw_should_stop) save_vram(rpath);
            #endif
            FreeMemory(doc);
        }
        else
        {
            clrscr();
            bmp_printf(FONT_MED, 0, 0, "Could not load help page %s.", path);
        }
    }
}
Esempio n. 6
0
SINT HPBmpDisp(SINT CoType,LONG x1,LONG y1,CHAR *file)
{
 SINT x,bmp;
 LONG y;
 LONG pos;
 SINT HdlLocal;
 CHAR *BufLocal;
 CHAR *BufCompress;

 CHAR serv[80];
 struct BMP_HD BmpHead;
 struct BMPINFO BmpInfo;

 if (CoType==HP_GRID) {x1*=Grid_X; y1*=Grid_Y;}
 bmp=bmp_load(file,&BmpInfo,RAM_AUTO);
 if (bmp<0) return bmp;

 memo_leggivar(bmp,0,&BmpHead,sizeof(BmpHead));
 pos=sizeof(BmpHead);
 HdlLocal=memo_chiedi(RAM_HEAP,BmpHead.riga+(BmpHead.riga*2),"HPlocal");
 if (HdlLocal<0) goto FINE;
 BufLocal=memo_heap(HdlLocal);
 BufCompress=BufLocal+BmpHead.riga;

 HPCursor(HP_DOT,x1,y1);
 sprintf(serv,"*r%lds0t1A",BmpHead.larg); // Raster area
 HPEsc(serv);

 for (y=0;y<BmpHead.alt;y++)
	{
//	 int pixel,mask,pt;
	 memo_leggivar(bmp,pos,BufLocal,BmpHead.riga);
	 x=HPcompress(BufLocal,BufCompress,BmpHead.riga);
	 if (x<=0)
			{sprintf(serv,"*b0m%dW",(SINT) -x); HPEsc(serv);
			 lpt_send(BufLocal,-x);
			}
			 else
			{sprintf(serv,"*b1m%dW",(SINT ) x); HPEsc(serv);
			 lpt_send(BufCompress,x);
			}

	 pos+=BmpHead.riga;
	}

 memo_libera(HdlLocal,"HP");
 HPEsc("*rb"); // end raster
 // uscita
 FINE:
 memo_libera(bmp,"disp_lpt");
 return 0;
}
Esempio n. 7
0
int doTest(const char *ext, int width, int align, int height, enum BMPPF pf,
	enum BMPORN orientation)
{
	char filename[80], *md5sum, md5buf[65];
	int pitch=BMPPAD(width*bmp_ps[pf], align), loadWidth=0, loadHeight=0,
		retval=0;
	unsigned char *buf=NULL;
	char *md5ref=!stricmp(ext, "ppm")? "c0c9f772b464d1896326883a5c79c545":
		"b03eec1eaaad38fed9cab5082bf37e52";

	if((buf=(unsigned char *)malloc(pitch*height))==NULL)
		_throw("Could not allocate memory");
	initBuf(buf, width, pitch, height, pf, orientation);

	snprintf(filename, 80, "bmptest_%s_%d_%s.%s", pfStr[pf], align,
		orientation==BMPORN_TOPDOWN? "td":"bu", ext);
	if(bmp_save(filename, buf, width, pitch, height, pf, orientation)==-1)
		_throw(bmp_geterr());
	md5sum=MD5File(filename, md5buf);
	if(stricmp(md5sum, md5ref))
		_throwmd5(filename, md5sum, md5ref);

	free(buf);  buf=NULL;
	if(bmp_load(filename, &buf, &loadWidth, align, &loadHeight, pf,
		orientation)==-1)
		_throw(bmp_geterr());
	if(width!=loadWidth || height!=loadHeight)
	{
		printf("\n   Image dimensions of %s are bogus\n", filename);
		retval=-1;  goto bailout;
	}
	if(!cmpBuf(buf, width, pitch, height, pf, orientation))
	{
		printf("\n   Pixel data in %s is bogus\n", filename);
		retval=-1;  goto bailout;
	}
	unlink(filename);

	bailout:
	if(buf) free(buf);
	return retval;
}
Esempio n. 8
0
int main()
{
  srand(time(0));

  s_settings settings;
  settings.mode = MODE_AUTO;
  settings.w = 960;
  settings.h = 480;
  settings.tiled_view = true;
  settings.paused = false;

  if(glfwInit() == GL_FALSE)
  {
    std::cerr << "Failed to init GLFW" << std::endl;
    return 1;
  }

  glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
  glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
  glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);

  GLFWwindow *window;
  if((window = glfwCreateWindow(settings.w, settings.h, "Painting Evolution", 0, 0)) == 0)
  {
    std::cerr << "Failed to open window" << std::endl;
    glfwTerminate();
    return 1;
  }

  glfwSetWindowUserPointer(window, &settings);

  glfwMakeContextCurrent(window);
  glfwSetWindowSizeCallback(window, glfw_window_size_callback);
  glfwSetCursorPosCallback(window, glfw_cursor_position_callback);
  glfwSetScrollCallback(window, glfw_mouse_scroll_callback);
  glfwSetKeyCallback(window, glfw_keyboard_callback);
  glfwSetMouseButtonCallback(window, glfw_mouse_button_callback);

  // start GLEW extension handler
  glewExperimental = GL_TRUE;
  GLenum err = glewInit();
  while((err = glGetError()) != GL_NO_ERROR)
  {
    std::cout << "glewInit error: " << err << std::endl;
    std::cout << std::endl;
  }
  
  #ifndef NDEBUG
  const GLubyte* renderer = glGetString(GL_RENDERER);
  const GLubyte* version = glGetString(GL_VERSION);
  
  std::cout << "Debug info:" << std::endl;
  std::cout << " Date: " << __DATE__ << std::endl;
  std::cout << " Time: " << __TIME__ << std::endl;
  std::cout << " Renderer: " << renderer << std::endl;
  std::cout << " OpenGL version supported: " << version << std::endl; 
  std::cout << " Max textures: " << GL_MAX_TEXTURE_UNITS << std::endl;
  std::cout << std::endl;
  #endif

  glEnable(GL_BLEND);
  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);


  bool r;
  
  GLuint vertex_shader, fragment_shader, compute_shader;

  r = vertex_shader_load(&vertex_shader, "shaders\\vertex_shader.glsl");
  if(r == false)
  {
    glfwDestroyWindow(window);
    glfwTerminate();
  }

  r = fragment_shader_load(&fragment_shader, "shaders\\fragment_shader.glsl");
  if(r == false)
  {
    glfwDestroyWindow(window);
    glfwTerminate();
  }

  r = compute_shader_load(&compute_shader, "shaders\\compute_shader.glsl");
  if(r == false)
  {
    glfwDestroyWindow(window);
    glfwTerminate();
  }


  GLuint shader_program, similarity_program;

  // create program
  shader_program = glCreateProgram();
  glAttachShader(shader_program, vertex_shader);
  glAttachShader(shader_program, fragment_shader);
  glLinkProgram(shader_program);
  check_program_link_status(shader_program);
  
  // create program
  similarity_program = glCreateProgram();
  glAttachShader(similarity_program, compute_shader);
  glLinkProgram(similarity_program);
  check_program_link_status(similarity_program);
  

  /**** side by side view ****/
  GLuint vao, vbo, cbo, uvbo;
  
  glGenVertexArrays(1, &vao);
  glBindVertexArray(vao);
  
  // Vertices
  glGenBuffers(1, &vbo);
  glBindBuffer(GL_ARRAY_BUFFER, vbo);
  glEnableVertexAttribArray(0);
  glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (char*)0 + 0*sizeof(GLfloat));
  
  // Colours
  glGenBuffers(1, &cbo);
  glBindBuffer(GL_ARRAY_BUFFER, cbo);
  glEnableVertexAttribArray(1);
  glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (char*)0 + 0*sizeof(GLfloat));
  
  // uvs
  glGenBuffers(1, &uvbo);
  glBindBuffer(GL_ARRAY_BUFFER, uvbo);
  glEnableVertexAttribArray(2);
  glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, (char*)0 + 0*sizeof(GLfloat));
  /**** side by side view ****/
  

  s_sim sim;
  bmp_load(&sim.target, "input.bmp");
  
  sim.grid_pos = 0;
  sim.grid_w = 8;
  sim.grid_h = 8;
  sim.tile_w = sim.target.w/sim.grid_w;
  sim.tile_h = sim.target.h/sim.grid_h;

  settings.sim = &sim;

  assert(sim.target.w%16 == 0);
  assert(sim.target.h%16 == 0);
  assert(sim.tile_w%16 == 0);
  assert(sim.tile_h%16 == 0);
  
  s_painting temp;
  for(int p = 0; p < 36; ++p)
  {
    sim.paintings.push_back(temp);
    painting_init(&sim.paintings[p], sim.tile_w, sim.tile_h);
  }
  for(int p = 0; p < sim.grid_w*sim.grid_h; ++p)
  {
    sim.grid_paintings.push_back(temp);
    painting_init(&sim.grid_paintings[p], sim.tile_w, sim.tile_h);
  }
  
  int num_workgroups = sim.tile_w*sim.tile_h/16/16;
  std::vector<GLfloat> scores(num_workgroups);
  

  // generate vao_compute and scores_bo
  GLuint vao_compute, scores_bo;
  
  glGenVertexArrays(1, &vao_compute);
  glBindVertexArray(vao_compute);
  
  glGenBuffers(1, &scores_bo);
  glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, scores_bo);
  glBufferData(GL_SHADER_STORAGE_BUFFER, num_workgroups*sizeof(scores[0]), &scores[0], GL_DYNAMIC_DRAW); // GL_STATIC_DRAW
  
  glGenTextures(1, &sim.target_id);
  glBindTexture(GL_TEXTURE_2D, sim.target_id);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); // GL_LINEAR
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); // GL_LINEAR
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

  glTexImage2D(GL_TEXTURE_2D, 0,GL_RGB, sim.target.w, sim.target.h, 0, GL_RGB, GL_UNSIGNED_BYTE, sim.target.data);

  glGenTextures(1, &sim.result_id);
  glBindTexture(GL_TEXTURE_2D, sim.result_id);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); // GL_LINEAR
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); // GL_LINEAR
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  glTexImage2D(GL_TEXTURE_2D, 0,GL_RGB, sim.target.w, sim.target.h, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);

  std::vector<GLubyte> emptyData(3 * sim.target.w * sim.target.h, 0);
  glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, sim.target.w, sim.target.h, GL_RGB, GL_UNSIGNED_BYTE, &emptyData[0]);
  
  
  GLuint highres_texture_id = 0;
  glGenTextures(1, &highres_texture_id);
  glBindTexture(GL_TEXTURE_2D, highres_texture_id);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); // GL_LINEAR
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); // GL_LINEAR
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  glTexImage2D(GL_TEXTURE_2D, 0,GL_RGB, sim.tile_w, sim.tile_h, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);

  // create a framebuffer object
  GLuint highres_fbo = 0;
  glGenFramebuffers(1, &highres_fbo);
  glBindFramebuffer(GL_FRAMEBUFFER, highres_fbo);
  
  // attach the texture to FBO color attachment point
  glFramebufferTexture2D(GL_FRAMEBUFFER,        // 1. fbo target: GL_FRAMEBUFFER 
                         GL_COLOR_ATTACHMENT0,  // 2. attachment point
                         GL_TEXTURE_2D,         // 3. tex target: GL_TEXTURE_2D
                         highres_texture_id,    // 4. tex ID
                         0);                    // 5. mipmap level: 0(base)

  glClearColor(0.0, 0.0, 0.0, 1.0);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  
  glBindTexture(GL_TEXTURE_2D, 0);
  
  // check FBO status
  GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
  if(status != GL_FRAMEBUFFER_COMPLETE)
  {
    std::cout << "Framebuffer error:" << status<< std::endl;
    return -1;
  }

  GLuint texture_slice = 0;
  glGenTextures(1, &texture_slice);
  glActiveTexture(GL_TEXTURE0 + texture_slice);
  glBindTexture(GL_TEXTURE_2D, texture_slice);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); // GL_LINEAR
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); // GL_LINEAR
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  glTexImage2D(GL_TEXTURE_2D, 0,GL_RGB, sim.tile_w, sim.tile_h, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
  glBindTexture(GL_TEXTURE_2D, 0);

  glPointSize(2.0);

  GLuint query;
  glGenQueries(1, &query);


  GLubyte *data = new GLubyte[3*sim.tile_w*sim.tile_h];

  unsigned int parent1_id = 0;
  unsigned int parent2_id = 0;
  float parent1_score = FLT_MIN;
  float parent2_score = FLT_MIN;

  int x_offset = 0;
  int y_offset = 0;
  int tile_x = 0;
  int tile_y = 0;
  int last_grid_pos = -1;
  int auto_generation = 0;
  float start_score = 0.0;

  while(!glfwWindowShouldClose(window))
  {
    glBeginQuery(GL_TIME_ELAPSED, query);

    if(settings.paused == false)
    {
      // Auto mode will spend a set number of generations per grid position and then move to the new lowest scoring
      if(settings.mode == MODE_AUTO && auto_generation >= AUTO_GENERATIONS)
      {
        // Set score rate
        sim.grid_paintings[sim.grid_pos].score_rate = (sim.grid_paintings[sim.grid_pos].score - start_score)/AUTO_GENERATIONS;

        assert(sim.grid_paintings[sim.grid_pos].score_rate >= 0.0);
        assert(sim.grid_paintings[sim.grid_pos].score_rate <= 1.0/AUTO_GENERATIONS);

        float fastest = FLT_MIN;
        for(unsigned int p = 0; p < sim.grid_paintings.size(); ++p)
        {
          if(sim.grid_paintings[p].score_rate > fastest)
          {
            sim.grid_pos = p;
            fastest = sim.grid_paintings[p].score_rate;
          }
        }

        start_score = sim.grid_paintings[sim.grid_pos].score;
        auto_generation = 0;
      }

      // Next tile
      if(last_grid_pos != sim.grid_pos)
      {
        if(last_grid_pos != -1)
        {
          // Update results texture - do all grid paintings because new ones might've been loaded in
          for(unsigned int p = 0; p < sim.grid_paintings.size(); ++p)
          {
            if(sim.grid_paintings[p].generation == 0) {continue;}

            tile_x = p%sim.grid_w;
            tile_y = p/sim.grid_w;
            
            x_offset = tile_x * sim.tile_w;
            y_offset = tile_y * sim.tile_h;
        
            // Save current best paiting to the results
            glViewport(0, 0, sim.tile_w, sim.tile_h);

            // Redraw
            glBindFramebuffer(GL_FRAMEBUFFER, highres_fbo);
            glClearColor(sim.grid_paintings[p].r, sim.grid_paintings[p].g, sim.grid_paintings[p].b, 1.0);
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
            
            // Bind the current vao
            glBindVertexArray(vao);
            
            // Vertices
            glBindBuffer(GL_ARRAY_BUFFER, vbo);
            glBufferData(GL_ARRAY_BUFFER, 2 * 3 * sim.grid_paintings[p].num_triangles * sizeof(GLfloat), &sim.grid_paintings[p].positions[0], GL_STATIC_DRAW);
            
            // Colours
            glBindBuffer(GL_ARRAY_BUFFER, cbo);
            glBufferData(GL_ARRAY_BUFFER, 3 * 3 * sim.grid_paintings[p].num_triangles * sizeof(GLfloat), &sim.grid_paintings[p].colours[0], GL_STATIC_DRAW);
            
            // Texture coords
            glBindBuffer(GL_ARRAY_BUFFER, uvbo);
            glBufferData(GL_ARRAY_BUFFER, 2 * 3 * sim.grid_paintings[p].num_triangles * sizeof(GLfloat), &sim.grid_paintings[p].uvs[0], GL_STATIC_DRAW);
            
            glUseProgram(shader_program);
            
            // Set the uniforms
            glm::mat4 view = glm::ortho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
            glUniformMatrix4fv(0, 1, GL_FALSE, glm::value_ptr(view));
            
            // Draw
            glDrawArrays(GL_TRIANGLES, 0, 3*sim.grid_paintings[p].num_triangles);


            // Get tile data
            glBindTexture(GL_TEXTURE_2D, highres_texture_id);
            glGetTexImage(GL_TEXTURE_2D, 0, GL_RGB, GL_UNSIGNED_BYTE, data);

            // Write tile to result texture
            glBindTexture(GL_TEXTURE_2D, sim.result_id);
            glTexSubImage2D(GL_TEXTURE_2D, 0, x_offset, y_offset, sim.tile_w, sim.tile_h, GL_RGB, GL_UNSIGNED_BYTE, data);
          }

          glBindFramebuffer(GL_FRAMEBUFFER, 0);
          glViewport(0, 0, settings.w, settings.h);
        }
        
        
        // If we've never been at this grid position before, we should start with some random paintings
        // If we have been here before, just copy the painting in storage
        if(sim.grid_paintings[sim.grid_pos].generation == 0)
        {
          for(unsigned int p = 0; p < sim.paintings.size(); ++p)
          {
            painting_randomise(&sim.paintings[p]);
          }
        }
        else
        {
          for(unsigned int p = 0; p < sim.paintings.size(); ++p)
          {
            painting_copy(&sim.paintings[p], &sim.grid_paintings[sim.grid_pos]);
          }
        }
        
        tile_x = sim.grid_pos%sim.grid_w;
        tile_y = sim.grid_pos/sim.grid_w;
        
        x_offset = tile_x * sim.tile_w;
        y_offset = tile_y * sim.tile_h;
        
        for(int y = 0; y < sim.tile_h; ++y)
        {
          for(int x = 0; x < sim.tile_w; ++x)
          {
            data[3*y*sim.tile_w + 3*x + 0] = sim.target.data[3*(y + y_offset) *sim.target.w + 3*(x + x_offset) + 0];
            data[3*y*sim.tile_w + 3*x + 1] = sim.target.data[3*(y + y_offset) *sim.target.w + 3*(x + x_offset) + 1];
            data[3*y*sim.tile_w + 3*x + 2] = sim.target.data[3*(y + y_offset) *sim.target.w + 3*(x + x_offset) + 2];
          }
        }
        
        glBindTexture(GL_TEXTURE_2D, texture_slice);
        glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, sim.tile_w, sim.tile_h, GL_RGB, GL_UNSIGNED_BYTE, data);
        
        std::cout << std::endl;
        std::cout << "Pos: " << tile_x << " " << tile_y << std::endl;
        std::cout << "Score: " << sim.grid_paintings[sim.grid_pos].score << std::endl;
        std::cout << "Rate: " << sim.grid_paintings[sim.grid_pos].score_rate << std::endl;
        std::cout << "Gen: " << sim.grid_paintings[sim.grid_pos].generation << std::endl;
        std::cout << std::endl;

        last_grid_pos = sim.grid_pos;
      }
      
      
      // Draw paintings
      glViewport(0, 0, sim.tile_w, sim.tile_h);
      for(unsigned int p = 0; p < sim.paintings.size(); ++p)
      {
        glBindFramebuffer(GL_FRAMEBUFFER, sim.paintings[p].fbo);
        glClearColor(sim.paintings[p].r, sim.paintings[p].g, sim.paintings[p].b, 1.0);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        
        // bind the current vao
        glBindVertexArray(vao);
        
        // Vertices
        glBindBuffer(GL_ARRAY_BUFFER, vbo);
        glBufferData(GL_ARRAY_BUFFER, 2 * 3 * sim.paintings[p].num_triangles * sizeof(GLfloat), &sim.paintings[p].positions[0], GL_STATIC_DRAW);
        
        // Colours
        glBindBuffer(GL_ARRAY_BUFFER, cbo);
        glBufferData(GL_ARRAY_BUFFER, 3 * 3 * sim.paintings[p].num_triangles * sizeof(GLfloat), &sim.paintings[p].colours[0], GL_STATIC_DRAW);
        
        // Texture coords
        glBindBuffer(GL_ARRAY_BUFFER, uvbo);
        glBufferData(GL_ARRAY_BUFFER, 2 * 3 * sim.paintings[p].num_triangles * sizeof(GLfloat), &sim.paintings[p].uvs[0], GL_STATIC_DRAW);
        
        glUseProgram(shader_program);
        
        // Set the uniforms
        glm::mat4 view = glm::ortho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
        glUniformMatrix4fv(0, 1, GL_FALSE, glm::value_ptr(view));
        
        // Draw
        glDrawArrays(GL_TRIANGLES, 0, 3*sim.paintings[p].num_triangles);
      }
      glBindFramebuffer(GL_FRAMEBUFFER, 0);
      glViewport(0, 0, settings.w, settings.h);

      // Comparisons
      for(unsigned int p = 0; p < sim.paintings.size(); ++p)
      {
        glUseProgram(similarity_program);

        glActiveTexture(GL_TEXTURE0 + texture_slice);
        glBindTexture(GL_TEXTURE_2D, texture_slice);

        glActiveTexture(GL_TEXTURE0 + sim.paintings[p].texture_id);
        glBindTexture(GL_TEXTURE_2D, sim.paintings[p].texture_id);

        // Setup uniforms
        glUniform1i(0, texture_slice);
        glUniform1i(1, sim.paintings[p].texture_id);
        glUniform1i(2, p);
    
        // Compute
        int groups_x = sim.tile_w/16;
        int groups_y = sim.tile_h/16;
    
        glDispatchCompute(groups_x, groups_y, 1);

        // Get scores
        glBindBuffer(GL_SHADER_STORAGE_BUFFER, scores_bo);
        glGetBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, num_workgroups*sizeof(scores[0]), &scores[0]);

        // Calculate similarity percentage
        sim.paintings[p].score = 0.0;
        for(int n = 0; n < num_workgroups; ++n)
        {
          sim.paintings[p].score += scores[n];
        }
        sim.paintings[p].score = 1.0 - sim.paintings[p].score/(3*sim.tile_w*sim.tile_h);
      }
      glActiveTexture(GL_TEXTURE0);
      
      // Find best painting
      parent1_id = sim.paintings.size();
      parent1_score = FLT_MIN;
      parent2_id = sim.paintings.size();
      parent2_score = FLT_MIN;

      for(unsigned int p = 0; p < sim.paintings.size(); ++p)
      {
        if(sim.paintings[p].score >= parent1_score)
        {
          parent2_id = parent1_id;
          parent2_score = parent1_score;

          parent1_id = p;
          parent1_score = sim.paintings[p].score;
          continue;
        }
        if(sim.paintings[p].score >= parent2_score)
        {
          parent2_id = p;
          parent2_score = sim.paintings[p].score;
        }
      }

      assert(parent1_id != sim.paintings.size());
      assert(parent2_id != sim.paintings.size());
      assert(parent1_id != parent2_id);
      assert(parent1_score >= 0.0);
      assert(parent2_score >= 0.0);
      

      // To be used when a screenshot is taken
      settings.best_painting = sim.result_id;


      // Create new sim.paintings from best
      for(unsigned int p = 0; p < sim.paintings.size(); ++p)
      {
        if(p == parent1_id || p == parent2_id) {continue;}

        paintings_breed(&sim.paintings[p], &sim.paintings[parent1_id], &sim.paintings[parent2_id]);
      }
      
      
      // Mutate sim.paintings
      for(unsigned int p = 0; p < sim.paintings.size(); ++p)
      {
        if(p == parent1_id || p == parent2_id) {continue;}

        painting_jiggle(&sim.paintings[p]);
      }
      

      // Print scores occasionally
      if(sim.grid_paintings[sim.grid_pos].generation%250 == 0)
      {
        //std::cout << "Gen " << sim.grid_paintings[sim.grid_pos].generation << ": " << parent1_id << " - " << sim.grid_paintings[sim.grid_pos].score*100.0 << "% " << std::endl;
        //std::cout << "Gen " << sim.grid_paintings[sim.grid_pos].generation << ": " << parent1_id << " - " << sim.grid_paintings[sim.grid_pos].score*100.0 << "% " << sim.grid_paintings[sim.grid_pos].score_rate << std::endl;
      }


      // Save best painting if it's an improvement
      if(sim.paintings[parent1_id].score > sim.grid_paintings[sim.grid_pos].score)
      {
        int temp = sim.grid_paintings[sim.grid_pos].generation;
        painting_copy(&sim.grid_paintings[sim.grid_pos], &sim.paintings[parent1_id]);
        sim.grid_paintings[sim.grid_pos].generation = temp;
      }
      

      // Count generations
      sim.grid_paintings[sim.grid_pos].generation++;
      if(settings.mode == MODE_AUTO)
      {
        auto_generation++;
      }
    }


    // Render target and best sim.paintings
    glBindFramebuffer(GL_FRAMEBUFFER, 0);
    glClearColor(0.0, 0.0, 0.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
    glBindVertexArray(vao);
    
    glUseProgram(shader_program);
    
    glm::mat4 view = glm::ortho(-1.0, 1.0, 0.0, 1.0, -1.0, 1.0);
    glUniformMatrix4fv(0, 1, GL_FALSE, glm::value_ptr(view));
    
    // Render target to the screen
    glBindTexture(GL_TEXTURE_2D, sim.target_id);
    GLfloat positions[8] = {-1.0, 0.0,
                            -1.0, 1.0,
                             0.0, 1.0,
                             0.0, 0.0};
    GLfloat colours[12] = {0.0, 0.0, 0.0,
                           0.0, 0.0, 0.0,
                           0.0, 0.0, 0.0,
                           0.0, 0.0, 0.0};
    GLfloat uvs[8] = {0.0, 0.0,
                      0.0, 1.0,
                      1.0, 1.0,
                      1.0, 0.0};
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, 8 * sizeof(GLfloat), &positions, GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, cbo);
    glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(GLfloat), &colours, GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, uvbo);
    glBufferData(GL_ARRAY_BUFFER, 8 * sizeof(GLfloat), &uvs, GL_STATIC_DRAW);
    glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
    
    if(settings.tiled_view == true)
    {
      unsigned int x_num = ceil(sqrt(sim.paintings.size()));
      unsigned int y_num = ceil(sqrt(sim.paintings.size()));

      if(x_num*(y_num-1) >= sim.paintings.size())
      {
        y_num -= 1;
      }

      float width  = 1.0/x_num;
      float height = 1.0/y_num;
      
      for(unsigned int y = 0; y < y_num; ++y)
      {
        for(unsigned int x = 0; x < x_num; ++x)
        {
          if(y*x_num + x >= sim.paintings.size()) {break;}
          
          glBindTexture(GL_TEXTURE_2D, sim.paintings[y*y_num + x].texture_id);
          positions[0] = x*width;     positions[1] = y*height;
          positions[2] = x*width;     positions[3] = (y+1)*height;
          positions[4] = (x+1)*width; positions[5] = (y+1)*height;
          positions[6] = (x+1)*width; positions[7] = y*height;
          glBindBuffer(GL_ARRAY_BUFFER, vbo);
          glBufferData(GL_ARRAY_BUFFER, 8 * sizeof(GLfloat), &positions, GL_STATIC_DRAW);
          glBindBuffer(GL_ARRAY_BUFFER, cbo);
          glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(GLfloat), &colours, GL_STATIC_DRAW);
          glBindBuffer(GL_ARRAY_BUFFER, uvbo);
          glBufferData(GL_ARRAY_BUFFER, 8 * sizeof(GLfloat), &uvs, GL_STATIC_DRAW);
          glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
        }
      }
    }
    else
    {
      // Draw the results texture
      glBindTexture(GL_TEXTURE_2D, sim.result_id);
      positions[0] = 0.0; positions[1] = 0.0;
      positions[2] = 0.0; positions[3] = 1.0;
      positions[4] = 1.0; positions[5] = 1.0;
      positions[6] = 1.0; positions[7] = 0.0;

      glBindBuffer(GL_ARRAY_BUFFER, vbo);
      glBufferData(GL_ARRAY_BUFFER, 8 * sizeof(GLfloat), &positions, GL_STATIC_DRAW);
      glBindBuffer(GL_ARRAY_BUFFER, cbo);
      glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(GLfloat), &colours, GL_STATIC_DRAW);
      glBindBuffer(GL_ARRAY_BUFFER, uvbo);
      glBufferData(GL_ARRAY_BUFFER, 8 * sizeof(GLfloat), &uvs, GL_STATIC_DRAW);
      glDrawArrays(GL_TRIANGLE_FAN, 0, 4);


      // Draw current best over the top of the results texture
      glBindTexture(GL_TEXTURE_2D, sim.paintings[parent1_id].texture_id);

      float x_gap = 1.0/sim.grid_w;
      float y_gap = 1.0/sim.grid_h;

      positions[0] = x_gap*tile_x;     positions[1] = y_gap*tile_y;
      positions[2] = x_gap*tile_x;     positions[3] = y_gap*(tile_y+1);
      positions[4] = x_gap*(tile_x+1); positions[5] = y_gap*(tile_y+1);
      positions[6] = x_gap*(tile_x+1); positions[7] = y_gap*tile_y;

      glBindBuffer(GL_ARRAY_BUFFER, vbo);
      glBufferData(GL_ARRAY_BUFFER, 8 * sizeof(GLfloat), &positions, GL_STATIC_DRAW);
      glBindBuffer(GL_ARRAY_BUFFER, cbo);
      glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(GLfloat), &colours, GL_STATIC_DRAW);
      glBindBuffer(GL_ARRAY_BUFFER, uvbo);
      glBufferData(GL_ARRAY_BUFFER, 8 * sizeof(GLfloat), &uvs, GL_STATIC_DRAW);
      glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
    }

    glfwSwapBuffers(window);
    

    // check for errors
    GLenum error = glGetError();
    if(error != GL_NO_ERROR)
    {
      std::cout << "Error: " << error << std::endl;
    }

    // FPS
    glEndQuery(GL_TIME_ELAPSED);
    GLuint64 result;
    glGetQueryObjectui64v(query, GL_QUERY_RESULT, &result);
    std::stringstream tmp;
    tmp << "Painting Evolution: " << int(1e9/result) << " FPS";
    glfwSetWindowTitle(window, tmp.str().c_str());


    glfwPollEvents();
  }

  delete[] data;

  // delete the created objects
  glDeleteVertexArrays(1, &vao);
  glDeleteBuffers(1, &scores_bo);

  glDetachShader(shader_program, vertex_shader);
  glDetachShader(shader_program, fragment_shader);
  glDeleteShader(vertex_shader);
  glDeleteShader(fragment_shader);
  glDeleteProgram(shader_program);

  glDetachShader(similarity_program, compute_shader);
  glDeleteShader(compute_shader);
  glDeleteProgram(similarity_program);

  glfwDestroyWindow(window);
  glfwTerminate();
  return 0;
}
int main() {
    // Init components
    components_init();
    
    // Load fonts
    f_small = font_load("font_small");
    f_large = font_load("font_large");
    
    // Load images
    img_blood = bmp_load("images/blood.bmp");
    bmp_image *img_space = bmp_load("images/space.bmp");
    bmp_image *img_ufo1 = bmp_load("images/ufo1.bmp");
    bmp_image *img_ufo2 = bmp_load("images/ufo2.bmp");
    bmp_image *img_ufo3 = bmp_load("images/ufo3.bmp");
    bmp_image *img_ufo4 = bmp_load("images/ufo4.bmp");
    bmp_image *img_ufo5 = bmp_load("images/ufo5.bmp");
    bmp_image *img_rabby = bmp_load("rabbit.bmp");
    bmp_image *img_powerup1 = bmp_load("images/pow1.bmp");
    bmp_image *img_powerup2 = bmp_load("images/pow1.bmp");
    bmp_image *img_powerup3 = bmp_load("images/pow1.bmp");
    bmp_image *img_powerup4 = bmp_load("images/pow1.bmp");
    bmp_image *img_rabby_red = bmp_copy(img_rabby);
    bmp_tint(img_rabby_red, 255, 128, 128);
    bmp_tint(img_powerup3, 0, 250, 29);
    bmp_tint(img_powerup2, 0, 0, 255);
    bmp_tint(img_powerup1, 255, 255, 29);
    
    // Create drawables
    space = drawable_create_bmp(img_space);
    ufo1 = drawable_create_bmp(img_ufo1);
    ufo2 = drawable_create_bmp(img_ufo2);
    ufo3 = drawable_create_bmp(img_ufo3);
    ufo4 = drawable_create_bmp(img_ufo4);
    ufo5 = drawable_create_bmp(img_ufo5);
    rabby = drawable_create_bmp(img_rabby);
    bullet = drawable_create_rect(4, 4, 255, 255, 255);
    rabby_red = drawable_create_bmp(img_rabby_red);
    power_sprite[0] = drawable_create_bmp(img_powerup1);
    power_sprite[1] = drawable_create_bmp(img_powerup2);
    power_sprite[2] = drawable_create_bmp(img_powerup3);
    power_sprite[3] = drawable_create_bmp(img_powerup4);
    
    // Start midi player in another thread
    pthread_t thread_midi;
    int result = pthread_create(&thread_midi, NULL, midi_run, NULL);
    
    // Loop game
    while (1) {
        engine_init();
        init();
        engine_run();
        dispose();
        engine_dispose();
    }
}
Esempio n. 10
0
int main(int argc, char **argv)
{
	unsigned char *img1=NULL, *img2=NULL, *errImg=NULL;
	int usePPM=0;
	unsigned char err, pixelErr, maxCompErr[4]={ 0, 0, 0, 0 },
		minCompErr[4]={ 255, 255, 255, 255 }, maxTotalErr, minTotalErr;
	double avgCompErr[4]={ 0., 0., 0., 0. }, avgTotalErr=0.,
		compSumSquares[4]={ 0., 0., 0., 0. }, totalSumSquares=0.,
		rms[4]={ 0., 0., 0., 0. }, totalRMS;
	int width1, height1, ps1=3, width2, height2, ps2=3, width, height,
		i, j, k, mag=0;
	char *temp;

	if(argc<3)
	{
		printf("\nUSAGE: %s <image 1> <image 2> [-mag]\n", argv[0]);
		printf("       (images must be in BMP or PPM format)\n");
		printf("\n-mag = show magnitude of differences using an artificial\n");
		printf("       color scale\n\n");
		exit(1);
	}
	if(argc>3 && !strcmp(argv[3], "-mag")) mag=1;

	if((temp=strrchr(argv[1], '.'))!=NULL && !stricmp(temp, ".ppm"))
		usePPM=1;

	if(mag)
	{
		for(i=0; i<64; i++)
		{
			redMap[i]=0;  greenMap[i]=i*4;  blueMap[i]=0;
		}
		for(i=0; i<64; i++)
		{
			redMap[i+64]=i*4;  greenMap[i+64]=255;  blueMap[i+64]=0;
		}
		for(i=0; i<64; i++)
		{
			redMap[i+128]=255;  greenMap[i+128]=255-i*4;  blueMap[i+128]=0;
		}
		for(i=0; i<64; i++)
		{
			redMap[i+192]=255;  greenMap[i+192]=i*4;  blueMap[i+192]=i*4;
		}
	}

	if(bmp_load(argv[1], &img1, &width1, 1, &height1, BMPPF_BGR,
		BMPORN_TOPDOWN)==-1)
	{
		puts(bmp_geterr());  exit(1);
	}
	if(bmp_load(argv[2], &img2, &width2, 1, &height2, BMPPF_BGR,
		BMPORN_TOPDOWN)==-1)
	{
		puts(bmp_geterr());  exit(1);
	}
	width=min(width1, width2);  height=min(height1, height2);

	if((errImg=(unsigned char *)malloc(width*height*ps1))==NULL)
	{
		puts("Could not allocate memory");  exit(1);
	}

	for(j=0; j<height; j++)
		for(i=0; i<width; i++)
		{
			pixelErr=0;
			for(k=0; k<ps1; k++)
			{
				err=(unsigned char)abs((int)img2[(width2*j+i)*ps2+k]
					-(int)img1[(width1*j+i)*ps1+k]);
				if(err>pixelErr) pixelErr=err;
				if(err>maxCompErr[k]) maxCompErr[k]=err;
				if(err<minCompErr[k]) minCompErr[k]=err;
				avgCompErr[k]+=err;  compSumSquares[k]+=err*err;
				if(!mag) errImg[(width*j+i)*ps1+k]=err;
			}
			if(mag)
			{
				errImg[(width*j+i)*ps1]=blueMap[pixelErr];
				errImg[(width*j+i)*ps1+1]=greenMap[pixelErr];
				errImg[(width*j+i)*ps1+2]=redMap[pixelErr];
			}
		}
	maxTotalErr=maxCompErr[0];  minTotalErr=minCompErr[0];
	for(k=0; k<ps1; k++)
	{
		if(minCompErr[k]<maxTotalErr) minTotalErr=minCompErr[k];
		if(maxCompErr[k]>maxTotalErr) maxTotalErr=maxCompErr[k];
		avgTotalErr+=avgCompErr[k];
		avgCompErr[k]/=((double)height*(double)width);
		totalSumSquares+=compSumSquares[k];
		compSumSquares[k]/=((double)height*(double)width);
		rms[k]=sqrt(compSumSquares[k]);
	}
	avgTotalErr/=((double)height*(double)width*(double)ps1);
	totalSumSquares/=((double)height*(double)width*(double)ps1);
	totalRMS=sqrt(totalSumSquares);

	if(bmp_save(usePPM? "diff.ppm":"diff.bmp", errImg, width, 0, height,
		BMPPF_BGR, BMPORN_TOPDOWN)==-1)
	{
		puts(bmp_geterr());  exit(1);
	}
	free(errImg);

	for(k=0; k<ps1; k++)
		printf("%s: min err.= %d max err.= %d avg err.= %f rms= %f PSNR= %f\n",
			k==0? "B":(k==1? "G":(k==2? "R":"A")), minCompErr[k], maxCompErr[k],
			avgCompErr[k], rms[k], 20.*log10(255./rms[k]));
	printf("T: min err.= %d max err.= %d avg err.= %f rms= %f PSNR= %f\n",
		minTotalErr, maxTotalErr, avgTotalErr, totalRMS, 20.*log10(255./totalRMS));

	return 0;
}