private HashMap<String, ArrayList<GLSLStruct>> findUniformStructs(String shaderText){
		// This parsing code is very, very specific. Don't change format of shader code!!!
		HashMap<String, ArrayList<GLSLStruct>> result = new HashMap<>();
		
		final String STRUCT_KEY = "struct";
		int structStartLocation = shaderText.indexOf(STRUCT_KEY);
		while(structStartLocation != -1){
			int nameBegin = structStartLocation + STRUCT_KEY.length() + 1;
			int braceBegin = shaderText.indexOf("{", nameBegin);
			int braceEnd = shaderText.indexOf("}", braceBegin);
			
			String structName = shaderText.substring(nameBegin, braceBegin).trim();
			ArrayList<GLSLStruct> glslStructs = new ArrayList<>();
			
			int componentSemicolonPosition = shaderText.indexOf(";", braceBegin);
			while(componentSemicolonPosition != -1 && componentSemicolonPosition < braceEnd){
				int componentNameStart = componentSemicolonPosition;
				
				while(!Character.isWhitespace(shaderText.charAt(componentNameStart-1)))
					componentNameStart--;
				
				int componentTypeEnd = componentNameStart - 1;
				int componentTypeStart = componentTypeEnd;
				
				while(!Character.isWhitespace(shaderText.charAt(componentTypeStart-1)))
					componentTypeStart--;
				
				String componentName = shaderText.substring(componentNameStart, componentSemicolonPosition);
				String componentType = shaderText.substring(componentTypeStart, componentTypeEnd);
				
				GLSLStruct glslStruct = new GLSLStruct();
				glslStruct.name = componentName;
				glslStruct.type = componentType;
				
				glslStructs.add(glslStruct);
				
				//System.out.println(componentType);
				
				componentSemicolonPosition = shaderText.indexOf(";", componentSemicolonPosition+1);
			}
			
			result.put(structName, glslStructs);
			
			structStartLocation = shaderText.indexOf(STRUCT_KEY, structStartLocation + STRUCT_KEY.length());
		}
		
		return result;
	}