Search in sources :

Example 1 with XMLAttributes

use of org.jwildfire.base.Tools.XMLAttributes in project JWildfire by thargor6.

the class AbstractFlameReader method parseXFormAttributes.

protected void parseXFormAttributes(Flame pFlame, XForm pXForm, String pXML) {
    XMLAttributes atts = Tools.parseAttributes(pXML);
    String hs;
    if ((hs = atts.get(ATTR_NAME)) != null) {
        pXForm.setName(hs);
    }
    if ((hs = atts.get(ATTR_WEIGHT)) != null) {
        pXForm.setWeight(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_MIRROR_PRE_POST_TRANSLATIONS)) != null) {
        double val = Double.parseDouble(hs);
        pXForm.setMirrorTranslations(val == 1);
    }
    if ((hs = atts.get(ATTR_COLOR)) != null) {
        pXForm.setColor(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_MATERIAL)) != null) {
        pXForm.setMaterial(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_MATERIAL_SPEED)) != null) {
        pXForm.setMaterialSpeed(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_MOD_GAMMA)) != null) {
        pXForm.setModGamma(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_MOD_GAMMA_SPEED)) != null) {
        pXForm.setModGammaSpeed(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_MOD_CONTRAST)) != null) {
        pXForm.setModContrast(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_MOD_CONTRAST_SPEED)) != null) {
        pXForm.setModContrastSpeed(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_MOD_SATURATION)) != null) {
        pXForm.setModSaturation(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_MOD_SATURATION_SPEED)) != null) {
        pXForm.setModSaturationSpeed(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_MOD_HUE)) != null) {
        pXForm.setModHue(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_MOD_HUE_SPEED)) != null) {
        pXForm.setModHueSpeed(Double.parseDouble(hs));
    }
    // legacy
    if ((hs = atts.get(ATTR_ANTIALIAS_AMOUNT)) != null) {
        double value = Double.parseDouble(hs);
        if (value > 0)
            pFlame.setAntialiasAmount(value);
    }
    // legacy
    if ((hs = atts.get(ATTR_ANTIALIAS_RADIUS)) != null) {
        double value = Double.parseDouble(hs);
        if (value > 0)
            pFlame.setAntialiasRadius(value);
    }
    if ((hs = atts.get(ATTR_OPACITY)) != null) {
        double opacity = Double.parseDouble(hs);
        pXForm.setOpacity(opacity);
        if (Math.abs(opacity) <= MathLib.EPSILON) {
            pXForm.setDrawMode(DrawMode.HIDDEN);
        } else if (Math.abs(opacity - 1.0) > MathLib.EPSILON) {
            pXForm.setDrawMode(DrawMode.OPAQUE);
        } else {
            pXForm.setDrawMode(DrawMode.NORMAL);
        }
    }
    if ((hs = atts.get(ATTR_SYMMETRY)) != null) {
        pXForm.setColorSymmetry(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_XY_COEFS)) != null) {
        String[] s = hs.split(" ");
        pXForm.setXYCoeff00(Double.parseDouble(s[0]));
        pXForm.setXYCoeff01(Double.parseDouble(s[1]));
        pXForm.setXYCoeff10(Double.parseDouble(s[2]));
        pXForm.setXYCoeff11(Double.parseDouble(s[3]));
        pXForm.setXYCoeff20(Double.parseDouble(s[4]));
        pXForm.setXYCoeff21(Double.parseDouble(s[5]));
    }
    if ((hs = atts.get(ATTR_XY_POST)) != null) {
        String[] s = hs.split(" ");
        pXForm.setXYPostCoeff00(Double.parseDouble(s[0]));
        pXForm.setXYPostCoeff01(Double.parseDouble(s[1]));
        pXForm.setXYPostCoeff10(Double.parseDouble(s[2]));
        pXForm.setXYPostCoeff11(Double.parseDouble(s[3]));
        pXForm.setXYPostCoeff20(Double.parseDouble(s[4]));
        pXForm.setXYPostCoeff21(Double.parseDouble(s[5]));
    }
    if ((hs = atts.get(ATTR_YZ_COEFS)) != null) {
        String[] s = hs.split(" ");
        pXForm.setYZCoeff00(Double.parseDouble(s[0]));
        pXForm.setYZCoeff01(Double.parseDouble(s[1]));
        pXForm.setYZCoeff10(Double.parseDouble(s[2]));
        pXForm.setYZCoeff11(Double.parseDouble(s[3]));
        pXForm.setYZCoeff20(Double.parseDouble(s[4]));
        pXForm.setYZCoeff21(Double.parseDouble(s[5]));
    }
    if ((hs = atts.get(ATTR_YZ_POST)) != null) {
        String[] s = hs.split(" ");
        pXForm.setYZPostCoeff00(Double.parseDouble(s[0]));
        pXForm.setYZPostCoeff01(Double.parseDouble(s[1]));
        pXForm.setYZPostCoeff10(Double.parseDouble(s[2]));
        pXForm.setYZPostCoeff11(Double.parseDouble(s[3]));
        pXForm.setYZPostCoeff20(Double.parseDouble(s[4]));
        pXForm.setYZPostCoeff21(Double.parseDouble(s[5]));
    }
    if ((hs = atts.get(ATTR_ZX_COEFS)) != null) {
        String[] s = hs.split(" ");
        pXForm.setZXCoeff00(Double.parseDouble(s[0]));
        pXForm.setZXCoeff01(Double.parseDouble(s[1]));
        pXForm.setZXCoeff10(Double.parseDouble(s[2]));
        pXForm.setZXCoeff11(Double.parseDouble(s[3]));
        pXForm.setZXCoeff20(Double.parseDouble(s[4]));
        pXForm.setZXCoeff21(Double.parseDouble(s[5]));
    }
    if ((hs = atts.get(ATTR_ZX_POST)) != null) {
        String[] s = hs.split(" ");
        pXForm.setZXPostCoeff00(Double.parseDouble(s[0]));
        pXForm.setZXPostCoeff01(Double.parseDouble(s[1]));
        pXForm.setZXPostCoeff10(Double.parseDouble(s[2]));
        pXForm.setZXPostCoeff11(Double.parseDouble(s[3]));
        pXForm.setZXPostCoeff20(Double.parseDouble(s[4]));
        pXForm.setZXPostCoeff21(Double.parseDouble(s[5]));
    }
    if ((hs = atts.get(ATTR_CHAOS)) != null) {
        String[] s = hs.split(" ");
        for (int i = 0; i < s.length; i++) {
            pXForm.getModifiedWeights()[i] = Double.parseDouble(s[i]);
        }
    }
    readMotionCurves(pXForm, atts, null);
    // variations
    {
        List<String> variationNameList = VariationFuncList.getNameList();
        Map<String, String> aliasMap = VariationFuncList.getAliasMap();
        for (XMLAttribute attr : atts.getAttributes()) {
            String rawName = attr.getName();
            String name = removeIndexFromAttr(rawName);
            String varName = name;
            boolean hasVariation = variationNameList.indexOf(varName) >= 0;
            if (!hasVariation) {
                String aliasName = aliasMap.get(name);
                if (aliasName != null) {
                    varName = aliasName;
                    hasVariation = variationNameList.indexOf(varName) >= 0;
                }
            }
            if (hasVariation) {
                VariationFunc varFunc = VariationFuncList.getVariationFuncInstance(varName);
                Variation variation = pXForm.addVariation(Double.parseDouble(atts.get(rawName)), varFunc);
                String priority = atts.get(rawName + "_" + ATTR_FX_PRIORITY);
                if (priority != null && priority.length() > 0) {
                    variation.setPriority(Integer.parseInt(priority));
                }
                // ressources
                {
                    String[] ressNames = variation.getFunc().getRessourceNames();
                    if (ressNames != null) {
                        for (String pName : ressNames) {
                            String pHs;
                            if ((pHs = atts.get(rawName + "_" + pName)) != null) {
                                variation.getFunc().setRessource(pName, Tools.hexStringToByteArray(pHs));
                            }
                        }
                    }
                }
                // params
                {
                    String[] paramNames = variation.getFunc().getParameterNames();
                    String[] paramAltNames = variation.getFunc().getParameterAlternativeNames();
                    if (paramNames != null) {
                        if (paramAltNames != null && paramAltNames.length != paramNames.length) {
                            paramAltNames = null;
                        }
                        for (int i = 0; i < paramNames.length; i++) {
                            String pName = paramNames[i];
                            String pHs;
                            if ((pHs = atts.get(rawName + "_" + pName)) != null) {
                                variation.getFunc().setParameter(pName, Double.parseDouble(pHs));
                            } else // altNames can only be come from flames which were not created by JWF, so no need to handle index here
                            if (paramAltNames != null && ((pHs = atts.get(paramAltNames[i])) != null)) {
                                variation.getFunc().setParameter(pName, Double.parseDouble(pHs));
                            }
                            // curve
                            {
                                String namePrefix = rawName + "_" + pName + "_";
                                if (atts.get(namePrefix + AbstractFlameReader.CURVE_ATTR_POINT_COUNT) != null) {
                                    MotionCurve curve = variation.getMotionCurve(pName);
                                    if (curve == null) {
                                        curve = variation.createMotionCurve(pName);
                                    }
                                    readMotionCurveAttributes(atts, curve, namePrefix);
                                }
                            }
                        }
                    }
                }
                // then changes to parameter B cannot in turn cause additional parameters to be added/removed
                if (variation.getFunc().dynamicParameterExpansion()) {
                    String[] paramNames = variation.getFunc().getParameterNames();
                    String[] paramAltNames = variation.getFunc().getParameterAlternativeNames();
                    if (paramNames != null) {
                        if (paramAltNames != null && paramAltNames.length != paramNames.length) {
                            paramAltNames = null;
                        }
                        for (int i = 0; i < paramNames.length; i++) {
                            String pName = paramNames[i];
                            String pHs;
                            if ((pHs = atts.get(rawName + "_" + pName)) != null) {
                                variation.getFunc().setParameter(pName, Double.parseDouble(pHs));
                            } else // altNames can only be come from flames which were not created by JWF, so no need to handle index here
                            if (paramAltNames != null && ((pHs = atts.get(paramAltNames[i])) != null)) {
                                variation.getFunc().setParameter(pName, Double.parseDouble(pHs));
                            }
                            // curve
                            {
                                String namePrefix = rawName + "_" + pName + "_";
                                if (atts.get(namePrefix + AbstractFlameReader.CURVE_ATTR_POINT_COUNT) != null) {
                                    MotionCurve curve = variation.getMotionCurve(pName);
                                    if (curve == null) {
                                        curve = variation.createMotionCurve(pName);
                                    }
                                    readMotionCurveAttributes(atts, curve, namePrefix);
                                }
                            }
                        }
                    }
                }
                // curves
                readMotionCurves(variation, atts, rawName + "_");
            // 
            }
        }
    }
}
Also used : XMLAttributes(org.jwildfire.base.Tools.XMLAttributes) XMLAttribute(org.jwildfire.base.Tools.XMLAttribute) MotionCurve(org.jwildfire.create.tina.base.motion.MotionCurve) VariationFuncList(org.jwildfire.create.tina.variation.VariationFuncList) List(java.util.List) Variation(org.jwildfire.create.tina.variation.Variation) Map(java.util.Map) VariationFunc(org.jwildfire.create.tina.variation.VariationFunc)

