From 43b52cb77cfcb0093d561ee3043f6d6a9afbfcfd Mon Sep 17 00:00:00 2001 From: javasabr Date: Mon, 27 Nov 2017 13:22:45 +0300 Subject: [PATCH] Fixed finding definitions during material loading. --- .../plugins/ShaderNodeLoaderDelegate.java | 56 +++++++++++-------- 1 file changed, 34 insertions(+), 22 deletions(-) diff --git a/jme3-core/src/plugins/java/com/jme3/material/plugins/ShaderNodeLoaderDelegate.java b/jme3-core/src/plugins/java/com/jme3/material/plugins/ShaderNodeLoaderDelegate.java index 06241f242..9dc620460 100644 --- a/jme3-core/src/plugins/java/com/jme3/material/plugins/ShaderNodeLoaderDelegate.java +++ b/jme3-core/src/plugins/java/com/jme3/material/plugins/ShaderNodeLoaderDelegate.java @@ -899,39 +899,51 @@ public class ShaderNodeLoaderDelegate { } /** - * find the definition from this statement (loads it if necessary) + * Find the definition from this statement (loads it if necessary) * * @param statement the statement being read * @return the definition * @throws IOException */ public ShaderNodeDefinition findDefinition(Statement statement) throws IOException { - String defLine[] = statement.getLine().split(":"); - String defName = defLine[1].trim(); - ShaderNodeDefinition def = getNodeDefinitions().get(defName); - if (def == null) { - if (defLine.length == 3) { - List defs = null; - try { - defs = assetManager.loadAsset(new ShaderNodeDefinitionKey(defLine[2].trim())); - } catch (AssetNotFoundException e) { - throw new MatParseException("Couldn't find " + defLine[2].trim(), statement, e); - } + final String defLine[] = statement.getLine().split(":"); - for (ShaderNodeDefinition definition : defs) { - if (defName.equals(definition.getName())) { - def = definition; - } - if (!(getNodeDefinitions().containsKey(definition.getName()))) { - getNodeDefinitions().put(definition.getName(), definition); - } - } + if (defLine.length != 3) { + throw new MatParseException("Can't find shader node definition for: ", statement); + } + + final Map nodeDefinitions = getNodeDefinitions(); + final String definitionName = defLine[1].trim(); + final String definitionPath = defLine[2].trim(); + final String fullName = definitionName + ":" + definitionPath; + + ShaderNodeDefinition def = nodeDefinitions.get(fullName); + if (def != null) { + return def; + } + + List defs; + try { + defs = assetManager.loadAsset(new ShaderNodeDefinitionKey(definitionPath)); + } catch (final AssetNotFoundException e) { + throw new MatParseException("Couldn't find " + definitionPath, statement, e); + } + + for (final ShaderNodeDefinition definition : defs) { + if (definitionName.equals(definition.getName())) { + def = definition; } - if (def == null) { - throw new MatParseException(defName + " is not a declared as Shader Node Definition", statement); + final String key = definition.getName() + ":" + definitionPath; + if (!(nodeDefinitions.containsKey(key))) { + nodeDefinitions.put(key, definition); } } + + if (def == null) { + throw new MatParseException(definitionName + " is not a declared as Shader Node Definition", statement); + } + return def; }