mirror of
https://github.com/MapMakersAndProgrammers/io_scene_a3d.git
synced 2025-10-26 01:49:13 -07:00
Clean up material import abit
This commit is contained in:
@@ -32,7 +32,7 @@ from .A3DObjects import (
|
|||||||
A3D_VERTEXTYPE_COLOR,
|
A3D_VERTEXTYPE_COLOR,
|
||||||
A3D_VERTEXTYPE_NORMAL2
|
A3D_VERTEXTYPE_NORMAL2
|
||||||
)
|
)
|
||||||
from .BlenderUtils import addImageTextureToMaterial
|
from .BlenderMaterialUtils import addImageTextureToMaterial
|
||||||
|
|
||||||
def mirrorUVY(uv):
|
def mirrorUVY(uv):
|
||||||
x, y = uv
|
x, y = uv
|
||||||
|
|||||||
@@ -23,13 +23,13 @@ SOFTWARE.
|
|||||||
from json import load
|
from json import load
|
||||||
|
|
||||||
import bpy
|
import bpy
|
||||||
from bpy_extras.node_shader_utils import PrincipledBSDFWrapper
|
|
||||||
from bpy_extras.image_utils import load_image
|
from bpy_extras.image_utils import load_image
|
||||||
|
from bpy_extras.node_shader_utils import PrincipledBSDFWrapper
|
||||||
import bmesh
|
import bmesh
|
||||||
|
|
||||||
from .A3D import A3D
|
from .A3D import A3D
|
||||||
from .A3DBlenderImporter import A3DBlenderImporter
|
from .A3DBlenderImporter import A3DBlenderImporter
|
||||||
from .BlenderUtils import addImageTextureToMaterial
|
from .BlenderMaterialUtils import addImageTextureToMaterial
|
||||||
|
|
||||||
class PropLibrary:
|
class PropLibrary:
|
||||||
propCache = {}
|
propCache = {}
|
||||||
@@ -139,16 +139,22 @@ class BattleMapBlenderImporter:
|
|||||||
|
|
||||||
return objects
|
return objects
|
||||||
|
|
||||||
def getBlenderProp(self, propData):
|
def getPropLibrary(self, libraryName):
|
||||||
# First check if we've already loaded the required prop library
|
# First check if we've already loaded the required prop library
|
||||||
if not propData.libraryName in self.libraryCache:
|
if not libraryName in self.libraryCache:
|
||||||
# Load the proplib
|
# Load the proplib
|
||||||
libraryPath = f"{self.propLibrarySourcePath}/{propData.libraryName}" # XXX: Get platform agnostic way of doing this
|
libraryPath = f"{self.propLibrarySourcePath}/{libraryName}" # XXX: Get platform agnostic way of doing this
|
||||||
library = PropLibrary(libraryPath)
|
library = PropLibrary(libraryPath)
|
||||||
self.libraryCache[propData.libraryName] = library
|
self.libraryCache[libraryName] = library
|
||||||
|
|
||||||
|
return self.libraryCache[libraryName]
|
||||||
|
|
||||||
|
'''
|
||||||
|
Blender data builders
|
||||||
|
'''
|
||||||
|
def getBlenderProp(self, propData):
|
||||||
# Load prop
|
# Load prop
|
||||||
propLibrary = self.libraryCache[propData.libraryName]
|
propLibrary = self.getPropLibrary(propData.libraryName)
|
||||||
propOB = propLibrary.getProp(propData.name, propData.groupName)
|
propOB = propLibrary.getProp(propData.name, propData.groupName)
|
||||||
propOB = propOB.copy() # We want to use a copy of the prop object
|
propOB = propOB.copy() # We want to use a copy of the prop object
|
||||||
|
|
||||||
@@ -259,22 +265,28 @@ class BattleMapBlenderImporter:
|
|||||||
|
|
||||||
# Shader specific logic
|
# Shader specific logic
|
||||||
if materialData.shader == "TankiOnline/SingleTextureShader":
|
if materialData.shader == "TankiOnline/SingleTextureShader":
|
||||||
# First check if we've already loaded the required prop library
|
bsdf = PrincipledBSDFWrapper(ma, is_readonly=False, use_nodes=True)
|
||||||
if not "Remaster" in self.libraryCache:
|
bsdf.roughness = 1.0
|
||||||
# Load the proplib
|
bsdf.ior = 1.0
|
||||||
libraryPath = f"{self.propLibrarySourcePath}/Remaster" # XXX: Get platform agnostic way of doing this
|
|
||||||
library = PropLibrary(libraryPath)
|
|
||||||
self.libraryCache["Remaster"] = library
|
|
||||||
|
|
||||||
# Try load texture
|
# Try load texture
|
||||||
textureParameter = materialData.textureParameters[0]
|
textureParameter = materialData.textureParameters[0]
|
||||||
library = self.libraryCache["Remaster"] #XXX: libraryName is optional
|
propLibrary = self.getPropLibrary("Remaster")
|
||||||
image = library.getTexture(f"{textureParameter.textureName}.webp")
|
texture = propLibrary.getTexture(f"{textureParameter.textureName}.webp")
|
||||||
|
|
||||||
# Apply texture
|
addImageTextureToMaterial(texture, ma.node_tree)
|
||||||
maWrapper = PrincipledBSDFWrapper(ma, is_readonly=False, use_nodes=True)
|
|
||||||
addImageTextureToMaterial(image, ma.node_tree)
|
|
||||||
elif materialData.shader == "TankiOnline/SpriteShader":
|
elif materialData.shader == "TankiOnline/SpriteShader":
|
||||||
|
bsdf = PrincipledBSDFWrapper(ma, is_readonly=False, use_nodes=True)
|
||||||
|
bsdf.roughness = 1.0
|
||||||
|
bsdf.ior = 1.0
|
||||||
|
|
||||||
|
# Try load texture
|
||||||
|
textureParameter = materialData.textureParameters[0]
|
||||||
|
propLibrary = self.getPropLibrary("Remaster")
|
||||||
|
texture = propLibrary.getTexture(f"{textureParameter.textureName}.webp")
|
||||||
|
|
||||||
|
addImageTextureToMaterial(texture, ma.node_tree, linkAlpha=True)
|
||||||
|
elif materialData.shader == "TankiOnline/Terrain":
|
||||||
pass
|
pass
|
||||||
|
|
||||||
return ma
|
return ma
|
||||||
@@ -20,17 +20,25 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|||||||
SOFTWARE.
|
SOFTWARE.
|
||||||
'''
|
'''
|
||||||
|
|
||||||
def addImageTextureToMaterial(image, node_tree):
|
from bpy.types import ShaderNodeBsdfPrincipled
|
||||||
|
|
||||||
|
'''
|
||||||
|
Functions
|
||||||
|
'''
|
||||||
|
def addImageTextureToMaterial(image, node_tree, linkAlpha=False):
|
||||||
nodes = node_tree.nodes
|
nodes = node_tree.nodes
|
||||||
links = node_tree.links
|
links = node_tree.links
|
||||||
|
|
||||||
# Check if this material already has a texture on it
|
# Check if this material has already been edited
|
||||||
if len(nodes) > 2:
|
if len(nodes) > 2:
|
||||||
return
|
return
|
||||||
|
|
||||||
# Create nodes
|
# Create nodes
|
||||||
principledBSDFNode = nodes[0]
|
bsdfNode = nodes.get("Principled BSDF")
|
||||||
textureNode = nodes.new(type="ShaderNodeTexImage")
|
textureNode = nodes.new(type="ShaderNodeTexImage")
|
||||||
links.new(textureNode.outputs["Color"], principledBSDFNode.inputs["Base Color"])
|
links.new(textureNode.outputs["Color"], bsdfNode.inputs["Base Color"])
|
||||||
|
if linkAlpha:
|
||||||
|
links.new(textureNode.outputs["Alpha"], bsdfNode.inputs["Alpha"])
|
||||||
|
|
||||||
# Apply image
|
# Apply image
|
||||||
if image != None: textureNode.image = image
|
if image != None: textureNode.image = image
|
||||||
Reference in New Issue
Block a user