Example 2 with XMLAttributes

use of org.jwildfire.base.Tools.XMLAttributes in project JWildfire by thargor6.

the class Flam3Reader method readFlamesfromXML.

public List<Flame> readFlamesfromXML(String pXML) {
    List<Flame> res = new ArrayList<Flame>();
    int pFlames = 0;
    while (true) {
        String flameXML;
        {
            int ps = pXML.indexOf("<flame ", pFlames);
            if (ps < 0)
                break;
            int pe = pXML.indexOf("</flame>", ps + 1);
            if (pe < 0)
                break;
            pFlames = pe + 8;
            flameXML = pXML.substring(ps, pFlames);
        }
        Flame flame = new Flame();
        res.add(flame);
        // Flame attributes
        XMLAttributes atts;
        {
            int ps = flameXML.indexOf("<flame ");
            int pe = -1;
            boolean qt = false;
            for (int i = ps + 1; i < flameXML.length(); i++) {
                if (flameXML.charAt(i) == '\"') {
                    qt = !qt;
                } else if (!qt && flameXML.charAt(i) == '>') {
                    pe = i;
                    break;
                }
            }
            String hs = flameXML.substring(ps + 7, pe);
            atts = parseFlameAttributes(flame, hs);
        }
        Layer layer = flame.getFirstLayer();
        readXForms(flameXML, flame, layer);
        readFinalXForms(flameXML, flame, layer);
        readColors(flameXML, layer);
        readMotionCurves(layer.getPalette(), atts, "palette_");
    }
    return res;
}
Also used : XMLAttributes(org.jwildfire.base.Tools.XMLAttributes) ArrayList(java.util.ArrayList) Layer(org.jwildfire.create.tina.base.Layer) Flame(org.jwildfire.create.tina.base.Flame)

