X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=plugins%2Fnet.mograsim.logic.model%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fmodel%2Fmodel%2Fcomponents%2Fsubmodels%2FSubmodelComponent.java;h=35921284ff79898a33679e14b94d4678bc23636e;hb=HEAD;hp=9388e2fb09fdc7e51ba8370f1b2c76e5700397f3;hpb=7d05144c25daa53e60fc9ed9fd503546a86567f8;p=Mograsim.git diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelComponent.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelComponent.java index 9388e2fb..35921284 100644 --- a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelComponent.java +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelComponent.java @@ -1,5 +1,9 @@ package net.mograsim.logic.model.model.components.submodels; +import static net.mograsim.logic.model.preferences.RenderPreferences.DEFAULT_LINE_WIDTH; +import static net.mograsim.logic.model.preferences.RenderPreferences.SUBMODEL_ZOOM_ALPHA_0; +import static net.mograsim.logic.model.preferences.RenderPreferences.SUBMODEL_ZOOM_ALPHA_1; + import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -17,13 +21,13 @@ import net.mograsim.logic.model.model.components.ModelComponent; import net.mograsim.logic.model.model.wires.MovablePin; import net.mograsim.logic.model.model.wires.Pin; import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.preferences.RenderPreferences; import net.mograsim.logic.model.serializing.IdentifyParams; import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; import net.mograsim.logic.model.serializing.SubmodelComponentParams; import net.mograsim.logic.model.serializing.SubmodelComponentSerializer; import net.mograsim.logic.model.snippets.Renderer; import net.mograsim.logic.model.util.JsonHandler; -import net.mograsim.preferences.Preferences; /** * A {@link ModelComponent} consisting of another model. A SubmodelComponent can have so-called "interface pins" connecting the @@ -68,26 +72,14 @@ public abstract class SubmodelComponent extends ModelComponent * A pseudo-component containing all submodel interface pins on the submodel side. */ private final SubmodelInterface submodelInterface; - /** * The factor by which the submodel is scaled when rendering. */ private double submodelScale; - /** - * If this {@link SubmodelComponent} fills at least this amount of the visible region vertically or horizontally, the submodel starts to - * be visible. - */ - private double maxVisibleRegionFillRatioForAlpha0; - /** - * If this {@link SubmodelComponent} fills at least this amount of the visible region vertically or horizontally, the submodel is fully - * visible. - */ - private double minVisibleRegionFillRatioForAlpha1; /** * The renderer used for rendering the submodel. */ private final LogicUIRenderer renderer; - /** * The {@link Renderer} used to render the symbol of this SubmodelCoponent. */ @@ -118,8 +110,6 @@ public abstract class SubmodelComponent extends ModelComponent this.submodelInterface = new SubmodelInterface(submodelModifiable); this.submodelScale = 1; - this.maxVisibleRegionFillRatioForAlpha0 = 0.8; - this.minVisibleRegionFillRatioForAlpha1 = 0.9; this.renderer = new LogicUIRenderer(submodelModifiable); Consumer redrawHandlerChangedListener = submodelModifiable::setRedrawHandler; @@ -152,21 +142,7 @@ public abstract class SubmodelComponent extends ModelComponent String name = supermodelPin.name; // TODO if we upgrade to Java 12, replace with switch-expression - PinUsage submodelPinUsage; - switch (supermodelPin.usage) - { - case INPUT: - submodelPinUsage = PinUsage.OUTPUT; - break; - case OUTPUT: - submodelPinUsage = PinUsage.INPUT; - break; - case TRISTATE: - submodelPinUsage = PinUsage.TRISTATE; - break; - default: - throw new IllegalArgumentException("Unknown enum constant: " + supermodelPin.usage); - } + PinUsage submodelPinUsage = supermodelPin.usage.getOpposite(); MovablePin submodelPin = new MovablePin(submodelModifiable, submodelInterface, name, supermodelPin.logicWidth, submodelPinUsage, supermodelPin.getRelX() / submodelScale, supermodelPin.getRelY() / submodelScale); @@ -371,12 +347,24 @@ public abstract class SubmodelComponent extends ModelComponent } @Override - public void render(GeneralGC gc, Rectangle visibleRegion) + public void render(GeneralGC gc, RenderPreferences renderPrefs, Rectangle visibleRegion) { GCConfig conf = new GCConfig(gc); GeneralGC tgc = new TranslatedGC(gc, getPosX(), getPosY(), submodelScale, true); conf.reset(tgc); - double visibleRegionFillRatio = Math.max(getWidth() / visibleRegion.width, getHeight() / visibleRegion.height); + double visibleRegionFillRatio = getWidth() * getHeight() / (visibleRegion.width * visibleRegion.height); + /** + * If this {@link SubmodelComponent} fills at least this amount of the visible region vertically or horizontally, the submodel + * starts to be visible. + */ + // TODO add a listener + double maxVisibleRegionFillRatioForAlpha0 = renderPrefs.getDouble(SUBMODEL_ZOOM_ALPHA_0); + /** + * If this {@link SubmodelComponent} fills at least this amount of the visible region vertically or horizontally, the submodel is + * fully visible. + */ + // TODO add a listener + double minVisibleRegionFillRatioForAlpha1 = renderPrefs.getDouble(SUBMODEL_ZOOM_ALPHA_1); double alphaFactor = map(visibleRegionFillRatio, maxVisibleRegionFillRatioForAlpha0, minVisibleRegionFillRatioForAlpha1, 0, 1); alphaFactor = Math.max(0, Math.min(1, alphaFactor)); // we need to take the old alpha into account to support nested submodules better. @@ -386,18 +374,19 @@ public abstract class SubmodelComponent extends ModelComponent if (submodelAlpha != 0) { gc.setAlpha(submodelAlpha); - renderer.render(tgc, visibleRegion.translate(getPosX() / submodelScale, getPosY() / submodelScale, 1 / submodelScale)); + renderer.render(tgc, renderPrefs, + visibleRegion.translate(getPosX() / submodelScale, getPosY() / submodelScale, 1 / submodelScale)); } if (labelAlpha != 0) { gc.setAlpha(labelAlpha); - renderSymbol(gc, visibleRegion); + renderSymbol(gc, renderPrefs, visibleRegion); } conf.reset(gc); // reset line width explicitly to avoid rounding errors causing weird glitches - gc.setLineWidth(Preferences.current().getDouble("net.mograsim.logic.model.linewidth.default")); + gc.setLineWidth(renderPrefs.getDouble(DEFAULT_LINE_WIDTH)); // draw the outline after all other operations to make interface pins look better - renderOutline(gc, visibleRegion); + renderOutline(gc, renderPrefs, visibleRegion); } /** @@ -405,10 +394,10 @@ public abstract class SubmodelComponent extends ModelComponent * * @author Daniel Kirschten */ - protected void renderSymbol(GeneralGC gc, Rectangle visibleRegion) + private void renderSymbol(GeneralGC gc, RenderPreferences renderPrefs, Rectangle visibleRegion) { if (symbolRenderer != null) - symbolRenderer.render(gc, visibleRegion); + symbolRenderer.render(gc, renderPrefs, visibleRegion); } /** @@ -416,10 +405,10 @@ public abstract class SubmodelComponent extends ModelComponent * * @author Daniel Kirschten */ - protected void renderOutline(GeneralGC gc, Rectangle visibleRegion) + private void renderOutline(GeneralGC gc, RenderPreferences renderPrefs, Rectangle visibleRegion) { if (outlineRenderer != null) - outlineRenderer.render(gc, visibleRegion); + outlineRenderer.render(gc, renderPrefs, visibleRegion); } private static double map(double val, double valMin, double valMax, double mapMin, double mapMax)