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); }
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); }
int test_material_new(void) { int numblocks = 3; Material * m = material_new(numblocks); material_delete(m); return 1; }
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); }
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; }
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; }
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); }
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; }
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; }