From 6eb958f3588375dc0465c046d81e15e476f074a1 Mon Sep 17 00:00:00 2001 From: SleepKiller Date: Sun, 17 Nov 2019 04:07:47 +1300 Subject: [PATCH] add docs! wip --- .../io_scene_swbf_msh/msh_material_gather.py | 3 + .../msh_material_properties.py | 103 ++++++------ .../msh_material_ui_strings.py | 106 ++++++++++++ docs/images/materials.png | Bin 0 -> 51843 bytes docs/reference_manual.md | 156 ++++++++++++++++++ 5 files changed, 313 insertions(+), 55 deletions(-) create mode 100644 addons/io_scene_swbf_msh/msh_material_ui_strings.py create mode 100644 docs/images/materials.png create mode 100644 docs/reference_manual.md diff --git a/addons/io_scene_swbf_msh/msh_material_gather.py b/addons/io_scene_swbf_msh/msh_material_gather.py index c3fdace..4fa3f3d 100644 --- a/addons/io_scene_swbf_msh/msh_material_gather.py +++ b/addons/io_scene_swbf_msh/msh_material_gather.py @@ -54,6 +54,9 @@ def _read_material_props_rendertype(props) -> Rendertype: return _RENDERTYPES_MAPPING[props.rendertype] def _read_material_props_flags(props) -> MaterialFlags: + if "REFRACTION" in props.rendertype: + return MaterialFlags.BLENDED_TRANSPARENCY + flags = MaterialFlags.NONE if props.blended_transparency: diff --git a/addons/io_scene_swbf_msh/msh_material_properties.py b/addons/io_scene_swbf_msh/msh_material_properties.py index 81c8a3e..bc01d19 100644 --- a/addons/io_scene_swbf_msh/msh_material_properties.py +++ b/addons/io_scene_swbf_msh/msh_material_properties.py @@ -3,23 +3,19 @@ import bpy from bpy.props import StringProperty, BoolProperty, EnumProperty, FloatVectorProperty, IntProperty from bpy.types import PropertyGroup +from .msh_material_ui_strings import * UI_MATERIAL_RENDERTYPES = ( - ('NORMAL_BF2', "00 Normal (SWBF2)", "Normal Material. Unlike you there is nothing inherently awesome " - "about this material. By default it has per-vertex diffuse " - "lighting and can also have a detail map."), - ('SCROLLING_BF2', "03 Scrolling (SWBF2)", "Scrolling Material"), - ('ENVMAPPED_BF2', "06 Envmapped (SWBF2)", "Envmapped Material"), - ('ANIMATED_BF2', "07 Animated (SWBF2)", "Animated Material"), - ('REFRACTION_BF2', "22 Refractive (SWBF2)", "Refractive Material"), - ('BLINK_BF2', "25 Blink (SWBF2)", "Blinking Material\n\n" - "Note: If you see any statues while using this material you " - "are advised **not** to blink (or take your eyes off the statue under any circumstances) " - "and immediately make your way to a crowded public space."), - ('NORMALMAPPED_TILED_BF2', "24 Normalmapped Tiled (SWBF2)", "Normalmapped Tiled Material"), - ('NORMALMAPPED_ENVMAPPED_BF2', "26 Normalmapped Envmapped (SWBF2)", "Normalmapped Envmapped Material"), - ('NORMALMAPPED_BF2', "27 Normalmapped (SWBF2)", "Normalmapped Material"), - ('NORMALMAPPED_TILED_ENVMAPPED_BF2', "26 Normalmapped Tiled Envmapped (SWBF2)", "Normalmapped Tiled Envmapped Material")) + ('NORMAL_BF2', "00 Normal (SWBF2)", UI_RENDERTYPE_NORMAL_BF2_DESC), + ('SCROLLING_BF2', "03 Scrolling (SWBF2)", UI_RENDERTYPE_SCROLLING_BF2_DESC), + ('ENVMAPPED_BF2', "06 Envmapped (SWBF2)", UI_RENDERTYPE_ENVMAPPED_BF2_DESC), + ('ANIMATED_BF2', "07 Animated (SWBF2)", UI_RENDERTYPE_ANIMATED_BF2_DESC), + ('REFRACTION_BF2', "22 Refractive (SWBF2)", UI_RENDERTYPE_REFRACTION_BF2_DESC), + ('BLINK_BF2', "25 Blink (SWBF2)", UI_RENDERTYPE_BLINK_BF2_DESC), + ('NORMALMAPPED_TILED_BF2', "24 Normalmapped Tiled (SWBF2)", UI_RENDERTYPE_NORMALMAPPED_TILED_BF2_DESC), + ('NORMALMAPPED_ENVMAPPED_BF2', "26 Normalmapped Envmapped (SWBF2)", UI_RENDERTYPE_NORMALMAPPED_ENVMAPPED_BF2_DESC), + ('NORMALMAPPED_BF2', "27 Normalmapped (SWBF2)", UI_RENDERTYPE_NORMALMAPPED_BF2_DESC), + ('NORMALMAPPED_TILED_ENVMAPPED_BF2', "29 Normalmapped Tiled Envmapped (SWBF2)", UI_RENDERTYPE_NORMALMAPPED_TILED_ENVMAPPED_BF2_DESC)) def _make_anim_length_entry(length): from math import sqrt @@ -86,23 +82,20 @@ class MaterialProperties(PropertyGroup): default=False) perpixel: BoolProperty(name="Per-Pixel Lighting", - description="Use per-pixel lighting instead of per-vertex for diffuse lighting. " - "Be warned due to the way SWBFII handles per-pixel lighting this " - "adds an extra draw call for each segment using the material.", + description="Use per-pixel lighting instead of per-vertex for diffuse lighting.", default=False) specular: BoolProperty(name="Specular Lighting", description="Use specular lighting as well as diffuse lighting. A gloss map " - "In the diffuse map's and normal map's alpha channel can be used " + "in the diffuse map's and normal map's alpha channel can be used " "to attenuate the specular lighting's strength. (More transparent = less strong).\n\n" - - "Be warned due to the way SWBFII handles specular lighting this " - "adds an extra draw call for each segment using the material.", + "The Specular Colour controls the colour of the reflected specular highlights, " + "like the diffuse map but for specular lighting and global across the material.", default=False) doublesided: BoolProperty(name="Doublesided", - description="Disable backface culling, " - "causing both sides of the material to be rasterized.", + description="Disable backface culling, causing both sides of the surface to be drawn. " + "Usually only the front facing surface is drawn.", default=False) detail_map_tiling_u: IntProperty(name="Detail Map Tiling U", @@ -205,41 +198,41 @@ class MaterialPropertiesPanel(bpy.types.Panel): layout.prop(material_props, "rendertype") layout.prop(material_props, "specular_color") - layout.label(text="Transparency Flags: ") - row = layout.row() - row.prop(material_props, "blended_transparency") - row.prop(material_props, "additive_transparency") - row.prop(material_props, "hardedged_transparency") - - layout.label(text="Material Flags: ") - row = layout.row() - row.prop(material_props, "unlit") - row.prop(material_props, "glow") - row = layout.row() - row.prop(material_props, "perpixel") - row.prop(material_props, "specular") - layout.prop(material_props, "doublesided") - if "REFRACTION" not in material_props.rendertype: + layout.label(text="Transparency Flags: ") + row = layout.row() + row.prop(material_props, "blended_transparency") + row.prop(material_props, "additive_transparency") + row.prop(material_props, "hardedged_transparency") + + layout.label(text="Material Flags: ") + row = layout.row() + row.prop(material_props, "unlit") + row.prop(material_props, "glow") + row = layout.row() + row.prop(material_props, "perpixel") + row.prop(material_props, "specular") + layout.prop(material_props, "doublesided") + layout.label(text="Material Data: ") row = layout.row() - if "SCROLLING" in material_props.rendertype: - row.prop(material_props, "scroll_speed_u") - row.prop(material_props, "scroll_speed_v") - elif "ANIMATED" in material_props.rendertype: - row.prop(material_props, "animation_length") - row = layout.row() - row.prop(material_props, "animation_speed") - elif "BLINK" in material_props.rendertype: - row.prop(material_props, "blink_min_brightness") - row.prop(material_props, "blink_speed") - elif "NORMALMAPPED_TILED" in material_props.rendertype: - row.prop(material_props, "normal_map_tiling_u") - row.prop(material_props, "normal_map_tiling_v") - elif "REFRACTION" not in material_props.rendertype: - row.prop(material_props, "detail_map_tiling_u") - row.prop(material_props, "detail_map_tiling_v") + if "SCROLLING" in material_props.rendertype: + row.prop(material_props, "scroll_speed_u") + row.prop(material_props, "scroll_speed_v") + elif "ANIMATED" in material_props.rendertype: + row.prop(material_props, "animation_length") + row = layout.row() + row.prop(material_props, "animation_speed") + elif "BLINK" in material_props.rendertype: + row.prop(material_props, "blink_min_brightness") + row.prop(material_props, "blink_speed") + elif "NORMALMAPPED_TILED" in material_props.rendertype: + row.prop(material_props, "normal_map_tiling_u") + row.prop(material_props, "normal_map_tiling_v") + else: + row.prop(material_props, "detail_map_tiling_u") + row.prop(material_props, "detail_map_tiling_v") layout.label(text="Texture Maps: ") layout.prop(material_props, "diffuse_map") diff --git a/addons/io_scene_swbf_msh/msh_material_ui_strings.py b/addons/io_scene_swbf_msh/msh_material_ui_strings.py new file mode 100644 index 0000000..2dd115d --- /dev/null +++ b/addons/io_scene_swbf_msh/msh_material_ui_strings.py @@ -0,0 +1,106 @@ +""" UI strings that are too long to have in msh_materials_properties.py """ + +UI_RENDERTYPE_DETAIL_MAP_DESC = \ + "Can optionally have a Detail Map." + +UI_RENDERTYPE_DETAIL_MAP_TILING_DESC = \ + "Tiling for the detail map can specified " \ + "with Detail Map Tiling U and Detail Map Tiling V." + +UI_RENDERTYPE_ENV_MAP_DESC = \ + "Uses an Environment Map to show reflections on the model. " \ + "Useful for anything you want to look reflective or metallic." \ + "\n\n" \ + "The reflections from the Environment Map are affected by " \ + "Specular Colour. And if Specular Material Flag is checked then " \ + "reflections will be affected by the Gloss Map." + +UI_RENDERTYPE_NORMAL_MAP_DESC = \ + "Enables the use of a Normal Map with the material." + +UI_RENDERTYPE_NORMAL_MAP_TILING_DESC = \ + "Tiling for the normal map can be controlled with Normal Map " \ + "Tiling U and Normal Map Tiling V." + +UI_RENDERTYPE_NORMAL_PER_PIXEL_DESC = \ + "This rendertype also enables per-pixel lighting." + +UI_RENDERTYPE_NORMAL_BF2_DESC = f"""\ +Basic material. + +{UI_RENDERTYPE_DETAIL_MAP_DESC} {UI_RENDERTYPE_DETAIL_MAP_TILING_DESC} +""" + +UI_RENDERTYPE_SCROLLING_BF2_DESC = f"""\ +Like Normal except the textures have scrolling. Useful for water, monitors with scrolling content, interlaced holograms, etc. + +Scroll speed and direction is specified with Scroll Speed U and Scroll Speed V. + +{UI_RENDERTYPE_DETAIL_MAP_DESC} The Detail Map will not be affected by scrolling. +""" + +UI_RENDERTYPE_ENVMAPPED_BF2_DESC = f"""\ +{UI_RENDERTYPE_ENV_MAP_DESC} + +{UI_RENDERTYPE_DETAIL_MAP_DESC} {UI_RENDERTYPE_DETAIL_MAP_TILING_DESC} +""" + +UI_RENDERTYPE_ANIMATED_BF2_DESC = f"""\ +Use an animated texture. The animation's frames should be packed into NxN squares where N is the square root of the number of frames in the animation. So a 25 frame animation should be packed into 5x5 squares in the Diffuse Map. + +Set frame count with Animation Length and frame rate with Animation Speed. + +{UI_RENDERTYPE_DETAIL_MAP_DESC} The Detail Map will not be subject to animation. +""" + +UI_RENDERTYPE_REFRACTION_BF2_DESC = f"""\ +Distorts/refracts the scene behind the material. + +The Diffuse Map's alpha channel controls the visibility of the scene while the Distortion Map controls the distortion. + +When distortion is not needed but transparency is the Normal rendertype should be used as this one comes at a performance cost. +""" + +UI_RENDERTYPE_BLINK_BF2_DESC = f"""\ +Oscillates the diffuse strength of the material between full strength and a supplied strength. + +Blink Minimum Brightness sets the strength of the material's diffuse at the bottom of the "blink". Blink Speed sets the speed of the blinking. + +{UI_RENDERTYPE_DETAIL_MAP_DESC} +""" + +UI_RENDERTYPE_NORMALMAPPED_BF2_DESC = f"""\ +{UI_RENDERTYPE_NORMAL_MAP_DESC} + +{UI_RENDERTYPE_DETAIL_MAP_DESC} {UI_RENDERTYPE_DETAIL_MAP_TILING_DESC} + +{UI_RENDERTYPE_NORMAL_PER_PIXEL_DESC} +""" + +UI_RENDERTYPE_NORMALMAPPED_TILED_BF2_DESC = f"""\ +{UI_RENDERTYPE_NORMAL_MAP_DESC} {UI_RENDERTYPE_NORMAL_MAP_TILING_DESC} + +{UI_RENDERTYPE_DETAIL_MAP_DESC} + +{UI_RENDERTYPE_NORMAL_PER_PIXEL_DESC} +""" + +UI_RENDERTYPE_NORMALMAPPED_ENVMAPPED_BF2_DESC = f"""\ +{UI_RENDERTYPE_NORMAL_MAP_DESC} + +{UI_RENDERTYPE_ENV_MAP_DESC} + +{UI_RENDERTYPE_DETAIL_MAP_DESC} {UI_RENDERTYPE_DETAIL_MAP_TILING_DESC} + +{UI_RENDERTYPE_NORMAL_PER_PIXEL_DESC} +""" + +UI_RENDERTYPE_NORMALMAPPED_TILED_ENVMAPPED_BF2_DESC = f"""\ +{UI_RENDERTYPE_NORMAL_MAP_DESC} {UI_RENDERTYPE_NORMAL_MAP_TILING_DESC} + +{UI_RENDERTYPE_ENV_MAP_DESC} + +{UI_RENDERTYPE_DETAIL_MAP_DESC} + +{UI_RENDERTYPE_NORMAL_PER_PIXEL_DESC} +""" \ No newline at end of file diff --git a/docs/images/materials.png b/docs/images/materials.png new file mode 100644 index 0000000000000000000000000000000000000000..dbb00c1020993c46a2af40b874a7fa4b847709c6 GIT binary patch literal 51843 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�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 z TODO: Finish writing this section. + +## Materials +Since Blender's sophisticated materials are a poor fit for what .msh files can represent the addon defines +custom properties for representing .msh materials. It then exposes these through a UI panel under Blender's +Material context. + +![.msh Material Panel](images/materials.png) + +> TODO: Explain why some .msh rendertypes were left out of the addon. (The short answer is they're either redundant or outright unused.) +> TODO: Document what rendertypes/flags are multipass and cause the model to be drawn more than once. And explain the implications of that. + +### Materials.Rendertype +Rendertypes in .msh materials confer unique information about how the material. Such as +if the materials textures scroll or if the material has an environment map. + +> One could argue that "rendertype" should be stylized as "render type". I thought about that and decided I'd rather spend time writing the addon than thinking about that. + +#### Materials.Rendertype.Normal (SWBF2) +Basic material. + +Can optionally have a Detail Map. Tiling for the detail map can specified with Detail Map Tiling U and Detail Map Tiling V. + +#### Materials.Rendertype.Scrolling (SWBF2) +Like Normal except the textures have scrolling. Useful for water, monitors with scrolling content, interlaced holograms, etc. + +Scroll speed and direction is specified with Scroll Speed U and Scroll Speed V. + +Can optionally have a Detail Map. The Detail Map will not be affected by scrolling. + +#### Materials.Rendertype.Envmapped (SWBF2) +Uses an Environment Map to show reflections on the model. Useful for anything you want to look reflective or +metallic. + +The reflections from the Environment Map are affected by Specular Colour. And if Specular Material Flag is checked then reflections will be affected by the Gloss Map. + +Can optionally have a Detail Map. Tiling for the detail map can specified with Detail Map Tiling U and Detail Map Tiling V. + +#### Materials.Rendertype.Animated (SWBF2) +Use an animated texture. The animation's frames should be packed into NxN squares where N is the square root of the number of frames in the animation. So a 25 frame animation should be packed into 5x5 squares in the Diffuse Map. + +Set frame count with Animation Length and frame rate with Animation Speed. + +Can optionally have a Detail Map. The Detail Map will not be subject to animation. + +#### Materials.Rendertype.Refraction (SWBF2) +Distorts/refracts the scene behind the material. + +The Diffuse Map's alpha channel controls the visibility of the scene while the Distortion Map controls the distortion. + +When distortion is not needed but transparency is the Normal rendertype should be used as this one comes at a performance cost. + +The Material Flags are not exposed by the addon for this rendertype as most are unsupported by it. The Blended Transparency flag is supported and **required** but is set automatically by the addon. + +#### Materials.Rendertype.Blink (SWBF2) +Oscillates the diffuse strength of the material between full strength and a supplied strength. + +Blink Minimum Brightness sets the strength of the material's diffuse at the bottom of the "blink". Blink Speed sets the speed of the blinking. + +Can optionally have a Detail Map. + +#### Materials.Rendertype.Normalmapped (SWBF2) +Enables the use of a Normal Map with the material. + +Can optionally have a Detail Map. Tiling for the detail map can specified with Detail Map Tiling U and Detail Map Tiling V. + +This rendertype also enables per-pixel lighting. + +#### Materials.Rendertype.Normalmapped Tiled (SWBF2) +Enables the use of a Normal Map with the material. Tiling for the normal map can be controlled with Normal Map Tiling U and Normal Map Tiling V. + +Can optionally have a Detail Map. + +This rendertype also enables per-pixel lighting. + +#### Materials.Rendertype.Normalmapped Envmapped (SWBF2) +Enables the use of a Normal Map with the material. + +Uses an Environment Map to show reflections on the model. Useful for anything you want to look reflective or +metallic. + +The reflections from the Environment Map are affected by Specular Colour. And if Specular Material Flag is checked then reflections will be affected by the Gloss Map. + +Can optionally have a Detail Map. Tiling for the detail map can specified with Detail Map Tiling U and Detail Map Tiling V. + +This rendertype also enables per-pixel lighting. + +#### Materials.Rendertype.Normalmapped Envmapped (SWBF2) +Enables the use of a Normal Map with the material. Tiling for the normal map can be controlled with Normal Map Tiling U and Normal Map Tiling V + +Uses an Environment Map to show reflections on the model. Useful for anything you want to look reflective or +metallic. + +The reflections from the Environment Map are affected by Specular Colour. And if Specular Material Flag is checked then reflections will be affected by the Gloss Map. + +Can optionally have a Detail Map. + +This rendertype also enables per-pixel lighting. + +### Materials.Transparency Flags + +> TODO: Improve this section. + +#### Materials.Transparency Flags.Blended +Regular alpha blended transparency. + +#### Materials.Transparency Flags.Additive +Additive transparency, objects behind the material will appear brighter because the material will be "added" on top of the scene. + +> TODO: Explain the difference between Blended + Additive vs just Additive + +#### Materials.Transparency Flags.Hardedged +Hardedged/alpha cutout/clip transparency. Any point on the material with an alpha value below the threshold of 0.5/0x80/128 will be discarded. Useful for leaves, flowers, wire fences and all sorts. + +### Materials.Flags + +#### Materials.Flags.Unlit +Makes the material unlit/emissive. Useful for anything that is meant to be giving light but not reflecting any/much. + +#### Materials.Flags.Glow +Same as 'Unlit' but also enables the use of a Glow Map in the diffuse texture's alpha channel. The material will be significantly significantly brightened based on how opaque the glowmap is. + +#### Materials.Flags.Per-Pixel Lighting +Calculate lighting per-pixel instead of per-vertex for diffuse lighting. + +#### Materials.Flags.Specular Lighting +Use specular lighting as well as diffuse lighting. A Gloss Map in the diffuse map's and normal map's alpha channel can be used to attenuate the specular lighting's strength. (More transparent = less strong). + +The Specular Colour controls the colour of the reflected specular highlights, like the diffuse map but for specular lighting and global across the material. + +#### Materials.Flags.Doublesided +Disable backface culling, causing both sides of the surface to be drawn. Usually only the front facing surface is drawn. + +### Materials.Data +> TODO: Write this section + +### Materials.Texture Maps +> TODO: Write this section + +### Materials.Rendertypes Table +| Rendertype | `ATRB` Data0 | `ATRB` Data1 | `ATRB` Number | `ATRB` Number Hex | +| ------------------------------------ |:------------------------:|:-------------------:|:-------------:| -----------------:| +| Normal (SWBF2) | Detail Map Tiling U | Detail Map Tiling V | 00 | 00 | +| Scrolling (SWBF2) | Scroll Speed U | Scroll Speed V | 03 | 03 | +| Envmapped (SWBF2) | Detail Map Tiling U | Detail Map Tiling V | 06 | 06 | +| Animated (SWBF2) | Animation Length | Animation Speed | 07 | 07 | +| Refractive (SWBF2) | Detail Map Tiling U | Detail Map Tiling V | 22 | 16 | +| Normalmapped Tiled (SWBF2) | Normal Map Tiling U | Normal Map Tiling V | 24 | 18 | +| Blink (SWBF2) | Blink Minimum Brightness | Blink Speed | 25 | 19 | +| Normalmapped Envmapped (SWBF2) | Detail Map Tiling U | Detail Map Tiling V | 26 | 1A | +| Normalmapped (SWBF2) | Detail Map Tiling U | Detail Map Tiling V | 27 | 1B | +| Normalmapped Tiled Envmapped (SWBF2) | Normal Map Tiling U | Normal Map Tiling V | 29 | 1D |