Example 3 with XMLAttributes

use of org.jwildfire.base.Tools.XMLAttributes in project JWildfire by thargor6.

the class FlameMovieReader method parseMovieAttributes.

private void parseMovieAttributes(FlameMovie pMovie, String pXML) {
    XMLAttributes atts = Tools.parseAttributes(pXML);
    String hs;
    if ((hs = atts.get(ATTR_NAME)) != null) {
        pMovie.setName(hs);
    }
    if ((hs = atts.get(ATTR_SCRIPT_GLOBAL)) != null) {
        // legacy
        pMovie.getGlobalScripts()[0] = new GlobalScript(GlobalScriptType.valueOf(hs), 1.0);
    }
    for (int i = 0; i < FlameMovie.SCRIPT_COUNT; i++) {
        String idxStr = String.valueOf(i + 1);
        if ((hs = atts.get(ATTR_SCRIPT_GLOBAL + idxStr)) != null) {
            pMovie.getGlobalScripts()[i] = readGlobalScript(ATTR_SCRIPT_GLOBAL + idxStr, ATTR_SCRIPT_GLOBAL + idxStr + AMPLITUDE_POSTFIX, ATTR_SCRIPT_GLOBAL + idxStr + AMPLITUDE_CURVE_POSTFIX, atts);
        }
    }
    if ((hs = atts.get(ATTR_SCRIPT_XFORM)) != null) {
        // legacy
        pMovie.getxFormScripts()[0] = new XFormScript(XFormScriptType.valueOf(hs), 1.0);
    }
    for (int i = 0; i < FlameMovie.SCRIPT_COUNT; i++) {
        String idxStr = String.valueOf(i + 1);
        if ((hs = atts.get(ATTR_SCRIPT_XFORM + idxStr)) != null) {
            pMovie.getxFormScripts()[i] = readXFormScript(ATTR_SCRIPT_XFORM + idxStr, ATTR_SCRIPT_XFORM + idxStr + AMPLITUDE_POSTFIX, ATTR_SCRIPT_XFORM + idxStr + AMPLITUDE_CURVE_POSTFIX, atts);
        }
    }
    if ((hs = atts.get(ATTR_FRAME_WIDTH)) != null) {
        pMovie.setFrameWidth(Integer.parseInt(hs));
    }
    if ((hs = atts.get(ATTR_FRAME_HEIGHT)) != null) {
        pMovie.setFrameHeight(Integer.parseInt(hs));
    }
    if ((hs = atts.get(ATTR_FPS)) != null) {
        pMovie.setFramesPerSecond(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_QUALITY)) != null) {
        pMovie.setQuality(Integer.parseInt(hs));
    }
    if ((hs = atts.get(ATTR_SEQUENCE_OUTPUT_TYPE)) != null) {
        try {
            pMovie.setSequenceOutputType(SequenceOutputType.valueOf(hs));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    if ((hs = atts.get(ATTR_MOTIONBLUR_LENGTH)) != null) {
        pMovie.setMotionBlurLength(Integer.parseInt(hs));
    }
    if ((hs = atts.get(ATTR_MOTIONBLUR_TIMESTEP)) != null) {
        pMovie.setMotionBlurTimeStep(Double.parseDouble(hs));
    }
}
Also used : XFormScript(org.jwildfire.create.tina.animate.XFormScript) XMLAttributes(org.jwildfire.base.Tools.XMLAttributes) GlobalScript(org.jwildfire.create.tina.animate.GlobalScript)

Example 4 with XMLAttributes

use of org.jwildfire.base.Tools.XMLAttributes in project JWildfire by thargor6.

the class AbstractFlameReader method parseFlameAttributes.

protected XMLAttributes parseFlameAttributes(Flame pFlame, String pXML) {
    XMLAttributes atts = Tools.parseAttributes(pXML);
    String hs;
    if ((hs = atts.get(ATTR_NAME)) != null) {
        pFlame.setName(hs);
    }
    if ((hs = atts.get(ATTR_BACKGROUND_IMAGE)) != null) {
        pFlame.setBGImageFilename(hs);
    }
    if ((hs = atts.get(ATTR_LAYER_NAME)) != null && pFlame.getLayers().size() == 1) {
        pFlame.getFirstLayer().setName(hs);
    }
    if ((hs = atts.get(ATTR_GRADIENT_MAP)) != null && pFlame.getLayers().size() == 1) {
        pFlame.getFirstLayer().setGradientMapFilename(hs);
    }
    if ((hs = atts.get(ATTR_GRADIENT_MAP_HOFFSET)) != null && pFlame.getLayers().size() == 1) {
        pFlame.getFirstLayer().setGradientMapHorizOffset(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_GRADIENT_MAP_HSCALE)) != null && pFlame.getLayers().size() == 1) {
        pFlame.getFirstLayer().setGradientMapHorizScale(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_GRADIENT_MAP_VOFFSET)) != null && pFlame.getLayers().size() == 1) {
        pFlame.getFirstLayer().setGradientMapVertOffset(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_GRADIENT_MAP_VSCALE)) != null && pFlame.getLayers().size() == 1) {
        pFlame.getFirstLayer().setGradientMapVertScale(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_GRADIENT_MAP_LCOLOR_ADD)) != null && pFlame.getLayers().size() == 1) {
        pFlame.getFirstLayer().setGradientMapLocalColorAdd(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_GRADIENT_MAP_LCOLOR_SCALE)) != null && pFlame.getLayers().size() == 1) {
        pFlame.getFirstLayer().setGradientMapLocalColorScale(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_SMOOTH_GRADIENT)) != null && pFlame.getLayers().size() == 1) {
        pFlame.getFirstLayer().setSmoothGradient("1".equals(hs));
    }
    if ((hs = atts.get(ATTR_SIZE)) != null) {
        String[] s = hs.split(" ");
        pFlame.setWidth(Integer.parseInt(s[0]));
        pFlame.setHeight(Integer.parseInt(s[1]));
    }
    if ((hs = atts.get(ATTR_CENTER)) != null) {
        String[] s = hs.split(" ");
        pFlame.setCentreX(Double.parseDouble(s[0]));
        pFlame.setCentreY(Double.parseDouble(s[1]));
    }
    if ((hs = atts.get(ATTR_SCALE)) != null) {
        pFlame.setPixelsPerUnit(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_ROTATE)) != null) {
        // pFlame.setCamRoll(-Double.parseDouble(hs) * 180.0 / Math.PI);
        pFlame.setCamRoll(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_FILTER)) != null) {
        pFlame.setSpatialFilterRadius(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_FILTER_SHARPNESS)) != null) {
        pFlame.setSpatialFilterSharpness(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_FILTER_LOW_DENSITY)) != null) {
        pFlame.setSpatialFilterLowDensity(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_FILTER_TYPE)) != null) {
        try {
            FilteringType filteringType = FilteringType.valueOf(hs);
            pFlame.setSpatialFilteringType(filteringType);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    if ((hs = atts.get(ATTR_FILTER_KERNEL)) != null) {
        try {
            FilterKernelType kernel = FilterKernelType.valueOf(hs);
            pFlame.setSpatialFilterKernel(kernel);
            if (atts.get(ATTR_FILTER_TYPE) == null) {
                if (FilterKernelType.getAdapativeFilters().contains(kernel)) {
                    pFlame.setSpatialFilteringType(FilteringType.ADAPTIVE);
                } else if (FilterKernelType.getSharpeningFilters().contains(kernel)) {
                    pFlame.setSpatialFilteringType(FilteringType.GLOBAL_SHARPENING);
                } else if (FilterKernelType.getSmoothingFilters().contains(kernel)) {
                    pFlame.setSpatialFilteringType(FilteringType.GLOBAL_SMOOTHING);
                } else {
                    pFlame.setSpatialFilteringType(FilteringType.GLOBAL_SMOOTHING);
                    pFlame.setSpatialFilterKernel(FilterKernelType.SINEPOW10);
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    if ((hs = atts.get(ATTR_FILTER_INDICATOR)) != null) {
        pFlame.setSpatialFilterIndicator(Integer.parseInt(hs) == 1);
    }
    if ((hs = atts.get(ATTR_SPATIAL_OVERSAMPLE)) != null) {
        pFlame.setSpatialOversampling(Integer.parseInt(hs));
    }
    if ((hs = atts.get(ATTR_POST_NOISE_FILTER)) != null) {
        pFlame.setPostNoiseFilter(Integer.parseInt(hs) == 1);
    }
    if ((hs = atts.get(ATTR_POST_NOISE_FILTER_THRESHOLD)) != null) {
        pFlame.setPostNoiseFilterThreshold(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_QUALITY)) != null) {
        pFlame.setSampleDensity(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_BACKGROUND_TYPE)) != null) {
        try {
            pFlame.setBgColorType(BGColorType.valueOf(hs));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    if ((hs = atts.get(ATTR_BACKGROUND)) != null) {
        String[] s = hs.split(" ");
        pFlame.setBgColorRed(Tools.roundColor(255.0 * Double.parseDouble(s[0])));
        pFlame.setBgColorGreen(Tools.roundColor(255.0 * Double.parseDouble(s[1])));
        pFlame.setBgColorBlue(Tools.roundColor(255.0 * Double.parseDouble(s[2])));
        // old flames without a bg color type
        if (atts.get(ATTR_BACKGROUND_TYPE) == null) {
            pFlame.setBgColorType(BGColorType.SINGLE_COLOR);
        }
    }
    if ((hs = atts.get(ATTR_BACKGROUND_UL)) != null) {
        String[] s = hs.split(" ");
        pFlame.setBgColorULRed(Tools.roundColor(255.0 * Double.parseDouble(s[0])));
        pFlame.setBgColorULGreen(Tools.roundColor(255.0 * Double.parseDouble(s[1])));
        pFlame.setBgColorULBlue(Tools.roundColor(255.0 * Double.parseDouble(s[2])));
    }
    if ((hs = atts.get(ATTR_BACKGROUND_UR)) != null) {
        String[] s = hs.split(" ");
        pFlame.setBgColorURRed(Tools.roundColor(255.0 * Double.parseDouble(s[0])));
        pFlame.setBgColorURGreen(Tools.roundColor(255.0 * Double.parseDouble(s[1])));
        pFlame.setBgColorURBlue(Tools.roundColor(255.0 * Double.parseDouble(s[2])));
    }
    if ((hs = atts.get(ATTR_BACKGROUND_LL)) != null) {
        String[] s = hs.split(" ");
        pFlame.setBgColorLLRed(Tools.roundColor(255.0 * Double.parseDouble(s[0])));
        pFlame.setBgColorLLGreen(Tools.roundColor(255.0 * Double.parseDouble(s[1])));
        pFlame.setBgColorLLBlue(Tools.roundColor(255.0 * Double.parseDouble(s[2])));
    }
    if ((hs = atts.get(ATTR_BACKGROUND_LR)) != null) {
        String[] s = hs.split(" ");
        pFlame.setBgColorLRRed(Tools.roundColor(255.0 * Double.parseDouble(s[0])));
        pFlame.setBgColorLRGreen(Tools.roundColor(255.0 * Double.parseDouble(s[1])));
        pFlame.setBgColorLRBlue(Tools.roundColor(255.0 * Double.parseDouble(s[2])));
    }
    if ((hs = atts.get(ATTR_BACKGROUND_CC)) != null) {
        String[] s = hs.split(" ");
        pFlame.setBgColorCCRed(Tools.roundColor(255.0 * Double.parseDouble(s[0])));
        pFlame.setBgColorCCGreen(Tools.roundColor(255.0 * Double.parseDouble(s[1])));
        pFlame.setBgColorCCBlue(Tools.roundColor(255.0 * Double.parseDouble(s[2])));
    }
    if ((hs = atts.get(ATTR_BRIGHTNESS)) != null) {
        pFlame.setBrightness(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_SATURATION)) != null) {
        pFlame.setSaturation(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_BG_TRANSPARENCY)) != null) {
        pFlame.setBGTransparency(Integer.parseInt(hs) == 1);
    } else {
        pFlame.setBGTransparency(prefs.isTinaDefaultBGTransparency());
    }
    if ((hs = atts.get(ATTR_GAMMA)) != null) {
        pFlame.setGamma(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_GAMMA_THRESHOLD)) != null) {
        pFlame.setGammaThreshold(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_VIBRANCY)) != null) {
        pFlame.setVibrancy(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_LOW_DENSITY_BRIGHTNESS)) != null) {
        pFlame.setLowDensityBrightness(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_BALANCING_RED)) != null) {
        pFlame.setBalanceRed(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_BALANCING_GREEN)) != null) {
        pFlame.setBalanceGreen(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_BALANCING_BLUE)) != null) {
        pFlame.setBalanceBlue(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_CONTRAST)) != null) {
        pFlame.setContrast(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_WHITE_LEVEL)) != null) {
        pFlame.setWhiteLevel(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_CAM_PERSP)) != null) {
        pFlame.setCamPerspective(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_CAM_PERSPECTIVE)) != null) {
        pFlame.setCamPerspective(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_CAM_ZPOS)) != null) {
        pFlame.setCamZ(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_CAM_POS_X)) != null) {
        pFlame.setCamPosX(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_CAM_POS_Y)) != null) {
        pFlame.setCamPosY(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_CAM_POS_Z)) != null) {
        pFlame.setCamPosZ(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_CAM_XFOCUS)) != null) {
        pFlame.setFocusX(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_CAM_YFOCUS)) != null) {
        pFlame.setFocusY(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_CAM_ZFOCUS)) != null) {
        pFlame.setFocusZ(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_CAM_ZDIMISH)) != null) {
        pFlame.setDimishZ(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_CAM_DOF)) != null) {
        pFlame.setCamDOF(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_CAM_DOF_SHAPE)) != null) {
        try {
            pFlame.setCamDOFShape(DOFBlurShapeType.valueOf(hs));
        } catch (Exception ex) {
            pFlame.setCamDOFShape(DOFBlurShapeType.BUBBLE);
            ex.printStackTrace();
        }
    }
    if ((hs = atts.get(ATTR_CAM_DOF_SCALE)) != null) {
        pFlame.setCamDOFScale(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_CAM_DOF_ROTATE)) != null) {
        pFlame.setCamDOFAngle(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_CAM_DOF_FADE)) != null) {
        pFlame.setCamDOFFade(Double.parseDouble(hs));
    }
    {
        DOFBlurShape shape = pFlame.getCamDOFShape().getDOFBlurShape();
        List<String> paramNames = shape.getParamNames();
        if (paramNames.size() > 0 && (hs = atts.get(ATTR_CAM_DOF_PARAM1)) != null) {
            pFlame.setCamDOFParam1(Double.parseDouble(hs));
        }
        if (paramNames.size() > 1 && (hs = atts.get(ATTR_CAM_DOF_PARAM2)) != null) {
            pFlame.setCamDOFParam2(Double.parseDouble(hs));
        }
        if (paramNames.size() > 2 && (hs = atts.get(ATTR_CAM_DOF_PARAM3)) != null) {
            pFlame.setCamDOFParam3(Double.parseDouble(hs));
        }
        if (paramNames.size() > 3 && (hs = atts.get(ATTR_CAM_DOF_PARAM4)) != null) {
            pFlame.setCamDOFParam4(Double.parseDouble(hs));
        }
        if (paramNames.size() > 4 && (hs = atts.get(ATTR_CAM_DOF_PARAM5)) != null) {
            pFlame.setCamDOFParam5(Double.parseDouble(hs));
        }
        if (paramNames.size() > 5 && (hs = atts.get(ATTR_CAM_DOF_PARAM6)) != null) {
            pFlame.setCamDOFParam6(Double.parseDouble(hs));
        }
    }
    if ((hs = atts.get(ATTR_CAM_DOF_AREA)) != null) {
        pFlame.setCamDOFArea(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_CAM_DOF_EXPONENT)) != null) {
        pFlame.setCamDOFExponent(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_CAM_PITCH)) != null) {
        pFlame.setCamPitch(Double.parseDouble(hs) * 180.0 / Math.PI);
    }
    if ((hs = atts.get(ATTR_CAM_YAW)) != null) {
        pFlame.setCamYaw(Double.parseDouble(hs) * 180.0 / Math.PI);
    }
    if ((hs = atts.get(ATTR_CAM_ZOOM)) != null) {
        pFlame.setCamZoom(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_NEW_DOF)) != null) {
        pFlame.setNewCamDOF("1".equals(hs));
    }
    // preserve-z
    if ((hs = atts.get(ATTR_PRESERVE_Z)) != null) {
        pFlame.setPreserveZ("1".equals(hs));
    }
    // profiles
    if ((hs = atts.get(ATTR_RESOLUTION_PROFILE)) != null) {
        pFlame.setResolutionProfile(hs);
    }
    if ((hs = atts.get(ATTR_QUALITY_PROFILE)) != null) {
        pFlame.setQualityProfile(hs);
    }
    if ((hs = atts.get(ATTR_NEW_LINEAR)) != null) {
        pFlame.setPreserveZ(hs.length() > 0 && Integer.parseInt(hs) == 1);
    }
    if ((hs = atts.get(ATTR_ANTIALIAS_AMOUNT)) != null) {
        pFlame.setAntialiasAmount(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_ANTIALIAS_RADIUS)) != null) {
        pFlame.setAntialiasRadius(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_MOTIONBLUR_LENGTH)) != null) {
        int blurLen = Integer.parseInt(hs);
        pFlame.setMotionBlurLength(blurLen);
    }
    if ((hs = atts.get(ATTR_MOTIONBLUR_TIMESTEP)) != null) {
        double timestep = Double.parseDouble(hs);
        pFlame.setMotionBlurTimeStep(timestep);
    }
    if ((hs = atts.get(ATTR_MOTIONBLUR_DECAY)) != null) {
        pFlame.setMotionBlurDecay(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_POST_SYMMETRY_TYPE)) != null) {
        try {
            pFlame.setPostSymmetryType(PostSymmetryType.valueOf(hs));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    if ((hs = atts.get(ATTR_POST_SYMMETRY_ORDER)) != null) {
        pFlame.setPostSymmetryOrder(Integer.parseInt(hs));
    }
    if ((hs = atts.get(ATTR_POST_SYMMETRY_CENTREX)) != null) {
        pFlame.setPostSymmetryCentreX(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_POST_SYMMETRY_CENTREY)) != null) {
        pFlame.setPostSymmetryCentreY(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_POST_SYMMETRY_DISTANCE)) != null) {
        pFlame.setPostSymmetryDistance(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_POST_SYMMETRY_ROTATION)) != null) {
        pFlame.setPostSymmetryRotation(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_STEREO3D_MODE)) != null) {
        try {
            pFlame.setStereo3dMode(Stereo3dMode.valueOf(hs));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    if ((hs = atts.get(ATTR_STEREO3D_ANGLE)) != null) {
        pFlame.setStereo3dAngle(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_STEREO3D_EYE_DIST)) != null) {
        pFlame.setStereo3dEyeDist(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_STEREO3D_FOCAL_OFFSET)) != null) {
        pFlame.setStereo3dFocalOffset(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_STEREO3D_LEFT_EYE_COLOR)) != null) {
        try {
            pFlame.setStereo3dLeftEyeColor(Stereo3dColor.valueOf(hs));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    if ((hs = atts.get(ATTR_STEREO3D_RIGHT_EYE_COLOR)) != null) {
        try {
            pFlame.setStereo3dRightEyeColor(Stereo3dColor.valueOf(hs));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    if ((hs = atts.get(ATTR_STEREO3D_INTERPOLATED_IMAGE_COUNT)) != null) {
        pFlame.setStereo3dInterpolatedImageCount(Integer.parseInt(hs));
    }
    if ((hs = atts.get(ATTR_STEREO3D_PREVIEW)) != null) {
        try {
            pFlame.setStereo3dPreview(Stereo3dPreview.valueOf(hs));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    if ((hs = atts.get(ATTR_STEREO3D_SWAP_SIDES)) != null) {
        pFlame.setStereo3dSwapSides(Integer.parseInt(hs) == 1);
    }
    if ((hs = atts.get(ATTR_FRAME)) != null) {
        pFlame.setFrame(Integer.parseInt(hs));
    }
    if ((hs = atts.get(ATTR_FRAME_COUNT)) != null) {
        pFlame.setFrameCount(Integer.parseInt(hs));
    }
    if ((hs = atts.get(ATTR_FPS)) != null) {
        int fps = Integer.parseInt(hs);
        if (fps >= 1)
            pFlame.setFps(fps);
    }
    if ((hs = atts.get(ATTR_POSTBLUR_RADIUS)) != null) {
        pFlame.setPostBlurRadius(Integer.parseInt(hs));
    }
    if ((hs = atts.get(ATTR_POSTBLUR_FADE)) != null) {
        pFlame.setPostBlurFade(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_POSTBLUR_FALLOFF)) != null) {
        pFlame.setPostBlurFallOff(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_ZBUFFER_SCALE)) != null) {
        pFlame.setZBufferScale(Double.parseDouble(hs));
    }
    if ((hs = atts.get(ATTR_SLD_RENDER_ENABLED)) != null) {
        pFlame.getSolidRenderSettings().setSolidRenderingEnabled(Integer.parseInt(hs) == 1);
    } else {
        pFlame.getSolidRenderSettings().setSolidRenderingEnabled(false);
    }
    if (pFlame.getSolidRenderSettings().isSolidRenderingEnabled()) {
        if ((hs = atts.get(ATTR_SLD_RENDER_AO_ENABLED)) != null) {
            pFlame.getSolidRenderSettings().setAoEnabled(Integer.parseInt(hs) == 1);
        }
        if ((hs = atts.get(ATTR_SLD_RENDER_AO_INTENSITY)) != null) {
            pFlame.getSolidRenderSettings().setAoIntensity(Double.parseDouble(hs));
        }
        if ((hs = atts.get(ATTR_SLD_RENDER_AO_SEARCH_RADIUS)) != null) {
            pFlame.getSolidRenderSettings().setAoSearchRadius(Double.parseDouble(hs));
        }
        if ((hs = atts.get(ATTR_SLD_RENDER_AO_BLUR_RADIUS)) != null) {
            pFlame.getSolidRenderSettings().setAoBlurRadius(Double.parseDouble(hs));
        }
        if ((hs = atts.get(ATTR_SLD_RENDER_AO_RADIUS_SAMPLES)) != null) {
            pFlame.getSolidRenderSettings().setAoRadiusSamples(Integer.parseInt(hs));
        }
        if ((hs = atts.get(ATTR_SLD_RENDER_AO_AZIMUTH_SAMPLES)) != null) {
            pFlame.getSolidRenderSettings().setAoAzimuthSamples(Integer.parseInt(hs));
        }
        if ((hs = atts.get(ATTR_SLD_RENDER_AO_FALLOFF)) != null) {
            pFlame.getSolidRenderSettings().setAoFalloff(Double.parseDouble(hs));
        }
        if ((hs = atts.get(ATTR_SLD_RENDER_AO_AFFECT_DIFFUSE)) != null) {
            pFlame.getSolidRenderSettings().setAoAffectDiffuse(Double.parseDouble(hs));
        }
        if ((hs = atts.get(ATTR_SLD_RENDER_SHADOW_TYPE)) != null) {
            try {
                pFlame.getSolidRenderSettings().setShadowType(ShadowType.valueOf(hs));
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        if ((hs = atts.get(ATTR_SLD_RENDER_SHADOW_SMOOTH_RADIUS)) != null) {
            pFlame.getSolidRenderSettings().setShadowSmoothRadius(Double.parseDouble(hs));
        }
        if ((hs = atts.get(ATTR_SLD_RENDER_SHADOWMAP_SIZE)) != null) {
            pFlame.getSolidRenderSettings().setShadowmapSize(Integer.parseInt(hs));
        }
        if ((hs = atts.get(ATTR_SLD_RENDER_SHADOWMAP_BIAS)) != null) {
            pFlame.getSolidRenderSettings().setShadowmapBias(Double.parseDouble(hs));
        }
        if ((hs = atts.get(ATTR_POST_BOKEH_FILTER_KERNEL)) != null) {
            try {
                pFlame.getSolidRenderSettings().setPostBokehFilterKernel(FilterKernelType.valueOf(hs));
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        if ((hs = atts.get(ATTR_POST_BOKEH_INTENSITY)) != null) {
            pFlame.getSolidRenderSettings().setPostBokehIntensity(Double.parseDouble(hs));
        }
        if ((hs = atts.get(ATTR_POST_BOKEH_BRIGHTNESS)) != null) {
            pFlame.getSolidRenderSettings().setPostBokehBrightness(Double.parseDouble(hs));
        }
        if ((hs = atts.get(ATTR_POST_BOKEH_SIZE)) != null) {
            pFlame.getSolidRenderSettings().setPostBokehSize(Double.parseDouble(hs));
        }
        if ((hs = atts.get(ATTR_POST_BOKEH_ACTIVATION)) != null) {
            pFlame.getSolidRenderSettings().setPostBokehActivation(Double.parseDouble(hs));
        }
        if ((hs = atts.get(ATTR_SLD_RENDER_MATERIAL_COUNT)) != null) {
            int materialCount = Integer.parseInt(hs);
            pFlame.getSolidRenderSettings().getMaterials().clear();
            for (int i = 0; i < materialCount; i++) {
                MaterialSettings material = new MaterialSettings();
                pFlame.getSolidRenderSettings().getMaterials().add(material);
                if ((hs = atts.get(ATTR_SLD_RENDER_MATERIAL_DIFFUSE + i)) != null) {
                    material.setDiffuse(Double.parseDouble(hs));
                }
                if ((hs = atts.get(ATTR_SLD_RENDER_MATERIAL_AMBIENT + i)) != null) {
                    material.setAmbient(Double.parseDouble(hs));
                }
                if ((hs = atts.get(ATTR_SLD_RENDER_MATERIAL_PHONG + i)) != null) {
                    material.setPhong(Double.parseDouble(hs));
                }
                if ((hs = atts.get(ATTR_SLD_RENDER_MATERIAL_PHONG_SIZE + i)) != null) {
                    material.setPhongSize(Double.parseDouble(hs));
                }
                if ((hs = atts.get(ATTR_SLD_RENDER_MATERIAL_PHONG_RED + i)) != null) {
                    material.setPhongRed(Double.parseDouble(hs));
                }
                if ((hs = atts.get(ATTR_SLD_RENDER_MATERIAL_PHONG_GREEN + i)) != null) {
                    material.setPhongGreen(Double.parseDouble(hs));
                }
                if ((hs = atts.get(ATTR_SLD_RENDER_MATERIAL_PHONG_BLUE + i)) != null) {
                    material.setPhongBlue(Double.parseDouble(hs));
                }
                if ((hs = atts.get(ATTR_SLD_RENDER_MATERIAL_LIGHT_DIFF_FUNC + i)) != null) {
                    try {
                        material.setLightDiffFunc(LightDiffFuncPreset.valueOf(hs));
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
                if ((hs = atts.get(ATTR_SLD_RENDER_MATERIAL_REFL_MAP_INTENSITY + i)) != null) {
                    material.setReflMapIntensity(Double.parseDouble(hs));
                }
                if ((hs = atts.get(ATTR_SLD_RENDER_MATERIAL_REFL_MAP_FILENAME + i)) != null) {
                    material.setReflMapFilename(hs);
                }
                if ((hs = atts.get(ATTR_SLD_RENDER_MATERIAL_REFL_MAPPING + i)) != null) {
                    try {
                        material.setReflectionMapping(ReflectionMapping.valueOf(hs));
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
            }
        }
        if ((hs = atts.get(ATTR_SLD_RENDER_LIGHT_COUNT)) != null) {
            int lightCount = Integer.parseInt(hs);
            pFlame.getSolidRenderSettings().getLights().clear();
            for (int i = 0; i < lightCount; i++) {
                DistantLight light = new DistantLight();
                pFlame.getSolidRenderSettings().getLights().add(light);
                if ((hs = atts.get(ATTR_SLD_RENDER_LIGHT_ALTITUDE + i)) != null) {
                    light.setAltitude(Double.parseDouble(hs));
                }
                if ((hs = atts.get(ATTR_SLD_RENDER_LIGHT_AZIMUTH + i)) != null) {
                    light.setAzimuth(Double.parseDouble(hs));
                }
                if ((hs = atts.get(ATTR_SLD_RENDER_LIGHT_INTENSITY + i)) != null) {
                    light.setIntensity(Double.parseDouble(hs));
                }
                if ((hs = atts.get(ATTR_SLD_RENDER_LIGHT_SHADOW_INTENSITY + i)) != null) {
                    light.setShadowIntensity(Double.parseDouble(hs));
                }
                if ((hs = atts.get(ATTR_SLD_RENDER_LIGHT_RED + i)) != null) {
                    light.setRed(Double.parseDouble(hs));
                }
                if ((hs = atts.get(ATTR_SLD_RENDER_LIGHT_GREEN + i)) != null) {
                    light.setGreen(Double.parseDouble(hs));
                }
                if ((hs = atts.get(ATTR_SLD_RENDER_LIGHT_BLUE + i)) != null) {
                    light.setBlue(Double.parseDouble(hs));
                }
                if ((hs = atts.get(ATTR_SLD_RENDER_LIGHT_SHADOWS + i)) != null) {
                    light.setCastShadows(Integer.parseInt(hs) == 1);
                }
                {
                    MotionCurve curve = light.getAltitudeCurve();
                    String namePrefix = AbstractFlameReader.ATTR_SLD_RENDER_LIGHT_ALTITUDE + i + "_";
                    readMotionCurveAttributes(atts, curve, namePrefix);
                }
                {
                    MotionCurve curve = light.getAzimuthCurve();
                    String namePrefix = AbstractFlameReader.ATTR_SLD_RENDER_LIGHT_AZIMUTH + i + "_";
                    readMotionCurveAttributes(atts, curve, namePrefix);
                }
            }
        }
    }
    readMotionCurves(pFlame, atts, null);
    if ((hs = atts.get(ATTR_CHANNEL_MIXER_MODE)) != null) {
        try {
            pFlame.setChannelMixerMode(ChannelMixerMode.valueOf(hs));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    switch(pFlame.getChannelMixerMode()) {
        case BRIGHTNESS:
            readMotionCurveAttributes(atts, pFlame.getMixerRRCurve(), ATTR_CHANNEL_MIXER_RR_CURVE + "_");
            break;
        case RGB:
            readMotionCurveAttributes(atts, pFlame.getMixerRRCurve(), ATTR_CHANNEL_MIXER_RR_CURVE + "_");
            readMotionCurveAttributes(atts, pFlame.getMixerGGCurve(), ATTR_CHANNEL_MIXER_GG_CURVE + "_");
            readMotionCurveAttributes(atts, pFlame.getMixerBBCurve(), ATTR_CHANNEL_MIXER_BB_CURVE + "_");
            break;
        case FULL:
            readMotionCurveAttributes(atts, pFlame.getMixerRRCurve(), ATTR_CHANNEL_MIXER_RR_CURVE + "_");
            readMotionCurveAttributes(atts, pFlame.getMixerRGCurve(), ATTR_CHANNEL_MIXER_RG_CURVE + "_");
            readMotionCurveAttributes(atts, pFlame.getMixerRBCurve(), ATTR_CHANNEL_MIXER_RB_CURVE + "_");
            readMotionCurveAttributes(atts, pFlame.getMixerGRCurve(), ATTR_CHANNEL_MIXER_GR_CURVE + "_");
            readMotionCurveAttributes(atts, pFlame.getMixerGGCurve(), ATTR_CHANNEL_MIXER_GG_CURVE + "_");
            readMotionCurveAttributes(atts, pFlame.getMixerGBCurve(), ATTR_CHANNEL_MIXER_GB_CURVE + "_");
            readMotionCurveAttributes(atts, pFlame.getMixerBRCurve(), ATTR_CHANNEL_MIXER_BR_CURVE + "_");
            readMotionCurveAttributes(atts, pFlame.getMixerBGCurve(), ATTR_CHANNEL_MIXER_BG_CURVE + "_");
            readMotionCurveAttributes(atts, pFlame.getMixerBBCurve(), ATTR_CHANNEL_MIXER_BB_CURVE + "_");
            break;
        default:
            break;
    }
    return atts;
}
Also used : DOFBlurShape(org.jwildfire.create.tina.render.dof.DOFBlurShape) FilterKernelType(org.jwildfire.create.tina.render.filter.FilterKernelType) MaterialSettings(org.jwildfire.create.tina.base.solidrender.MaterialSettings) FilteringType(org.jwildfire.create.tina.render.filter.FilteringType) XMLAttributes(org.jwildfire.base.Tools.XMLAttributes) MotionCurve(org.jwildfire.create.tina.base.motion.MotionCurve) VariationFuncList(org.jwildfire.create.tina.variation.VariationFuncList) List(java.util.List) DistantLight(org.jwildfire.create.tina.base.solidrender.DistantLight)

Example 5 with XMLAttributes

use of org.jwildfire.base.Tools.XMLAttributes in project JWildfire by thargor6.

the class AbstractFlameReader method readColors.

protected void readColors(String flameXML, Layer layer) {
    // Colors
    {
        int p = 0;
        while (true) {
            int ps = flameXML.indexOf("<color ", p + 1);
            if (ps < 0)
                break;
            int pe = flameXML.indexOf("/>", ps + 1);
            String hs = flameXML.substring(ps + 7, pe);
            {
                int index = 0;
                int r = 0, g = 0, b = 0;
                XMLAttributes atts = Tools.parseAttributes(hs);
                String attr;
                if ((attr = atts.get(ATTR_INDEX)) != null) {
                    index = Integer.parseInt(attr);
                }
                if ((attr = atts.get(ATTR_RGB)) != null) {
                    String[] s = attr.split(" ");
                    r = Tools.FTOI(Double.parseDouble(s[0]));
                    g = Tools.FTOI(Double.parseDouble(s[1]));
                    b = Tools.FTOI(Double.parseDouble(s[2]));
                }
                layer.getPalette().setColor(index, r, g, b);
            }
            p = pe + 2;
        }
    }
    // Palette
    {
        int ps = flameXML.indexOf("<palette ");
        if (ps >= 0) {
            ps = flameXML.indexOf(">", ps + 1);
            int pe = flameXML.indexOf("</palette>", ps + 1);
            String hs = flameXML.substring(ps + 1, pe);
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < hs.length(); i++) {
                char c = hs.charAt(i);
                if ((c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9')) {
                    sb.append(c);
                } else if (c >= 'a' && c <= 'z') {
                    sb.append(Character.toUpperCase(c));
                }
            }
            hs = sb.toString();
            if ((hs.length() % 6) != 0)
                throw new RuntimeException("Invalid/unknown palette");
            int index = 0;
            for (int i = 0; i < hs.length(); i += 6) {
                int r = Integer.parseInt(hs.substring(i, i + 2), 16);
                int g = Integer.parseInt(hs.substring(i + 2, i + 4), 16);
                int b = Integer.parseInt(hs.substring(i + 4, i + 6), 16);
                // System.out.println(hs.substring(i, i + 2) + "#" + hs.substring(i + 2, i + 4) + "#" + hs.substring(i + 4, i + 6));
                // System.out.println("  flame->palette->setColor(" + index + "," + r + "," + g + "," + b + ");");
                layer.getPalette().setColor(index++, r, g, b);
            }
        }
    }
}
Also used : XMLAttributes(org.jwildfire.base.Tools.XMLAttributes)

Aggregations

XMLAttributes (org.jwildfire.base.Tools.XMLAttributes)8 ArrayList (java.util.ArrayList)2 List (java.util.List)2 Flame (org.jwildfire.create.tina.base.Flame)2 Layer (org.jwildfire.create.tina.base.Layer)2 MotionCurve (org.jwildfire.create.tina.base.motion.MotionCurve)2 VariationFuncList (org.jwildfire.create.tina.variation.VariationFuncList)2 Map (java.util.Map)1 XMLAttribute (org.jwildfire.base.Tools.XMLAttribute)1 GlobalScript (org.jwildfire.create.tina.animate.GlobalScript)1 XFormScript (org.jwildfire.create.tina.animate.XFormScript)1 DistantLight (org.jwildfire.create.tina.base.solidrender.DistantLight)1 MaterialSettings (org.jwildfire.create.tina.base.solidrender.MaterialSettings)1 DOFBlurShape (org.jwildfire.create.tina.render.dof.DOFBlurShape)1 FilterKernelType (org.jwildfire.create.tina.render.filter.FilterKernelType)1 FilteringType (org.jwildfire.create.tina.render.filter.FilteringType)1 Variation (org.jwildfire.create.tina.variation.Variation)1 VariationFunc (org.jwildfire.create.tina.variation.VariationFunc)1