/** * Creates a shallow copy of the given {@link Shader} * * @param shader The {@link Shader} * @return The copy */ static Shader copy(Shader shader) { Shader copy = new Shader(); copy.setExtensions(shader.getExtensions()); copy.setExtras(shader.getExtras()); copy.setName(shader.getName()); copy.setType(shader.getType()); copy.setUri(shader.getUri()); return copy; }
/** * Convert the given {@link Shader} into an embedded shader, by replacing * its URI with a data URI, if the URI is not already a data URI * * @param gltfModel The {@link GltfModelV1} * @param id The ID of the {@link Shader} * @param shader The {@link Shader} */ private static void convertShaderToEmbedded( GltfModelV1 gltfModel, String id, Shader shader) { String uriString = shader.getUri(); if (IO.isDataUriString(uriString)) { return; } ShaderModel shaderModel = gltfModel.getShaderModelById(id); ByteBuffer shaderData = shaderModel.getShaderData(); byte data[] = new byte[shaderData.capacity()]; shaderData.slice().get(data); String encodedData = Base64.getEncoder().encodeToString(data); String dataUriString = "data:text/plain;base64," + encodedData; shader.removeExtensions(BinaryGltfV1.getBinaryGltfExtensionName()); shader.setUri(dataUriString); }
/** * Creates a default vertex {@link Shader}, with an embedded * representation of the source code in form of a data URI.<br> * <br> * The returned {@link Shader} is the vertex {@link Shader} for the * default {@link Material}, as described in "Appendix A" of the * specification. * * @return The default {@link Shader} */ static Shader createDefaultVertexShader() { Shader shader = new Shader(); shader.setType(GltfConstants.GL_VERTEX_SHADER); String encodedCode = Base64.getEncoder().encodeToString( DEFAULT_VERTEX_SHADER_CODE.getBytes()); String dataUriString = "data:text/plain;base64," + encodedCode; shader.setUri(dataUriString); return shader; }
/** * Create the {@link ShaderModel} instances */ private void createShaderModels() { Map<String, Shader> shaders = Optionals.of(gltf.getShaders()); for (Entry<String, Shader> entry : shaders.entrySet()) { Shader shader = entry.getValue(); Integer type = shader.getType(); ShaderType shaderType = null; if (type == GltfConstants.GL_VERTEX_SHADER) { shaderType = ShaderType.VERTEX_SHADER; } else { shaderType = ShaderType.FRAGMENT_SHADER; } DefaultShaderModel shaderModel = new DefaultShaderModel(shader.getUri(), shaderType); shaderModels.add(shaderModel); } }
/** * Create a list containing all {@link GltfReference} objects for the * shaders that are contained in this model. * * @return The references */ public List<GltfReference> getShaderReferences() { List<GltfReference> references = new ArrayList<GltfReference>(); Map<String, Shader> shaders = Optionals.of(gltf.getShaders()); for (Entry<String, Shader> entry : shaders.entrySet()) { String shaderId = entry.getKey(); Shader shader = entry.getValue(); if (BinaryGltfV1.hasBinaryGltfExtension(shader)) { continue; } String uri = shader.getUri(); if (!IO.isDataUriString(uri)) { Consumer<ByteBuffer> target = byteBuffer -> putReferenceData(uri, byteBuffer); GltfReference reference = new GltfReference(shaderId, uri, target); references.add(reference); } } return references; }
Integer type = shader.getType(); if (type == null)
/** * Creates a default fragment {@link Shader}, with an embedded * representation of the source code in form of a data URI.<br> * <br> * The returned {@link Shader} is the fragment {@link Shader} for the * default {@link Material}, as described in "Appendix A" of the * specification. * * @return The default {@link Shader} */ static Shader createDefaultFragmentShader() { Shader shader = new Shader(); shader.setType(GltfConstants.GL_FRAGMENT_SHADER); String encodedCode = Base64.getEncoder().encodeToString( DEFAULT_FRAGMENT_SHADER_CODE.getBytes()); String dataUriString = "data:text/plain;base64," + encodedCode; shader.setUri(dataUriString); return shader; }
Shader vertexShader = gltf.getShaders().get(vertexShaderId); Shader fragmentShader = gltf.getShaders().get(fragmentShaderId); String vertexShaderUriString = vertexShader.getUri(); String fragmentShaderUriString = fragmentShader.getUri(); String shaderNames = ""; if (IO.isDataUriString(vertexShaderUriString))
Shader vertexShader = new Shader(); vertexShader.setUri(vertexShaderUri); vertexShader.setType(GltfConstants.GL_VERTEX_SHADER); String vertexShaderId = GltfIds.generateId( "vertexShader_for_" + programId, gltf.getShaders()); gltf.addShaders(vertexShaderId, vertexShader); Shader fragmentShader = new Shader(); fragmentShader.setUri(fragmentShaderUri); fragmentShader.setType(GltfConstants.GL_FRAGMENT_SHADER); String fragmentShaderId = GltfIds.generateId( "fragmentShader_for_" + programId, gltf.getShaders());
ByteBuffer shaderData = shaderModel.getShaderData(); String oldUriString = shader.getUri(); String newUriString = oldUriString; if (oldUriString == null || shader.setUri(newUriString); existingShaderUriStrings.add(newUriString); shader.removeExtensions(BinaryGltfV1.getBinaryGltfExtensionName());