예제 #1
0
void setUpReference() {
  // Light
  lights[numLights++] = light_new(point_new(3, 5, -15), 0);

  // Reflective material
  color_t color = rgb(0, 0, 0);
  material_t refl = material_new(color, 1);

  // Red material
  color = rgb(255, 0, 0);
  material_t red = material_new(color, 0);

  // Blue material
  color = rgb(0, 0, 255);
  material_t blue = material_new(color, 0);

  // White material
  color = rgb(255, 255, 255);
  material_t white = material_new(color, 0);

  // Spheres
  point_t s = point_new(0, 0, -16);
  spheres[numSpheres++] = sphere_new(s, 2, refl);

  s = point_new(3, -1, -14);
  spheres[numSpheres++] = sphere_new(s, 1, refl);

  s = point_new(-3, -1, -14);
  spheres[numSpheres++] = sphere_new(s, 1, red);

  // Back blue wall
  point_t a = point_new(-8, -2, -20);
  point_t b = point_new(8, -2, -20);
  point_t c = point_new(8, 10, -20);
  triangles[numTriangles++] = triangle_new3(a, b, c, blue);
  a = point_new(-8, -2, -20);
  b = point_new(8, 10, -20);
  c = point_new(-8, 10, -20);
  triangles[numTriangles++] = triangle_new3(a, b, c, blue);

  // White floor
  a = point_new(-8, -2, -20);
  b = point_new(8, -2, -10);
  c = point_new(8, -2, -20);
  triangles[numTriangles++] = triangle_new3(a, b, c, white);
  a = point_new(-8, -2, -20);
  b = point_new(-8, -2, -10);
  c = point_new(8, -2, -10);
  triangles[numTriangles++] = triangle_new3(a, b, c, white);

  // Right red wall
  a = point_new(8, -2, -20);
  b = point_new(8, -2, -10);
  c = point_new(8, 10, -20);
  triangles[numTriangles++] = triangle_new3(a, b, c, red);
}
예제 #2
0
파일: g_ship.c 프로젝트: brownman/bastos85
static void register_ship(void){
	particle_t*p;
	model_t *mod;
	material_t *mat;

	mod = model_load("data/ship.obj");
	
	mat = material_new();
	material_set_diffuse(mat,1,0,0,1.0);
	material_set_spec(mat,1,0.5,0.2,1.0);
	material_set_edge(mat,0.5,0,0,0.1);
	material_set_shininess(mat,50);
	material_enable(mat, DRAW_FACE | DRAW_EDGE);
	model_set_material(mod,1,mat);

	mat = material_new();
	material_set_diffuse(mat,0.8,0.8,0.8,1);
	material_set_spec(mat,0.8,0.8,0.8,1);
	material_set_shininess(mat,50);
	material_set_edge(mat,0,0,0,0.1);
	material_enable(mat, DRAW_FACE | DRAW_EDGE);
	model_set_material(mod,0,mat);

	mat = material_new();
	material_set_diffuse(mat,0,0,0,1);
	material_set_edge(mat,1,1,1,0.1);
	material_enable(mat, DRAW_FACE | DRAW_EDGE );
	model_set_material(mod,2,mat);


	p = particle_new(box_new(vec_new(0,0),40,32),0);
	p->draw = ship_draw;	
	p->move = particle_simple_move;
	p->action = ship_action;
	p->collide = ship_collide;
	p->vector[MISSILE] = vec_new(100,0);
	p->model[0] = mod;
	particle_set_color(p,1,0.3,0,0.1);
	particle_set_alt_color(p,1,0.5,0,0.5);
	particle_set_collides(p,1);
	particle_set_camera(p,1);
	particle_set_solid(p,1);
	particle_set_group(p,P_SHIP);
	particle_toggle_collide_group(p,P_SHIP);
	particle_toggle_collide_group(p,P_MISSILE);
	particle_set_nprop(p,SHIP_HSPEED,nprop_new(0,SHIP_ACCEL));
	particle_set_nprop(p,SHIP_VSPEED,nprop_new(0,SHIP_ACCEL));
	factory_register(p,P_SHIP);	
}
예제 #3
0
int
test_material_new(void) {

  int numblocks = 3;

  Material * m = material_new(numblocks);
  
  material_delete(m);

  return 1;
}
예제 #4
0
파일: g_ship.c 프로젝트: brownman/bastos85
static void register_ship_missile(void){
	particle_t *p;
	model_t *mod;
	material_t *mat;

	mod = model_load("data/missile.obj");
	
	mat = material_new();
	material_set_diffuse(mat,1,0,0,1.0);
	material_set_emit(mat,0.2,0.1,0,1.0);
	material_set_spec(mat,1,0.5,0.2,1.0);
	material_set_edge(mat,0.5,0,0,0.1);
	material_set_shininess(mat,50);
	material_enable(mat, DRAW_FACE | DRAW_EDGE);
	model_set_material(mod,0,mat);

	mat = material_new();
	material_set_diffuse(mat,0.416,0.525,0.345,1);
	material_set_spec(mat,0.025,0.149,0,1);
	material_set_shininess(mat,50);
	material_set_edge(mat,0,0,0,0.1);
	material_enable(mat, DRAW_FACE | DRAW_EDGE);
	model_set_material(mod,1,mat);

	p = particle_new(box_new(vec_new(0,0),10,10),-1);
	particle_set_color(p,0,0.5,1,0.1);
	particle_set_alt_color(p,0.1,0.6,1,0.1);
	p->draw = missile_draw;
	p->move = particle_simple_move;
	p->collide = missile_collide;
	p->die	= missile_die;
	p->action = missile_action;
	particle_set_group(p,P_MISSILE);
	particle_toggle_collide_group(p,P_SHIP);
	particle_toggle_collide_group(p,P_MISSILE);
	p->model[0] = mod;
	particle_set_collides(p,1);
	p->a = vec_new(0,0);
	particle_set_solid(p,0);
	factory_register(p,P_MISSILE);
}
예제 #5
0
파일: cmd.c 프로젝트: odrevet/lca-tool
bool cmd_new_material(APP_LCA *p_app){
  //ask for the material name
  char material_name[BUFSIZ] = {0};
  printf("Material name: ");
  scanf("%s", material_name);

  //create a new material
  Material *tmp_material = material_new(material_name);
  if(!tmp_material){
    puts("Error while creating a new material (cannot allocate memory)");
    return false;
  }

  //add this input to the app input list
  app_add_input(p_app, (Input*)tmp_material);

  return true;
}
예제 #6
0
파일: product.c 프로젝트: odrevet/lca-tool
Input_Amount* product_extend(Product *p_product,
			     float parent_amount,
			     Input_Amount *p_input_amount,
			     int *nb_input_amount){
#ifdef DEBUG
  printf("\nextend %.1f %s\n",
	 parent_amount,
	 p_product->name);
#endif

  //for each input in the product
  for(int i=0;i<p_product->nb_input_amount;i++){
    Input_Amount *product_input_amount = p_product->input_amount_list+i;

    //if no amount, skip to the next iteration
    if(product_input_amount->amount <= 0)continue;

    Input_Amount *tmp_product_IA = NULL;


    //check if this product input is raw or intermediate
    if(product_input_amount->p_input->is_raw){
      if(p_input_amount){
        tmp_product_IA = get_input_amount_by_name(p_input_amount,
						  *nb_input_amount,
						  product_input_amount->p_input->name);
      }

      if(!tmp_product_IA){
        //there was no raw material for this product input
        //create the Input_Amount
        tmp_product_IA = malloc(sizeof(Input_Amount));

	//create the input (material)
	tmp_product_IA->p_input = (Input*)material_new(product_input_amount->p_input->name);
	tmp_product_IA->amount = product_input_amount->amount * parent_amount;

	//allocat memory and assign the material to the input_amount
        p_input_amount = realloc(p_input_amount,
				 sizeof(Input_Amount) * (*nb_input_amount+1));

        p_input_amount[*nb_input_amount] = *tmp_product_IA;

	//increase the out param nb_input_amount by one
        (*nb_input_amount)++;
      }
      else{
#ifdef DEBUG
	printf("\nAdd %.1f (%.1f * %.1f) %s to %.1f\n",
	       product_input_amount->amount * parent_amount,
	       product_input_amount->amount , parent_amount,
	       tmp_product_IA->p_input->name,
	       tmp_product_IA->amount);
#endif

        tmp_product_IA->amount += product_input_amount->amount * parent_amount;
      }

    }
    //compare names to avoid infinit recursive calls by extending itself
    else if(strcmp(product_input_amount->p_input->name, p_product->name)){
      //this input is not raw, extend it
      p_input_amount = product_extend((Product*)product_input_amount->p_input,
				      product_input_amount->amount * parent_amount,
				      p_input_amount,
				      nb_input_amount);
    }
  }

  return p_input_amount;
}
예제 #7
0
void setUpCustom() {
  // Light
  lights[numLights++] = light_new(point_new(0, 2, -6), 0.5);

  // Reflective material
  color_t color = rgb(0, 0, 0);
  material_t refl = material_new(color, 1);

  // Red material
  color = rgb(231, 76, 60);
  material_t red = material_new(color, 0);

  // Green material
  color = rgb(46, 204, 113);
  material_t green = material_new(color, 0);

  // Purple material
  color = rgb(155, 89, 182);
  material_t purple = material_new(color, 0);

  // White material
  color = rgb(255, 255, 255);
  material_t white = material_new(color, 0);

  // Spheres
  point_t s = point_new(-1, -1, -8);
  spheres[numSpheres++] = sphere_new(s, 1, refl);

  s = point_new(1, -1, -7);
  spheres[numSpheres++] = sphere_new(s, 1, purple);

  // White back wall
  point_t a = point_new(-2.5, -2, -10);
  point_t b = point_new(2.5, -2, -10);
  point_t c = point_new(-2.5, 2, -10);
  triangles[numTriangles++] = triangle_new3(a, b, c, white);
  a = point_new(2.5, -2, -10);
  b = point_new(2.5, 2, -10);
  c = point_new(-2.5, 2, -10);
  triangles[numTriangles++] = triangle_new3(a, b, c, white);

  // White ceiling (it has a hole in it...)
  a = point_new(-2.5, 2, -2);
  b = point_new(2.5, 2, -2);
  c = point_new(2.5, 2, -5.5);
  triangles[numTriangles++] = triangle_new3(a, b, c, white);
  a = point_new(-2.5, 2, -2);
  b = point_new(2.5, 2, -5.5);
  c = point_new(-2.5, 2, -5.5);
  triangles[numTriangles++] = triangle_new3(a, b, c, white);
  a = point_new(-2.5, 2, -10);
  b = point_new(2.5, 2, -6.5);
  c = point_new(-2.5, 2, -6.5);
  triangles[numTriangles++] = triangle_new3(a, b, c, white);
  a = point_new(-2.5, 2, -10);
  b = point_new(2.5, 2, -10);
  c = point_new(2.5, 2, -6.5);
  triangles[numTriangles++] = triangle_new3(a, b, c, white);
  a = point_new(-2.5, 2, -6.5);
  b = point_new(-0.5, 2, -6.5);
  c = point_new(-0.5, 2, -5.5);
  triangles[numTriangles++] = triangle_new3(a, b, c, white);
  a = point_new(-2.5, 2, -6.5);
  b = point_new(-0.5, 2, -5.5);
  c = point_new(-2.5, 2, -5.5);
  triangles[numTriangles++] = triangle_new3(a, b, c, white);
  a = point_new(0.5, 2, -6.5);
  b = point_new(2.5, 2, -6.5);
  c = point_new(2.5, 2, -5.5);
  triangles[numTriangles++] = triangle_new3(a, b, c, white);
  a = point_new(0.5, 2, -6.5);
  b = point_new(2.5, 2, -5.5);
  c = point_new(0.5, 2, -5.5);
  triangles[numTriangles++] = triangle_new3(a, b, c, white);

  // White floor
  a = point_new(-2.5, -2, -2);
  b = point_new(2.5, -2, -2);
  c = point_new(2.5, -2, -10);
  triangles[numTriangles++] = triangle_new3(a, b, c, white);
  a = point_new(-2.5, -2, -2);
  b = point_new(2.5, -2, -10);
  c = point_new(-2.5, -2, -10);
  triangles[numTriangles++] = triangle_new3(a, b, c, white);

  // Red left wall
  a = point_new(-2.5, -2, -2);
  b = point_new(-2.5, -2, -10);
  c = point_new(-2.5, 2, -10);
  triangles[numTriangles++] = triangle_new3(a, b, c, red);
  a = point_new(-2.5, -2, -2);
  b = point_new(-2.5, 2, -10);
  c = point_new(-2.5, 2, -2);
  triangles[numTriangles++] = triangle_new3(a, b, c, red);

  // Green right wall
  a = point_new(2.5, -2, -2);
  b = point_new(2.5, -2, -10);
  c = point_new(2.5, 2, -10);
  triangles[numTriangles++] = triangle_new3(a, b, c, green);
  a = point_new(2.5, -2, -2);
  b = point_new(2.5, 2, -10);
  c = point_new(2.5, 2, -2);
  triangles[numTriangles++] = triangle_new3(a, b, c, green);
}
예제 #8
0
material* mat_load_file(char* filename) {
  
  SDL_RWops* file = SDL_RWFromFile(filename, "r");
  if(file == NULL) {
    error("Cannot load file %s", filename);
  }
  
  material* m = material_new();
  material_entry* me = material_add_entry(m);
  
  char line[1024];
  while(SDL_RWreadline(file, line, 1024)) {
    
    if (line[0] == '#') { continue; }
    if (line[0] == '\r') { continue; }
    if (line[0] == '\n') { continue; }
    
    if (strstr(line, "submaterial")) {
      
      /* Skip Empty Submaterials */
      if (me->num_items == 0) {
        continue;
      } else {
        me = material_add_entry(m);
        continue;
      }
      
    }
    
    char type[512]; char name[512]; char value[512];
    int matches = sscanf(line, "%511s %511s = %511s", type, name, value);
    
    if (matches != 3) continue;
    
    material_item mi;
    int type_id;
    char* end;
    float f0, f1, f2, f3;
    
    if (strcmp(type, "shader") == 0) {
    
      mi.as_asset = asset_hndl_new_load(P(value));
      type_id = mat_item_shader;
      
    } else if (strcmp(type, "texture") == 0) {
    
      mi.as_asset = asset_hndl_new_load(P(value));
      type_id = mat_item_texture;
    
    } else if (strcmp(type, "int") == 0) {
    
      mi.as_int = atoi(value);
      type_id = mat_item_int;
    
    } else if (strcmp(type, "float") == 0) {
      
      mi.as_float = atof(value);
      type_id = mat_item_float;
      
    } else if (strcmp(type, "vec2") == 0) {
    
      f0 = strtod(value, &end); f1 = strtod(end, NULL);
      mi.as_vec2 = vec2_new(f0, f1);
      type_id = mat_item_vec2;
      
    } else if (strcmp(type, "vec3") == 0) {
      
      f0 = strtod(value, &end); f1 = strtod(end, &end);
      f2 = strtod(end, NULL);
      mi.as_vec3 = vec3_new(f0, f1, f2);
      type_id = mat_item_vec3;
      
    } else if (strcmp(type, "vec4") == 0) {
    
      f0 = strtod(value, &end); f1 = strtod(end, &end);
      f2 = strtod(end, &end); f3 = strtod(end, NULL);
      mi.as_vec4 = vec4_new(f0, f1, f2, f3);
      type_id = mat_item_vec4;
      
    } else {
      error("Unknown material item type '%s'", type);
      return NULL;
    }
    
    material_entry_add_item(me, name, type_id, mi);
    
  }
  
  SDL_RWclose(file);
  
  material_generate_programs(m);
  
  SDL_GL_CheckError();
  
  return m;
}
예제 #9
0
int main(){
  //expected values
  const float EXPECTED_HOUSE_STONE = HOUSE_STONE_AMOUNT;
  const float EXPECTED_HOUSE_WOOD = HOUSE_WOOD_AMOUNT + (HOUSE_WINDOW_AMOUNT * WINDOW_WOOD_AMOUNT);
  const float EXPECTED_HOUSE_SAND = HOUSE_WINDOW_AMOUNT * (WINDOW_GLASS_AMOUNT * GLASS_SAND_AMOUNT);

  //optimistic initialization
  int acceptance = 1;
  
  //define the app
  APP_LCA app;
  app_init(&app);
  
  //create some materials
  Material *wood = material_new("Wood");
  app_add_input(&app, (Input*) wood);

  Material *sand = material_new("Sand");
  app_add_input(&app, (Input*) sand);

  Material *stone = material_new("Stone");
  app_add_input(&app, (Input*) stone);

  //create some products
  Product *glass = product_new("Glass");
  app_add_input(&app, (Input*) glass);

  Product *window = product_new("Window");
  app_add_input(&app, (Input*) window);

  Product *house = product_new("House");
  app_add_input(&app, (Input*) house);

  //set amount for products
  //glass
  Input_Amount glass_sand_IA;
  glass_sand_IA.p_input = (Input*)sand;
  glass_sand_IA.amount = GLASS_SAND_AMOUNT;

  
  product_add_input_amount(glass, &glass_sand_IA);

  //window
  Input_Amount window_wood_IA;
  window_wood_IA.p_input = (Input*)wood;
  window_wood_IA.amount = WINDOW_WOOD_AMOUNT;

  Input_Amount window_glass_IA;
  window_glass_IA.p_input = (Input*)glass;
  window_glass_IA.amount = WINDOW_GLASS_AMOUNT;


  product_add_input_amount(window, &window_wood_IA);
  product_add_input_amount(window, &window_glass_IA);
    
  //house
  Input_Amount house_stone_IA;
  house_stone_IA.p_input = (Input*)stone;
  house_stone_IA.amount = HOUSE_STONE_AMOUNT;

  Input_Amount house_wood_IA;
  house_wood_IA.p_input = (Input*)wood;
  house_wood_IA.amount = HOUSE_WOOD_AMOUNT;

  Input_Amount house_window_IA;
  house_window_IA.p_input = (Input*)window;
  house_window_IA.amount = HOUSE_WINDOW_AMOUNT;


  product_add_input_amount(house, &house_stone_IA);
  product_add_input_amount(house, &house_wood_IA);
  product_add_input_amount(house, &house_window_IA);
  
  //calculate how many raw material is needed to build a house
  Input_Amount *p_input_amount_list=NULL;
  int nb_input_amount = 0;
  float parent_amount = 1;
  
  p_input_amount_list = product_extend(house,
				       parent_amount,
				       p_input_amount_list,
				       &nb_input_amount);

  //create a product to display the calculation
  Product product_all_raw_inputs;
  product_all_raw_inputs.nb_input_amount = nb_input_amount;
  input_set_name((Input*)&product_all_raw_inputs, house->name);
  product_all_raw_inputs.input_amount_list = p_input_amount_list;

  //print, no needs to multiply with parent amount here, the calculations are
  //all done
  product_print_inputs(&product_all_raw_inputs, 1);
  printf("\n");
  

  //print expected results
  printf("Expected\n%s %.1f, %s %.1f, %s %.1f\n",
	 "Stone", EXPECTED_HOUSE_STONE,
	 "Sand", EXPECTED_HOUSE_SAND,
	 "Wood", EXPECTED_HOUSE_WOOD
	 );

  //compare values and set return value acceptance
  Input_Amount *house_stone_IA_total =  get_input_amount_by_name(p_input_amount_list,
								 nb_input_amount,
								 "Stone");
  if(house_stone_IA_total->amount != EXPECTED_HOUSE_STONE){
    printf("ERROR ! get %f stone, expected %f\n",
	   house_stone_IA_total->amount,
	   EXPECTED_HOUSE_STONE);
    acceptance = 0;
  }
  else{
    puts("Stone.......[Ok]");
  }


  Input_Amount *house_wood_IA_total =  get_input_amount_by_name(p_input_amount_list,
								 nb_input_amount,
								 "Wood");
  
  if(house_wood_IA_total->amount != EXPECTED_HOUSE_WOOD){
    printf("ERROR ! get %f wood, expected %f\n",
	   house_wood_IA_total->amount,
	   EXPECTED_HOUSE_WOOD);
    acceptance = 0;
  }
  else{
    puts("Wood.......[Ok]");
  }

  
  Input_Amount *house_sand_IA_total =  get_input_amount_by_name(p_input_amount_list,
								nb_input_amount,
								"Sand");
  
  if(house_sand_IA_total->amount != EXPECTED_HOUSE_SAND){
    printf("ERROR ! get %f sand, expected %f\n",
	   house_sand_IA_total->amount,
	   EXPECTED_HOUSE_SAND);
    acceptance = 0;
  }
  else{
    puts("Sand.......[Ok]");
  }
  
  //free memory
  product_clear_inputs(&product_all_raw_inputs);


  if(acceptance)puts("All tests OK ! ");
  else puts("Oops ! Something when wrong, check log");

  app_free(&app);
  
  return acceptance;
}