private void autoSelectTechnique(RenderManager rm) { if (technique == null) { selectTechnique("Default", rm); } else { technique.makeCurrent(def.getAssetManager(), false, rm.getRenderer().getCaps()); } }
/** * Select the technique to use for rendering this material. * * <p>If <code>name</code> is "Default", then one of the {@link MaterialDef#getDefaultTechniques() * default techniques} on the material will be selected. Otherwise, the named technique will be * found in the material definition. * * <p>Any candidate technique for selection (either default or named) must be verified to be * compatible with the system, for that, the <code>renderManager</code> is queried for * capabilities. * * @param name The name of the technique to select, pass "Default" to select one of the default * techniques. * @param renderManager The {@link RenderManager render manager} to query for capabilities. * @throws IllegalArgumentException If "Default" is passed and no default techniques are available * on the material definition, or if a name is passed but there's no technique by that name. * @throws UnsupportedOperationException If no candidate technique supports the system * capabilities. */ public void selectTechnique(String name, RenderManager renderManager) { // check if already created Technique tech = techniques.get(name); // When choosing technique, we choose one that // supports all the caps. EnumSet<Caps> rendererCaps = renderManager.getRenderer().getCaps(); if (tech == null) { if (name.equals("Default")) { List<TechniqueDef> techDefs = def.getDefaultTechniques(); if (techDefs == null || techDefs.isEmpty()) { throw new IllegalArgumentException( "No default techniques are available on material '" + def.getName() + "'"); } TechniqueDef lastTech = null; for (TechniqueDef techDef : techDefs) { if (rendererCaps.containsAll(techDef.getRequiredCaps())) { // use the first one that supports all the caps tech = new Technique(this, techDef); techniques.put(name, tech); break; } lastTech = techDef; } if (tech == null) { throw new UnsupportedOperationException( "No default technique on material '" + def.getName() + "'\n" + " is supported by the video hardware. The caps " + lastTech.getRequiredCaps() + " are required."); } } else { // create "special" technique instance TechniqueDef techDef = def.getTechniqueDef(name); if (techDef == null) { throw new IllegalArgumentException( "For material " + def.getName() + ", technique not found: " + name); } if (!rendererCaps.containsAll(techDef.getRequiredCaps())) { throw new UnsupportedOperationException( "The explicitly chosen technique '" + name + "' on material '" + def.getName() + "'\n" + "requires caps " + techDef.getRequiredCaps() + " which are not " + "supported by the video renderer"); } tech = new Technique(this, techDef); techniques.put(name, tech); } } else if (technique == tech) { // attempting to switch to an already // active technique. return; } technique = tech; tech.makeCurrent(def.getAssetManager(), true, rendererCaps); // shader was changed sortingId = -1; }