From c71c422ccdf08ffe6287a2a2bb6d6345deccff2c Mon Sep 17 00:00:00 2001 From: Gumsk Date: Fri, 22 Aug 2025 10:52:21 +0900 Subject: [PATCH 1/2] Gumsk 5.75 Updates Updated mask channels Updated xyzt to XYZW Updated BC settings Updated material nodes Added needed types for new materials --- BlenderExtensions/EntityPanels.py | 35 ++++++---- BlenderExtensions/NMSShaderNode.py | 26 ++++---- ModelExporter/addon_script.py | 66 +++++++++++-------- ModelExporter/export.py | 16 ++--- ModelImporter/animation_handler.py | 6 +- NMS/LOOKUPS.py | 40 +++++------ NMS/classes/Quaternion.py | 16 ++--- NMS/classes/TkAnimationData.py | 6 +- NMS/classes/TkMaterialData.py | 41 ++++++++---- NMS/classes/TkMaterialSampler.py | 2 +- ...lUniform.py => TkMaterialUniform_Float.py} | 6 +- NMS/classes/TkMaterialUniform_UInt.py | 17 +++++ NMS/classes/Vector4f.py | 18 ++--- NMS/classes/Vector4i.py | 28 ++++++++ NMS/classes/__init__.py | 4 +- NMS/material_node.py | 60 ++++------------- 16 files changed, 212 insertions(+), 175 deletions(-) rename NMS/classes/{TkMaterialUniform.py => TkMaterialUniform_Float.py} (77%) create mode 100644 NMS/classes/TkMaterialUniform_UInt.py create mode 100644 NMS/classes/Vector4i.py diff --git a/BlenderExtensions/EntityPanels.py b/BlenderExtensions/EntityPanels.py index 891dadb..bfe1d08 100644 --- a/BlenderExtensions/EntityPanels.py +++ b/BlenderExtensions/EntityPanels.py @@ -567,12 +567,18 @@ class NMS_GcInteractionType_Properties(bpy.types.PropertyGroup): class NMS_Vector4f_Properties(bpy.types.PropertyGroup): """ Properties for Vector4f """ - x: FloatProperty(name="x") - y: FloatProperty(name="y") - z: FloatProperty(name="z") - t: FloatProperty(name="t") - - + x: FloatProperty(name="X") + y: FloatProperty(name="Y") + z: FloatProperty(name="Z") + t: FloatProperty(name="W") + +class NMS_Vector4i_Properties(bpy.types.PropertyGroup): + """ Properties for Vector4i """ + x: IntProperty(name="X") + y: IntProperty(name="Y") + z: IntProperty(name="Z") + t: IntProperty(name="W") + class NMS_TkCameraWanderData_Properties(bpy.types.PropertyGroup): """ Properties for TkCameraWanderData """ CamWander: BoolProperty(name="CamWander") @@ -1048,10 +1054,10 @@ def GcInteractionComponentData(self, layout, obj): b2 = b1.box("Camera") b2.row("Distance") b3 = b2.box("Offset") - b3.row("x") - b3.row("y") - b3.row("z") - b3.row("t") + b3.row("X") + b3.row("Y") + b3.row("Z") + b3.row("W") b2.row("Pitch") b2.row("Rotate") b2.row("LightPitch") @@ -1120,10 +1126,10 @@ def TkModelRendererData(self, layout, obj, index=0): b1 = r.box("Camera") b1.row("Distance") b2 = b1.box("Offset") - b2.row("x") - b2.row("y") - b2.row("z") - b2.row("t") + b2.row("X") + b2.row("Y") + b2.row("Z") + b2.row("W") b1.row("Pitch") b1.row("Rotate") b1.row("LightPitch") @@ -1366,6 +1372,7 @@ def get_index(self, obj): NMS_GcSpaceshipComponentData_Properties, NMS_TkCameraWanderData_Properties, NMS_Vector4f_Properties, + NMS_Vector4i_Properties, NMS_TkModelRendererCameraData_Properties, NMS_GcAlienPuzzleMissionOverride_Properties, NMS_TkModelRendererData_Properties, diff --git a/BlenderExtensions/NMSShaderNode.py b/BlenderExtensions/NMSShaderNode.py index d0276c4..f6b59a7 100644 --- a/BlenderExtensions/NMSShaderNode.py +++ b/BlenderExtensions/NMSShaderNode.py @@ -12,8 +12,8 @@ FLAGS = [('_F01_DIFFUSEMAP', 'Diffuse Map', 'Diffuse Map'), ('_F03_NORMALMAP', 'Normal Map', 'Normal Map'), - ('_F21_VERTEXCOLOUR', 'Vertex Colour', 'Vertex Colour'), - ('_F25_ROUGHNESS_MASK', 'Roughness Mask', 'Roughness Mask')] + ('_F21_VERTEXCUSTOM', 'Vertex Custom', 'Vertex Custom'), + ('_F25_MASKS_MAP', 'Masks Map', 'Masks Map')] class NMSShader(bpy.types.NodeCustomGroup): @@ -27,8 +27,8 @@ def operators(self, context): context.space_data.edit_tree list = [('_F01_DIFFUSEMAP', 'Diffuse Map', 'Diffuse Map'), ('_F03_NORMALMAP', 'Normal Map', 'Normal Map'), - ('_F21_VERTEXCOLOUR', 'Vertex Colour', 'Vertex Colour'), - ('_F25_ROUGHNESS_MASK', 'Roughness Mask', 'Roughness Mask')] + ('_F21_VERTEXCUSTOM', 'Vertex Custom', 'Vertex Custom'), + ('_F25_MASKS_MAP', 'Masks Map', 'Masks Map')] return list # Manage the internal nodes to perform the chained operation - clear all @@ -38,7 +38,7 @@ def __nodetree_setup__(self): if self.F01_DIFFUSEMAP_choice: diffuse_texture = self._add_diffuse_texture_choice() - if self.F21_VERTEXCOLOUR_choice: + if self.F21_VERTEXCUSTOM_choice: self._add_vertex_colour_nodes() else: self._remove_vertex_colour_nodes() @@ -111,14 +111,14 @@ def update_nodes(self, context): description='Whether material has a normal map.', default=False, update=update_nodes) - F21_VERTEXCOLOUR_choice: BoolProperty( - name='Has vertex colour data', - description='Whether the material has vertex colour data.', + F21_VERTEXCUSTOM_choice: BoolProperty( + name='Has vertex custom data', + description='Whether the material has vertex custom data.', default=False, update=update_nodes) - F25_ROUGHNESS_MASK_choice: BoolProperty( - name='Has roughness mask', - description='Whether material has a roughness mask.', + F25_MASKS_MAP_choice: BoolProperty( + name='Has masks map', + description='Whether material has a masks map.', default=False, update=update_nodes) @@ -150,9 +150,9 @@ def draw_buttons(self, context, layout): row = layout.row() row.prop(self, 'F03_NORMALMAP_choice', text='Normal Map') row = layout.row() - row.prop(self, 'F21_VERTEXCOLOUR_choice', text='Vertex Colour') + row.prop(self, 'F21_VERTEXCUSTOM_choice', text='Vertex Custom') row = layout.row() - row.prop(self, 'F25_ROUGHNESS_MASK_choice', text='Roughness Mask') + row.prop(self, 'F25_MASKS_MAP_choice', text='Masks Map') # Copy def copy(self, node): diff --git a/ModelExporter/addon_script.py b/ModelExporter/addon_script.py index a8f84bf..1d36bf4 100644 --- a/ModelExporter/addon_script.py +++ b/ModelExporter/addon_script.py @@ -17,11 +17,11 @@ from ModelExporter.animations import process_anims from ModelExporter.export import Export from ModelExporter.Descriptor import Descriptor -from NMS.classes import (TkMaterialData, TkMaterialFlags, - TkVolumeTriggerType, TkMaterialSampler, - TkMaterialUniform, TkRotationComponentData, TkPhysicsComponentData) +from NMS.classes import (TkMaterialData, TkMaterialFlags, TkVolumeTriggerType, + TkMaterialSampler, TkMaterialUniform_Float, TkMaterialUniform_UInt, + TkRotationComponentData, TkPhysicsComponentData) from NMS.classes import TkAnimationComponentData, TkAnimationData -from NMS.classes import List, Vector4f +from NMS.classes import List, Vector4f, Vector4i from NMS.classes import TkAttachmentData from NMS.classes.Object import Object, Model, Mesh, Locator, Reference, Collision, Light, Joint from NMS.LOOKUPS import MATERIALFLAGS @@ -165,7 +165,7 @@ def create_sampler(image, sampler_name: str, texture_dir: str, if op.exists(out_tex_path) and not force_overwrite: print(f'Found existing texture at {out_tex_path}. Using this.') - return TkMaterialSampler(Name=sampler_name, Map=relpath, IsSRGB=True) + return TkMaterialSampler(Name=sampler_name, Map=relpath, IsSRGB=False) # If the textures are packed into the blend file, unpack them. if len(image.packed_files) > 0: @@ -181,7 +181,7 @@ def create_sampler(image, sampler_name: str, texture_dir: str, tex_path = image.filepath_from_user() shutil.copy(tex_path, out_tex_path) if op.exists(out_tex_path): - return TkMaterialSampler(Name=sampler_name, Map=relpath, IsSRGB=True) + return TkMaterialSampler(Name=sampler_name, Map=relpath, IsSRGB=False) else: raise FileNotFoundError(f'Texture not written to {out_tex_path}') @@ -404,26 +404,36 @@ def parse_material(self, ob): "label for the diffuse texture, etc.") # Fetch Uniforms - matuniforms.append(TkMaterialUniform(Name="gMaterialColourVec4", - Values=Vector4f(x=1.0, - y=1.0, - z=1.0, - t=1.0))) - matuniforms.append(TkMaterialUniform(Name="gMaterialParamsVec4", - Values=Vector4f(x=1.0, - y=0.5, - z=1.0, - t=0.0))) - matuniforms.append(TkMaterialUniform(Name="gMaterialSFXVec4", - Values=Vector4f(x=0.0, - y=0.0, - z=0.0, - t=0.0))) - matuniforms.append(TkMaterialUniform(Name="gMaterialSFXColVec4", - Values=Vector4f(x=0.0, - y=0.0, - z=0.0, - t=0.0))) + matuniforms.append(TkMaterialUniform_Float(Name="gMaterialColourVec4", + Values=Vector4f(X=1.000000, + Y=1.000000, + Z=1.000000, + W=1.000000))) + matuniforms.append(TkMaterialUniform_Float(Name="gMaterialParamsVec4", + Values=Vector4f(X=1.000000, + Y=0.500000, + Z=1.000000, + W=0.000000))) + matuniforms.append(TkMaterialUniform_Float(Name="gMaterialParams2Vec4", + Values=Vector4f(X=1.000000, + Y=0.500000, + Z=1.000000, + W=0.000000))) + matuniforms.append(TkMaterialUniform_Float(Name="gMaterialSFXVec4", + Values=Vector4f(X=0.000000, + Y=0.000000, + Z=0.000000, + W=0.000000))) + matuniforms.append(TkMaterialUniform_Float(Name="gMaterialSFXColVec4", + Values=Vector4f(X=0.000000, + Y=0.000000, + Z=0.000000, + W=0.000000))) + matuniforms.append(TkMaterialUniform_UInt(Name="gDynamicFlags", + Values=Vector4i(X=3, + Y=0, + Z=0, + W=0))) if self.settings.get('use_shared_textures'): texture_dir = self.settings.get('shared_texture_folder') @@ -451,10 +461,8 @@ def parse_material(self, ob): # Sort out Mask if mask_image: - # Set _F25_ROUGHNESS_MASK + # Set _F25_MASKS_MAP add_matflags.add(24) - # Set _F39_METALLIC_MASK - add_matflags.add(38) # Add the sampler to the list matsamplers.append(create_sampler( mask_image, "gMasksMap", texture_dir, diff --git a/ModelExporter/export.py b/ModelExporter/export.py index d796347..5458b07 100644 --- a/ModelExporter/export.py +++ b/ModelExporter/export.py @@ -535,12 +535,12 @@ def process_nodes(self): data['BOUNDHULLED'] = self.hull_bounds[name][1] if mesh_obj._Type == 'MESH': # add the AABBMIN/MAX(XYZ) values: - data['AABBMINX'] = self.mesh_bounds[name]['x'][0] - data['AABBMINY'] = self.mesh_bounds[name]['y'][0] - data['AABBMINZ'] = self.mesh_bounds[name]['z'][0] - data['AABBMAXX'] = self.mesh_bounds[name]['x'][1] - data['AABBMAXY'] = self.mesh_bounds[name]['y'][1] - data['AABBMAXZ'] = self.mesh_bounds[name]['z'][1] + data['AABBMINX'] = self.mesh_bounds[name]['X'][0] + data['AABBMINY'] = self.mesh_bounds[name]['Y'][0] + data['AABBMINZ'] = self.mesh_bounds[name]['Z'][0] + data['AABBMAXX'] = self.mesh_bounds[name]['X'][1] + data['AABBMAXY'] = self.mesh_bounds[name]['Y'][1] + data['AABBMAXZ'] = self.mesh_bounds[name]['Z'][1] data['HASH'] = self.hashes.get(name, 0) # we only care about entity and material data for Mesh # Objects @@ -741,8 +741,8 @@ def get_bounds(self): self.GeometryData['MeshAABBMax'].append((x_bounds[1], y_bounds[1], z_bounds[1], 1)) if obj._Type == "MESH": # only add the meshes to the self.mesh_bounds dict: - self.mesh_bounds[obj.Name] = {'x': x_bounds, 'y': y_bounds, - 'z': z_bounds} + self.mesh_bounds[obj.Name] = {'X': x_bounds, 'Y': y_bounds, + 'Z': z_bounds} # TODO: Change this here too... def write(self): diff --git a/ModelImporter/animation_handler.py b/ModelImporter/animation_handler.py index da719a4..42e21d0 100644 --- a/ModelImporter/animation_handler.py +++ b/ModelImporter/animation_handler.py @@ -285,9 +285,9 @@ def _create_anim_channels(self, obj, anim_name: str): Tuple of collections.namedtuple's: (location, rotation, scale) """ - location = namedtuple('location', ['x', 'y', 'z']) - rotation = namedtuple('rotation', ['x', 'y', 'z', 'w']) - scale = namedtuple('scale', ['x', 'y', 'z']) + location = namedtuple('location', ['X', 'Y', 'Z']) + rotation = namedtuple('rotation', ['X', 'Y', 'Z', 'W']) + scale = namedtuple('scale', ['X', 'Y', 'Z']) loc_x = obj.animation_data.action.fcurves.new(data_path='location', index=0, action_group=anim_name) diff --git a/NMS/LOOKUPS.py b/NMS/LOOKUPS.py index e7b4940..eb6e402 100644 --- a/NMS/LOOKUPS.py +++ b/NMS/LOOKUPS.py @@ -3,31 +3,21 @@ import numpy as np -MATERIALFLAGS = ['_F01_DIFFUSEMAP', '_F02_SKINNED', '_F03_NORMALMAP', '_F04_', - '_F05_INVERT_ALPHA', '_F06_BRIGHT_EDGE', '_F07_UNLIT', - '_F08_REFLECTIVE', '_F09_TRANSPARENT', '_F10_NORECEIVESHADOW', - '_F11_ALPHACUTOUT', '_F12_BATCHED_BILLBOARD', - '_F13_UVANIMATION', '_F14_UVSCROLL', '_F15_WIND', - '_F16_DIFFUSE2MAP', '_F17_MULTIPLYDIFFUSE2MAP', - '_F18_UVTILES', '_F19_BILLBOARD', '_F20_PARALLAXMAP', - '_F21_VERTEXCOLOUR', '_F22_TRANSPARENT_SCALAR', - '_F23_TRANSLUCENT', '_F24_AOMAP', '_F25_ROUGHNESS_MASK', - '_F26_STRETCHY_PARTICLE', '_F27_VBTANGENT', '_F28_VBSKINNED', - '_F29_VBCOLOUR', '_F30_REFRACTION', '_F31_DISPLACEMENT', - '_F32_REFRACTION_MASK', '_F33_SHELLS', '_F34_GLOW', - '_F35_GLOW_MASK', '_F36_DOUBLESIDED', '_F37_', - '_F38_NO_DEFORM', '_F39_METALLIC_MASK', - '_F40_SUBSURFACE_MASK', '_F41_DETAIL_DIFFUSE', - '_F42_DETAIL_NORMAL', '_F43_NORMAL_TILING', '_F44_IMPOSTER', - '_F45_VERTEX_BLEND', '_F46_BILLBOARD_AT', - '_F47_REFLECTION_PROBE', '_F48_WARPED_DIFFUSE_LIGHTING', - '_F49_DISABLE_AMBIENT', '_F50_DISABLE_POSTPROCESS', - '_F51_DECAL_DIFFUSE', '_F52_DECAL_NORMAL', - '_F53_COLOURISABLE', '_F54_COLOURMASK', '_F55_MULTITEXTURE', - '_F56_MATCH_GROUND', '_F57_DETAIL_OVERLAY', - '_F58_USE_CENTRAL_NORMAL', '_F59_SCREENSPACE_FADE', - '_F60_ACUTE_ANGLE_FADE', '_F61_CLAMP_AMBIENT', - '_F62_DETAIL_ALPHACUTOUT', '_F63_DISSOLVE', '_F64_'] +MATERIALFLAGS = ['_F01_DIFFUSEMAP', '_F02_SKINNED', '_F03_NORMALMAP', '_F04_FEATURESMAP', + '_F05_DEPTH_EFFECT', '_F06_', '_F07_UNLIT', '_F08_', '_F09_REFLECTIVE', + '_F10_', '_F11_ALPHACUTOUT', '_F12_BATCHED_BILLBOARD', '_F13_UV_EFFECT', + '_F14_', '_F15_WIND', '_F16_DIFFUSE2MAP', '_F17_', '_F18_', + '_F19_BILLBOARD', '_F20_PARALLAX', '_F21_VERTEXCUSTOM', + '_F22_OCCLUSION_MAP', '_F23_', '_F24_', '_F25_MASKS_MAP', '_F26_', '_F27_', + '_F28_', '_F29_', '_F30_REFRACTION', '_F31_DISPLACEMENT', + '_F32_REFRACTION_MASK', '_F33_SHELLS', '_F34_', '_F35_', '_F36_DOUBLESIDED', + '_F37_EXPLICIT_MOTION_VECTORS', '_F38_', '_F39_', '_F40_', '_F41_', + '_F42_DETAIL_NORMAL', '_F43_', '_F44_IMPOSTER', '_F45_', '_F46_', + '_F47_REFLECTION_PROBE', '_F48_', '_F49_', '_F50_DISABLE_POSTPROCESS', + '_F51_', '_F52_', '_F53_COLOURISABLE', '_F54_', '_F55_MULTITEXTURE', + '_F56_MATCH_GROUND', '_F57_', '_F58_USE_CENTRAL_NORMAL', + '_F59_BIASED_REACTIVITY', '_F60_', '_F61_', '_F62_', '_F63_DISSOLVE', + '_F64_RESERVED_FLAG_FOR_EARLY_Z_PATCHING_DO_NOT_USE'] # Mesh vertex types VERTS = 0 diff --git a/NMS/classes/Quaternion.py b/NMS/classes/Quaternion.py index ba0f30f..3d50212 100644 --- a/NMS/classes/Quaternion.py +++ b/NMS/classes/Quaternion.py @@ -8,17 +8,17 @@ def __init__(self, **kwargs): super(Quaternion, self).__init__() """ Contents of the struct """ - self.data['x'] = kwargs.get('x', 0.0) - self.data['y'] = kwargs.get('y', 0.0) - self.data['z'] = kwargs.get('z', 0.0) - self.data['w'] = kwargs.get('w', 0.0) + self.data['X'] = kwargs.get('X', 0.0) + self.data['Y'] = kwargs.get('Y', 0.0) + self.data['Z'] = kwargs.get('Z', 0.0) + self.data['W'] = kwargs.get('W', 0.0) """ End of the struct contents""" def __str__(self): - return 'Quaternion({0}, {1}, {2}, {3})'.format(self.data['x'], - self.data['y'], - self.data['z'], - self.data['w']) + return 'Quaternion({0}, {1}, {2}, {3})'.format(self.data['X'], + self.data['Y'], + self.data['Z'], + self.data['W']) def __repr__(self): return str(self) diff --git a/NMS/classes/TkAnimationData.py b/NMS/classes/TkAnimationData.py index 311046c..abf39df 100644 --- a/NMS/classes/TkAnimationData.py +++ b/NMS/classes/TkAnimationData.py @@ -26,9 +26,9 @@ def __init__(self, **kwargs): self.data['ActionFrame'] = kwargs.get('ActionFrame', -1) self.data['ControlCreatureSize'] = kwargs.get('ControlCreatureSize', 'AllSizes') - self.data['Additive'] = kwargs.get('Additive', 'False') - self.data['Mirrored'] = kwargs.get('Mirrored', 'False') - self.data['Active'] = kwargs.get('Active', 'True') + self.data['Additive'] = kwargs.get('Additive', 'false') + self.data['Mirrored'] = kwargs.get('Mirrored', 'false') + self.data['Active'] = kwargs.get('Active', 'true') self.data['AdditiveBaseAnim'] = kwargs.get('AdditiveBaseAnim', '') self.data['AdditiveBaseFrame'] = kwargs.get('AdditiveBaseFrame', 0) self.data['GameData'] = kwargs.get('GameData', TkAnimationGameData()) diff --git a/NMS/classes/TkMaterialData.py b/NMS/classes/TkMaterialData.py index a00caf6..5b2ec91 100644 --- a/NMS/classes/TkMaterialData.py +++ b/NMS/classes/TkMaterialData.py @@ -3,8 +3,11 @@ from .Struct import Struct from .List import List from .TkMaterialFlags import TkMaterialFlags -from .TkMaterialUniform import TkMaterialUniform +from .TkMaterialUniform_Float import TkMaterialUniform_Float +from .TkMaterialUniform_UInt import TkMaterialUniform_UInt +from .TkMaterialSampler import TkMaterialSampler from .Vector4f import Vector4f +from .Vector4i import Vector4i from .String import String @@ -14,28 +17,42 @@ def __init__(self, **kwargs): """ Contents of the struct """ self.data['Name'] = String(kwargs.get('Name', ""), 0x80) + self.data['Metamaterial'] = String(kwargs.get('Metamaterial', ""), 0x80) self.data['Class'] = String(kwargs.get('Class', "Opaque"), 0x20) self.data['TransparencyLayerID'] = kwargs.get('TransparencyLayerID', 0) - self.data['CastShadow'] = kwargs.get('CastShadow', "False") - self.data['DisableZTest'] = kwargs.get('DisableZTest', "False") + self.data['CastShadow'] = kwargs.get('CastShadow', "false") + self.data['DisableZTest'] = kwargs.get('DisableZTest', "false") + self.data['CreateFur'] = kwargs.get('CreateFur', "false") + self.data['EnableLodFade'] = kwargs.get('EnableLodFade', "false") self.data['Link'] = String(kwargs.get('Link', ""), 0x80) self.data['Shader'] = String( kwargs.get('Shader', "SHADERS/UBERSHADER.SHADER.BIN"), 0x80) self.data['Flags'] = kwargs.get('Flags', List(TkMaterialFlags())) - self.data['Uniforms'] = kwargs.get( - 'Uniforms', + self.data['FxFlags'] = kwargs.get('FxFlags', None) + self.data['Uniforms_Float'] = kwargs.get( + 'Uniforms_Float', List( - TkMaterialUniform( + TkMaterialUniform_Float( Name="gMaterialColourVec4", - Values=Vector4f(x=1.0, y=1.0, z=1.0, t=1.0)), - TkMaterialUniform( + Values=Vector4f(X=1.000000, Y=1.000000, Z=1.000000, W=1.000000)), + TkMaterialUniform_Float( Name="gMaterialParamsVec4", - Values=Vector4f(x=0.9, y=0.5, z=0.0, t=0.0)), - TkMaterialUniform( + Values=Vector4f(X=0.900000, Y=0.500000, Z=0.000000, W=0.000000)), + TkMaterialUniform_Float( + Name="gMaterialParams2Vec4", + Values=Vector4f(X=0.900000, Y=0.500000, Z=0.000000, W=0.000000)), + TkMaterialUniform_Float( Name="gMaterialSFXVec4", Values=Vector4f()), - TkMaterialUniform( + TkMaterialUniform_Float( Name="gMaterialSFXColVec4", Values=Vector4f()))) - self.data['Samplers'] = kwargs.get('Samplers', None) + self.data['Uniforms_UInt'] = kwargs.get( + 'Uniforms_UInt', + List( + TkMaterialUniform_UInt( + Name="gDynamicFlags", + Values=Vector4i(X=3, Y=0, Z=0, W=0)))) + self.data['Samplers'] = kwargs.get('Samplers', TkMaterialSampler()) + self.data['ShaderMillDataHash'] = kwargs.get('Metamaterial', 0) """ End of the struct contents""" diff --git a/NMS/classes/TkMaterialSampler.py b/NMS/classes/TkMaterialSampler.py index 33c68bf..f6efda8 100644 --- a/NMS/classes/TkMaterialSampler.py +++ b/NMS/classes/TkMaterialSampler.py @@ -16,7 +16,7 @@ def __init__(self, **kwargs): self.data['UseCompression'] = kwargs.get('UseCompression', True) self.data['UseMipMaps'] = kwargs.get('UseMipMaps', True) # True image, False for MASKS and NORMAL - self.data['IsSRGB'] = kwargs.get('IsSRGB', True) + self.data['IsSRGB'] = kwargs.get('IsSRGB', False) self.data['MaterialAlternativeId'] = String(kwargs.get( 'MaterialAlternativeId', ""), 0x10) self.data['TextureAddressMode'] = kwargs.get( diff --git a/NMS/classes/TkMaterialUniform.py b/NMS/classes/TkMaterialUniform_Float.py similarity index 77% rename from NMS/classes/TkMaterialUniform.py rename to NMS/classes/TkMaterialUniform_Float.py index d9a486c..2742942 100644 --- a/NMS/classes/TkMaterialUniform.py +++ b/NMS/classes/TkMaterialUniform_Float.py @@ -1,4 +1,4 @@ -# TkMaterialUniform struct +# TkMaterialUniform_Float struct from .Struct import Struct from .String import String @@ -6,9 +6,9 @@ from .List import List -class TkMaterialUniform(Struct): +class TkMaterialUniform_Float(Struct): def __init__(self, **kwargs): - super(TkMaterialUniform, self).__init__() + super(TkMaterialUniform_Float, self).__init__() """ Contents of the struct """ self.data['Name'] = String(kwargs.get('Name', None), 0x20) diff --git a/NMS/classes/TkMaterialUniform_UInt.py b/NMS/classes/TkMaterialUniform_UInt.py new file mode 100644 index 0000000..4297892 --- /dev/null +++ b/NMS/classes/TkMaterialUniform_UInt.py @@ -0,0 +1,17 @@ +# TkMaterialUniform_UInt struct + +from .Struct import Struct +from .String import String +from .Vector4i import Vector4i +from .List import List + + +class TkMaterialUniform_UInt(Struct): + def __init__(self, **kwargs): + super(TkMaterialUniform_UInt, self).__init__() + + """ Contents of the struct """ + self.data['Name'] = String(kwargs.get('Name', None), 0x20) + self.data['Values'] = kwargs.get('Values', Vector4i()) + self.data['ExtendedValues'] = kwargs.get('ExtendedValues', List()) + """ End of the struct contents""" diff --git a/NMS/classes/Vector4f.py b/NMS/classes/Vector4f.py index 4a141ad..0c18131 100644 --- a/NMS/classes/Vector4f.py +++ b/NMS/classes/Vector4f.py @@ -9,20 +9,20 @@ def __init__(self, **kwargs): super(Vector4f, self).__init__() """ Contents of the struct """ - self.data['x'] = kwargs.get('x', 0.0) - self.data['y'] = kwargs.get('y', 0.0) - self.data['z'] = kwargs.get('z', 0.0) - self.data['t'] = kwargs.get('t', 0.0) + self.data['X'] = kwargs.get('X', 0.0) + self.data['Y'] = kwargs.get('Y', 0.0) + self.data['Z'] = kwargs.get('Z', 0.0) + self.data['W'] = kwargs.get('W', 0.0) """ End of the struct contents""" def __bytes__(self): - return pack('gMaterialParamsVec4.x; # noqa mult_param_x = nodes.new(type="ShaderNodeMath") mult_param_x.operation = 'MULTIPLY' @@ -154,23 +147,12 @@ def create_material_node(mat_path: str, local_root_directory: str): lfRoughness) # If the roughness wasn't ever defined then the default value is 1 # which is what blender has as the default anyway - - # gMaterialParamsVec4.x - # #ifdef _F40_SUBSURFACE_MASK - if 39 in flags: - links.new(principled_BSDF.inputs['Subsurface Weight'], - separate_rgb.outputs['R']) - if 43 in flags: - # lfMetallic = lMasks.b; - links.new(principled_BSDF.inputs['Metallic'], - separate_rgb.outputs['B']) - elif tex_type == NORMAL: # texture _path = realize_path(tex_path, local_root_directory) if _path is not None and op.exists(_path): img = bpy.data.images.load(_path) - img.colorspace_settings.name = 'sRGB' + img.colorspace_settings.name = 'linear' normal_texture = nodes.new(type='ShaderNodeTexImage') normal_texture.name = normal_texture.label = 'Texture Image - Normal' # noqa normal_texture.image = img @@ -199,25 +181,11 @@ def create_material_node(mat_path: str, local_root_directory: str): links.new(principled_BSDF.inputs['Normal'], normal_map.outputs['Normal']) - if 42 in flags: - # lTexCoordsVec4.xy *= lUniforms.mpCustomPerMesh->gCustomParams01Vec4.z; # noqa - normal_scale = nodes.new(type='ShaderNodeMapping') - normal_scale.location = (-1000, -300) - scale = uniforms['gCustomParams01Vec4'].Values[2] - normal_scale.inputs['Scale'].default_value = Vector((scale, scale, scale)) # noqa - tex_coord = nodes.new(type='ShaderNodeTexCoord') - tex_coord.location = (-1200, -300) - tex_coord.object = bpy.context.active_object - links.new(normal_scale.inputs['Vector'], - tex_coord.outputs['Generated']) - links.new(normal_texture.inputs['Vector'], - normal_scale.outputs['Vector']) - # Apply some final transforms to the data before connecting it to the # Material output node if 20 in flags or 28 in flags: - # #ifdef _F21_VERTEXCOLOUR + # #ifdef _F21_VERTEXCUSTOM # lColourVec4 *= IN( mColourVec4 ); col_attribute = nodes.new(type='ShaderNodeAttribute') col_attribute.attribute_name = 'Col' From 6c984b945097d9e883c7ba1b66d25804d30fdc2b Mon Sep 17 00:00:00 2001 From: Gumsk Date: Fri, 22 Aug 2025 12:06:17 +0900 Subject: [PATCH 2/2] Update __init__.py --- __init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/__init__.py b/__init__.py index cc39d90..0839c3c 100644 --- a/__init__.py +++ b/__init__.py @@ -1,7 +1,7 @@ bl_info = { "name": "No Man's Sky Development Kit", "author": "gregkwaste, monkeyman192", - "version": (0, 9, "28-pre7"), + "version": (0, 9, "28-pre8"), "blender": (4, 2, 0), "location": "File > Export/Import", "description": "Create NMS scene structures and export to NMS File format",