X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=src%2Fmaterial.cpp;h=087952a78074afe97a6d3842f51eb8d7c92e2d09;hb=79e12d94cc21232477796a4e76fc2ddb5d88f9dc;hp=d24c2b428a9c4a1fa99c632b4ae44d35ebc4b70c;hpb=d69b0483db5791086c6aa80cbca08fa38c631cad;p=guile-irrlicht.git diff --git a/src/material.cpp b/src/material.cpp index d24c2b4..087952a 100644 --- a/src/material.cpp +++ b/src/material.cpp @@ -26,22 +26,70 @@ #include "gsubr.h" #include "material.h" #include "material-types.h" - +#include "wrapped.h" using namespace irr; - SCM -video_SMaterial_make (SCM material_type, SCM ambient_color, SCM diffuse_color, - SCM emissive_color, SCM specular_color, SCM shininess, - SCM material_type_param, SCM material_type_param_2, SCM thickness, - SCM z_buffer, SCM anti_aliasing, SCM color_mask, - SCM color_material, SCM blend_operation, SCM polygon_offset_factor, - SCM polygon_offset_direction, SCM wireframe, SCM point_cloud, - SCM gouraud_shading, SCM lighting, SCM z_write_enable, - SCM backface_culling, SCM frontface_culling, SCM fog_enable, - SCM normalize_normals, SCM use_mip_maps) +SMaterial_make (SCM rest) { + SCM material_type; + SCM ambient_color; + SCM diffuse_color; + SCM emissive_color; + SCM specular_color; + SCM shininess; + SCM material_type_param; + SCM material_type_param_2; + SCM thickness; + SCM z_buffer; + SCM anti_aliasing; + SCM color_mask; + SCM color_material; + SCM blend_operation; + SCM polygon_offset_factor; + SCM polygon_offset_direction; + SCM wireframe; + SCM point_cloud; + SCM gouraud_shading; + SCM lighting; + SCM z_write_enable; + SCM backface_culling; + SCM frontface_culling; + SCM fog_enable; + SCM normalize_normals; + SCM use_mip_maps; + + scm_c_bind_keyword_arguments + ("video_SMaterial_make", rest, (scm_t_keyword_arguments_flags)0, + scm_from_utf8_keyword ("material-type"), &material_type, + scm_from_utf8_keyword ("ambient-color"), &ambient_color, + scm_from_utf8_keyword ("diffuse-color"), &diffuse_color, + scm_from_utf8_keyword ("emissive-color"), &emissive_color, + scm_from_utf8_keyword ("specular-color"), &specular_color, + scm_from_utf8_keyword ("shininess"), &shininess, + scm_from_utf8_keyword ("material-type-param"), &material_type_param, + scm_from_utf8_keyword ("material-type-param-2"), &material_type_param_2, + scm_from_utf8_keyword ("thickness"), &thickness, + scm_from_utf8_keyword ("z-buffer"), &z_buffer, + scm_from_utf8_keyword ("anti-aliasing"), &anti_aliasing, + scm_from_utf8_keyword ("color-mask"), &color_mask, + scm_from_utf8_keyword ("color-material"), &color_material, + scm_from_utf8_keyword ("blend-operation"), &blend_operation, + scm_from_utf8_keyword ("polygon-offset-factor"), &polygon_offset_factor, + scm_from_utf8_keyword ("polygon-offset-direction"), &polygon_offset_direction, + scm_from_utf8_keyword ("wireframe"), &wireframe, + scm_from_utf8_keyword ("point-cloud"), &point_cloud, + scm_from_utf8_keyword ("gouraud-shading"), &gouraud_shading, + scm_from_utf8_keyword ("lighting"), &lighting, + scm_from_utf8_keyword ("z-write-enable"), &z_write_enable, + scm_from_utf8_keyword ("backface-culling"), &backface_culling, + scm_from_utf8_keyword ("frontface-culling"), &frontface_culling, + scm_from_utf8_keyword ("fog-enable"), &fog_enable, + scm_from_utf8_keyword ("normalize-normals"), &normalize_normals, + scm_from_utf8_keyword ("use-mip-maps"), &use_mip_maps, + SCM_UNDEFINED); + video::SMaterial* material = new video::SMaterial (); material->MaterialType = scm_to_material_type(material_type); material->AmbientColor = scm_to_color (ambient_color); @@ -69,248 +117,267 @@ video_SMaterial_make (SCM material_type, SCM ambient_color, SCM diffuse_color, material->FogEnable = scm_to_bool (fog_enable); material->NormalizeNormals = scm_to_bool (normalize_normals); material->UseMipMaps = scm_to_bool (use_mip_maps); - return scm_from_pointer ((void*) material, NULL); + return scm_from_irr_pointer ("", (void*) material); } - -extern "C" { - - void - init_material (void) - { - DEFINE_GSUBR ("video_SMaterial_make", 26, 0, 0, video_SMaterial_make); - } - +void +init_material (void) +{ + DEFINE_GSUBR ("SMaterial_make", 0, 0, 1, SMaterial_make); } - video::E_ANTI_ALIASING_MODE scm_to_anti_aliasing_mode (SCM anti_aliasing_mode) { - char* mode = scm_to_utf8_stringn (scm_symbol_to_string (anti_aliasing_mode), NULL); - if (!strcmp (mode, "off")) + char* mode_name = scm_to_utf8_string (scm_symbol_to_string (anti_aliasing_mode)); + video::E_ANTI_ALIASING_MODE mode; + + if (!strcmp (mode_name, "off")) { - return video::EAAM_OFF; + mode = video::EAAM_OFF; } - else if (!strcmp (mode, "simple")) + else if (!strcmp (mode_name, "simple")) { - return video::EAAM_SIMPLE; + mode = video::EAAM_SIMPLE; } - else if (!strcmp (mode, "quality")) + else if (!strcmp (mode_name, "quality")) { - return video::EAAM_QUALITY; + mode = video::EAAM_QUALITY; } - else if (!strcmp (mode, "line-smooth")) + else if (!strcmp (mode_name, "line-smooth")) { - return video::EAAM_LINE_SMOOTH; + mode = video::EAAM_LINE_SMOOTH; } - else if (!strcmp (mode, "point-smooth")) + else if (!strcmp (mode_name, "point-smooth")) { - return video::EAAM_POINT_SMOOTH; + mode = video::EAAM_POINT_SMOOTH; } - else if (!strcmp (mode, "full-basic")) + else if (!strcmp (mode_name, "full-basic")) { - return video::EAAM_FULL_BASIC; + mode = video::EAAM_FULL_BASIC; } - else if (!strcmp (mode, "alpha-to-coverage")) + else if (!strcmp (mode_name, "alpha-to-coverage")) { - return video::EAAM_ALPHA_TO_COVERAGE; + mode = video::EAAM_ALPHA_TO_COVERAGE; } else { scm_error (scm_arg_type_key, NULL, "Wrong anti aliasing mode: ~S", scm_list_1 (anti_aliasing_mode), scm_list_1 (anti_aliasing_mode)); } -} + free (mode_name); + return mode; +} video::E_BLEND_OPERATION scm_to_blend_operation (SCM blend_operation) { - char* operation = scm_to_utf8_stringn (scm_symbol_to_string (blend_operation), NULL); - if (!strcmp (operation, "none")) + char* operation_name = scm_to_utf8_string (scm_symbol_to_string (blend_operation)); + video::E_BLEND_OPERATION operation; + + if (!strcmp (operation_name, "none")) { - return video::EBO_NONE; + operation = video::EBO_NONE; } - else if (!strcmp (operation, "add")) + else if (!strcmp (operation_name, "add")) { - return video::EBO_ADD; + operation = video::EBO_ADD; } - else if (!strcmp (operation, "subtract")) + else if (!strcmp (operation_name, "subtract")) { - return video::EBO_SUBTRACT; + operation = video::EBO_SUBTRACT; } - else if (!strcmp (operation, "rev-subtract")) + else if (!strcmp (operation_name, "rev-subtract")) { - return video::EBO_REVSUBTRACT; + operation = video::EBO_REVSUBTRACT; } - else if (!strcmp (operation, "min")) + else if (!strcmp (operation_name, "min")) { - return video::EBO_MIN; + operation = video::EBO_MIN; } - else if (!strcmp (operation, "max")) + else if (!strcmp (operation_name, "max")) { - return video::EBO_MAX; + operation = video::EBO_MAX; } - else if (!strcmp (operation, "min-factor")) + else if (!strcmp (operation_name, "min-factor")) { - return video::EBO_MIN_FACTOR; + operation = video::EBO_MIN_FACTOR; } - else if (!strcmp (operation, "max-factor")) + else if (!strcmp (operation_name, "max-factor")) { - return video::EBO_MAX_FACTOR; + operation = video::EBO_MAX_FACTOR; } - else if (!strcmp (operation, "min-alpha")) + else if (!strcmp (operation_name, "min-alpha")) { - return video::EBO_MIN_ALPHA; + operation = video::EBO_MIN_ALPHA; } - else if (!strcmp (operation, "max-alpha")) + else if (!strcmp (operation_name, "max-alpha")) { - return video::EBO_MAX_ALPHA; + operation = video::EBO_MAX_ALPHA; } else { scm_error (scm_arg_type_key, NULL, "Wrong blend operation: ~S", scm_list_1 (blend_operation), scm_list_1 (blend_operation)); } -} + free (operation_name); + return operation; +} video::E_COLOR_MATERIAL scm_to_color_material (SCM color_material) { - char* material = scm_to_utf8_stringn (scm_symbol_to_string (color_material), NULL); - if (!strcmp (material, "none")) + char* material_name = scm_to_utf8_string (scm_symbol_to_string (color_material)); + video::E_COLOR_MATERIAL material; + + if (!strcmp (material_name, "none")) { - return video::ECM_NONE; + material = video::ECM_NONE; } - else if (!strcmp (material, "diffuse")) + else if (!strcmp (material_name, "diffuse")) { - return video::ECM_DIFFUSE; + material = video::ECM_DIFFUSE; } - else if (!strcmp (material, "ambient")) + else if (!strcmp (material_name, "ambient")) { - return video::ECM_AMBIENT; + material = video::ECM_AMBIENT; } - else if (!strcmp (material, "emissive")) + else if (!strcmp (material_name, "emissive")) { - return video::ECM_EMISSIVE; + material = video::ECM_EMISSIVE; } - else if (!strcmp (material, "specular")) + else if (!strcmp (material_name, "specular")) { - return video::ECM_SPECULAR; + material = video::ECM_SPECULAR; } - else if (!strcmp (material, "diffuse-and-ambient")) + else if (!strcmp (material_name, "diffuse-and-ambient")) { - return video::ECM_DIFFUSE_AND_AMBIENT; + material = video::ECM_DIFFUSE_AND_AMBIENT; } else { scm_error (scm_arg_type_key, NULL, "Wrong color material: ~S", scm_list_1 (color_material), scm_list_1 (color_material)); } -} + free (material_name); + return material; +} video::E_COLOR_PLANE scm_to_color_plane (SCM color_plane) { - char* plane = scm_to_utf8_stringn (scm_symbol_to_string (color_plane), NULL); - if (!strcmp (plane, "none")) + char* plane_name = scm_to_utf8_string (scm_symbol_to_string (color_plane)); + video::E_COLOR_PLANE plane; + + if (!strcmp (plane_name, "none")) { - return video::ECP_NONE; + plane = video::ECP_NONE; } - else if (!strcmp (plane, "alpha")) + else if (!strcmp (plane_name, "alpha")) { - return video::ECP_ALPHA; + plane = video::ECP_ALPHA; } - else if (!strcmp (plane, "red")) + else if (!strcmp (plane_name, "red")) { - return video::ECP_RED; + plane = video::ECP_RED; } - else if (!strcmp (plane, "green")) + else if (!strcmp (plane_name, "green")) { - return video::ECP_GREEN; + plane = video::ECP_GREEN; } - else if (!strcmp (plane, "blue")) + else if (!strcmp (plane_name, "blue")) { - return video::ECP_BLUE; + plane = video::ECP_BLUE; } - else if (!strcmp (plane, "rgb")) + else if (!strcmp (plane_name, "rgb")) { - return video::ECP_RGB; + plane = video::ECP_RGB; } - else if (!strcmp (plane, "all")) + else if (!strcmp (plane_name, "all")) { - return video::ECP_ALL; + plane = video::ECP_ALL; } else { scm_error (scm_arg_type_key, NULL, "Wrong color plane: ~S", scm_list_1 (color_plane), scm_list_1 (color_plane)); } -} + free (plane_name); + return plane; +} video::E_COMPARISON_FUNC scm_to_comparison_func (SCM comparison_func) { - char* func = scm_to_utf8_stringn (scm_symbol_to_string (comparison_func), NULL); - if (!strcmp (func, "never")) + char* func_name = scm_to_utf8_string (scm_symbol_to_string (comparison_func)); + video::E_COMPARISON_FUNC func; + + if (!strcmp (func_name, "never")) { - return video::ECFN_NEVER; + func = video::ECFN_NEVER; } - else if (!strcmp (func, "less-equal")) + else if (!strcmp (func_name, "less-equal")) { - return video::ECFN_LESSEQUAL; + func = video::ECFN_LESSEQUAL; } - else if (!strcmp (func, "equal")) + else if (!strcmp (func_name, "equal")) { - return video::ECFN_EQUAL; + func = video::ECFN_EQUAL; } - else if (!strcmp (func, "less")) + else if (!strcmp (func_name, "less")) { - return video::ECFN_LESS; + func = video::ECFN_LESS; } - else if (!strcmp (func, "not-equal")) + else if (!strcmp (func_name, "not-equal")) { - return video::ECFN_NOTEQUAL; + func = video::ECFN_NOTEQUAL; } - else if (!strcmp (func, "greater-equal")) + else if (!strcmp (func_name, "greater-equal")) { - return video::ECFN_GREATEREQUAL; + func = video::ECFN_GREATEREQUAL; } - else if (!strcmp (func, "greater")) + else if (!strcmp (func_name, "greater")) { - return video::ECFN_GREATER; + func = video::ECFN_GREATER; } - else if (!strcmp (func, "always")) + else if (!strcmp (func_name, "always")) { - return video::ECFN_ALWAYS; + func = video::ECFN_ALWAYS; } else { scm_error (scm_arg_type_key, NULL, "Wrong comparison func: ~S", scm_list_1 (comparison_func), scm_list_1 (comparison_func)); } -} + free (func_name); + return func; +} video::E_POLYGON_OFFSET scm_to_polygon_offset (SCM polygon_offset) { - char* offset = scm_to_utf8_stringn (scm_symbol_to_string (polygon_offset), NULL); - if (!strcmp (offset, "back")) + char* offset_name = scm_to_utf8_string (scm_symbol_to_string (polygon_offset)); + video::E_POLYGON_OFFSET offset; + + if (!strcmp (offset_name, "back")) { - return video::EPO_BACK; + offset = video::EPO_BACK; } - else if (!strcmp (offset, "front")) + else if (!strcmp (offset_name, "front")) { - return video::EPO_FRONT; + offset = video::EPO_FRONT; } else { scm_error (scm_arg_type_key, NULL, "Wrong polygon offset: ~S", scm_list_1 (polygon_offset), scm_list_1 (polygon_offset)); } + + free (offset_name); + return offset; }