Search in sources :

Example 1 with AnchorActor

use of com.bladecoder.engine.model.AnchorActor in project bladecoder-adventure-engine by bladecoder.

the class DefaultSceneScreen method drawDebugText.

private void drawDebugText(SpriteBatch batch) {
    World w = World.getInstance();
    w.getSceneCamera().getInputUnProject(viewport, unprojectTmp);
    Color color;
    sbTmp.setLength(0);
    if (EngineLogger.lastError != null) {
        sbTmp.append(EngineLogger.lastError);
        color = Color.RED;
    } else {
        // sbTmp.append("( ");
        // sbTmp.append((int) unprojectTmp.x);
        // sbTmp.append(", ");
        // sbTmp.append((int) unprojectTmp.y);
        // sbTmp.append(") FPS:");
        // sbTmp.append(Gdx.graphics.getFramesPerSecond());
        // sbTmp.append(" Density:");
        // sbTmp.append(Gdx.graphics.getDensity());
        // sbTmp.append(" UI Multiplier:");
        // sbTmp.append(DPIUtils.getSizeMultiplier());
        sbTmp.append(" ");
        sbTmp.append(state.toString());
        sbTmp.append(' ');
        long millis = w.getTimeOfGame();
        long second = (millis / 1000) % 60;
        long minute = (millis / (1000 * 60)) % 60;
        long hour = (millis / (1000 * 60 * 60));
        String time = String.format("%02d:%02d:%02d", hour, minute, second);
        sbTmp.append(time);
        // if (w.getCurrentScene().getPlayer() != null) {
        // sbTmp.append(" Depth Scl: ");
        // sbTmp.append(w.getCurrentScene().getFakeDepthScale(unprojectTmp.y));
        // }
        color = Color.WHITE;
    }
    String strDebug = sbTmp.toString();
    textLayout.setText(ui.getSkin().getFont("debug"), strDebug, color, viewport.getScreenWidth(), Align.left, true);
    RectangleRenderer.draw(batch, 0, viewport.getScreenHeight() - textLayout.height - 10, textLayout.width, textLayout.height + 10, Color.BLACK);
    ui.getSkin().getFont("debug").draw(batch, textLayout, 0, viewport.getScreenHeight() - 5);
    // Draw actor states when debug
    if (EngineLogger.getDebugLevel() == EngineLogger.DEBUG1) {
        for (BaseActor a : w.getCurrentScene().getActors().values()) {
            if (a instanceof AnchorActor)
                continue;
            Rectangle r = a.getBBox().getBoundingRectangle();
            sbTmp.setLength(0);
            sbTmp.append(a.getId());
            if (a instanceof InteractiveActor && ((InteractiveActor) a).getState() != null)
                sbTmp.append(".").append(((InteractiveActor) a).getState());
            unprojectTmp.set(r.getX(), r.getY(), 0);
            w.getSceneCamera().scene2screen(viewport, unprojectTmp);
            ui.getSkin().getFont("debug").draw(batch, sbTmp.toString(), unprojectTmp.x, unprojectTmp.y);
        }
    }
}
Also used : AnchorActor(com.bladecoder.engine.model.AnchorActor) Color(com.badlogic.gdx.graphics.Color) InteractiveActor(com.bladecoder.engine.model.InteractiveActor) Rectangle(com.badlogic.gdx.math.Rectangle) BaseActor(com.bladecoder.engine.model.BaseActor) World(com.bladecoder.engine.model.World)

Example 2 with AnchorActor

use of com.bladecoder.engine.model.AnchorActor in project bladecoder-adventure-engine by bladecoder.

the class EditActorDialog method modelToInputs.

@Override
protected void modelToInputs() {
    id.setText(e.getId());
    visible.setText(Boolean.toString(e.isVisible()));
    pos.setText(Param.toStringParam(new Vector2(e.getX(), e.getY())));
    if (e instanceof InteractiveActor) {
        InteractiveActor ia = (InteractiveActor) e;
        layer.setText(ia.getLayer());
        interaction.setText(Boolean.toString(ia.getInteraction()));
        refPoint.setText(Param.toStringParam(ia.getRefPoint()));
        desc.setText(Ctx.project.translate(ia.getDesc()));
        state.setText(ia.getState());
        zIndex.setText(Float.toString(ia.getZIndex()));
        if (e instanceof SpriteActor) {
            SpriteActor sa = (SpriteActor) e;
            ActorRenderer r = sa.getRenderer();
            if (r instanceof AtlasRenderer) {
                renderer.setText(Project.ATLAS_RENDERER_STRING);
            } else if (r instanceof ImageRenderer) {
                renderer.setText(Project.IMAGE_RENDERER_STRING);
            } else if (r instanceof Sprite3DRenderer) {
                renderer.setText(Project.S3D_RENDERER_STRING);
                Sprite3DRenderer s3d = (Sprite3DRenderer) r;
                fov.setText(Float.toString(s3d.getCameraFOV()));
                cameraName.setText(s3d.getCameraName());
                spriteSize.setText(Param.toStringParam(s3d.getSpriteSize()));
            } else if (r instanceof ParticleRenderer) {
                renderer.setText(Project.PARTICLE_RENDERER_STRING);
                ParticleRenderer pr = (ParticleRenderer) r;
                particleName.setText(pr.getParticleName());
                particleAtlas.setText(pr.getAtlasName());
            } else if (r instanceof TextRenderer) {
                renderer.setText(Project.TEXT_RENDERER_STRING);
                TextRenderer tr = (TextRenderer) r;
                text.setText(Ctx.project.translate(tr.getText()));
                size.setText(Integer.toString(tr.getFontSize()));
                font.setText(tr.getFontName());
                borderWidth.setText(Integer.toString(tr.getBorderWidth()));
                textAlign.setText(AlignUtils.getAlign(tr.getAlign()));
                borderColor.setText(tr.getBorderColor().toString());
                borderStraight.setText(Boolean.toString(tr.isBorderStraight()));
                shadowOffsetX.setText(Integer.toString(tr.getShadowOffsetX()));
                shadowOffsetY.setText(Integer.toString(tr.getShadowOffsetY()));
                shadowColor.setText(tr.getShadowColor().toString());
            } else if (r instanceof SpineRenderer) {
                renderer.setText(Project.SPINE_RENDERER_STRING);
                spineSkin.setText(((SpineRenderer) r).getSkin());
            }
            fakeDepth.setText(Boolean.toString(sa.getFakeDepth()));
            scale.setText(Float.toString(sa.getScale()));
            rot.setText(Float.toString(sa.getRot()));
            tint.setText(sa.getTint() == null ? null : sa.getTint().toString());
            bboxFromRenderer.setText(Boolean.toString(sa.isBboxFromRenderer()));
            orgAlign.setText(AlignUtils.getAlign(sa.getRenderer().getOrgAlign()));
            if (e instanceof CharacterActor) {
                CharacterActor ca = (CharacterActor) e;
                walkingSpeed.setText(Float.toString(ca.getWalkingSpeed()));
                textColor.setText(ca.getTextColor() == null ? null : ca.getTextColor().toString());
                textStyle.setText(ca.getTextStyle());
                typePanel.setText(CHARACTER_TYPE_STR);
            } else {
                typePanel.setText(SPRITE_TYPE_STR);
            }
        } else {
            typePanel.setText(BACKGROUND_TYPE_STR);
        }
    } else if (e instanceof AnchorActor) {
        typePanel.setText(ANCHOR_TYPE_STR);
    } else if (e instanceof ObstacleActor) {
        typePanel.setText(OBSTACLE_TYPE_STR);
    }
}
Also used : AtlasRenderer(com.bladecoder.engine.model.AtlasRenderer) InteractiveActor(com.bladecoder.engine.model.InteractiveActor) ParticleRenderer(com.bladecoder.engine.model.ParticleRenderer) SpineRenderer(com.bladecoder.engine.spine.SpineRenderer) CharacterActor(com.bladecoder.engine.model.CharacterActor) AnchorActor(com.bladecoder.engine.model.AnchorActor) ImageRenderer(com.bladecoder.engine.model.ImageRenderer) Vector2(com.badlogic.gdx.math.Vector2) ObstacleActor(com.bladecoder.engine.model.ObstacleActor) Sprite3DRenderer(com.bladecoder.engine.model.Sprite3DRenderer) SpriteActor(com.bladecoder.engine.model.SpriteActor) ActorRenderer(com.bladecoder.engine.model.ActorRenderer) TextRenderer(com.bladecoder.engine.model.TextRenderer)

Example 3 with AnchorActor

use of com.bladecoder.engine.model.AnchorActor in project bladecoder-adventure-engine by bladecoder.

the class EditActorDialog method inputsToModel.

@Override
protected void inputsToModel(boolean create) {
    String type = typePanel.getText();
    boolean typeChanged = false;
    BaseActor oldElement = e;
    String oldId = null;
    boolean isPlayer = false;
    if (!create) {
        typeChanged = (type.equals(CHARACTER_TYPE_STR) && !(e instanceof CharacterActor)) || (type.equals(SPRITE_TYPE_STR) && (!(e instanceof SpriteActor) || e instanceof CharacterActor)) || (type.equals(BACKGROUND_TYPE_STR) && (!(e instanceof InteractiveActor) || e instanceof SpriteActor)) || (type.equals(OBSTACLE_TYPE_STR) && !(e instanceof ObstacleActor)) || (type.equals(ANCHOR_TYPE_STR) && !(e instanceof AnchorActor));
        isPlayer = parent.getPlayer() == e;
        // remove to allow id, zindex and layer change
        parent.removeActor(e);
        oldId = e.getId();
    }
    if (create || typeChanged) {
        if (type.equals(BACKGROUND_TYPE_STR)) {
            e = new InteractiveActor();
        } else if (type.equals(SPRITE_TYPE_STR)) {
            e = new SpriteActor();
        } else if (type.equals(CHARACTER_TYPE_STR)) {
            e = new CharacterActor();
        } else if (type.equals(OBSTACLE_TYPE_STR)) {
            e = new ObstacleActor();
        } else if (type.equals(ANCHOR_TYPE_STR)) {
            e = new AnchorActor();
        }
        if (!(e instanceof SpriteActor) && !(e instanceof AnchorActor)) {
            Polygon bbox = e.getBBox();
            bbox.setVertices(new float[8]);
            float[] verts = bbox.getVertices();
            verts[0] = -DEFAULT_DIM / 2;
            verts[1] = 0f;
            verts[2] = -DEFAULT_DIM / 2;
            verts[3] = DEFAULT_DIM;
            verts[4] = DEFAULT_DIM / 2;
            verts[5] = DEFAULT_DIM;
            verts[6] = DEFAULT_DIM / 2;
            verts[7] = 0f;
            bbox.dirty();
        }
    }
    if (typeChanged) {
        if (oldElement instanceof InteractiveActor && e instanceof InteractiveActor) {
            HashMap<String, Verb> verbs = ((InteractiveActor) e).getVerbManager().getVerbs();
            HashMap<String, Verb> oldVerbs = ((InteractiveActor) oldElement).getVerbManager().getVerbs();
            for (String k : oldVerbs.keySet()) {
                Verb v = oldVerbs.get(k);
                verbs.put(k, v);
            }
        }
        if (oldElement instanceof SpriteActor && e instanceof SpriteActor) {
            ((SpriteActor) e).setRenderer(((SpriteActor) oldElement).getRenderer());
        }
    }
    e.setId(ElementUtils.getCheckedId(id.getText(), parent.getActors().keySet().toArray(new String[0])));
    e.setVisible(Boolean.parseBoolean(visible.getText()));
    Vector2 p = Param.parseVector2(pos.getText());
    e.setPosition(p.x, p.y);
    if (e instanceof InteractiveActor) {
        InteractiveActor ia = (InteractiveActor) e;
        ia.setLayer(layer.getText());
        ia.setInteraction(Boolean.parseBoolean(interaction.getText()));
        Vector2 rp = Param.parseVector2(refPoint.getText());
        ia.setRefPoint(rp.x, rp.y);
        String key = ia.getDesc();
        if (key == null || key.isEmpty() || key.charAt(0) != I18N.PREFIX || !e.getId().equals(oldId))
            key = Ctx.project.getI18N().genKey(parent.getId(), e.getId(), "desc");
        Ctx.project.getI18N().setTranslation(key, desc.getText());
        if (desc.getText() != null)
            ia.setDesc(key);
        else
            ia.setDesc(null);
        ia.setState(state.getText());
        ia.setZIndex(Float.parseFloat(zIndex.getText()));
        if (e instanceof SpriteActor) {
            SpriteActor sa = (SpriteActor) e;
            String rendererType = renderer.getText();
            if (Project.ATLAS_RENDERER_STRING.equals(rendererType)) {
                if (sa.getRenderer() == null || !(sa.getRenderer() instanceof AtlasRenderer))
                    sa.setRenderer(new AtlasRenderer());
            } else if (Project.IMAGE_RENDERER_STRING.equals(rendererType)) {
                if (sa.getRenderer() == null || !(sa.getRenderer() instanceof ImageRenderer))
                    sa.setRenderer(new ImageRenderer());
            } else if (Project.S3D_RENDERER_STRING.equals(rendererType)) {
                Sprite3DRenderer r;
                if (sa.getRenderer() == null || !(sa.getRenderer() instanceof Sprite3DRenderer)) {
                    r = new Sprite3DRenderer();
                    sa.setRenderer(r);
                } else {
                    r = (Sprite3DRenderer) sa.getRenderer();
                }
                r.setCameraFOV(Float.parseFloat(fov.getText()));
                r.setCameraName(cameraName.getText());
                r.setSpriteSize(Param.parseVector2(spriteSize.getText()));
            } else if (Project.PARTICLE_RENDERER_STRING.equals(rendererType)) {
                ParticleRenderer r;
                if (sa.getRenderer() == null || !(sa.getRenderer() instanceof ParticleRenderer)) {
                    r = new ParticleRenderer();
                    sa.setRenderer(r);
                } else {
                    r = (ParticleRenderer) sa.getRenderer();
                }
                r.setParticleName(particleName.getText());
                r.setAtlasName(particleAtlas.getText());
            } else if (Project.TEXT_RENDERER_STRING.equals(rendererType)) {
                TextRenderer r;
                if (sa.getRenderer() == null || !(sa.getRenderer() instanceof TextRenderer)) {
                    r = new TextRenderer();
                    sa.setRenderer(r);
                } else {
                    r = (TextRenderer) sa.getRenderer();
                }
                key = text.getText();
                if (key == null || key.isEmpty() || key.charAt(0) != I18N.PREFIX || !e.getId().equals(oldId))
                    key = Ctx.project.getI18N().genKey(parent.getId(), e.getId(), "text");
                Ctx.project.getI18N().setTranslation(key, text.getText());
                if (text.getText() != null)
                    r.setText(key, text.getText());
                else
                    r.setText(null, null);
                r.setFontSize(Integer.parseInt(size.getText()));
                r.setFontName(font.getText());
                r.setAlign(AlignUtils.getAlign(textAlign.getText()));
                r.setBorderWidth(Integer.parseInt(borderWidth.getText()));
                r.setBorderColor(Param.parseColor(borderColor.getText()));
                r.setBorderStraight(Boolean.parseBoolean(borderStraight.getText()));
                r.setShadowOffsetX(Integer.parseInt(shadowOffsetX.getText()));
                r.setShadowOffsetY(Integer.parseInt(shadowOffsetY.getText()));
                r.setShadowColor(Param.parseColor(shadowColor.getText()));
                // dispose to force reload the text attributes
                sa.dispose();
            } else if (Project.SPINE_RENDERER_STRING.equals(rendererType)) {
                SpineRenderer r;
                if (sa.getRenderer() == null || !(sa.getRenderer() instanceof SpineRenderer)) {
                    r = new SpineRenderer();
                    sa.setRenderer(r);
                } else {
                    r = (SpineRenderer) sa.getRenderer();
                }
                r.setSkin(spineSkin.getText());
            }
            boolean bbfr = Boolean.parseBoolean(bboxFromRenderer.getText());
            if (bbfr != sa.isBboxFromRenderer())
                sa.setBboxFromRenderer(bbfr);
            sa.setFakeDepth(Boolean.parseBoolean(fakeDepth.getText()));
            sa.setScale(Float.parseFloat(scale.getText()));
            sa.setRot(Float.parseFloat(rot.getText()));
            sa.getRenderer().setOrgAlign(AlignUtils.getAlign(orgAlign.getText()));
            sa.setTint(Param.parseColor(tint.getText()));
            if (e instanceof CharacterActor) {
                CharacterActor ca = (CharacterActor) e;
                ca.setWalkingSpeed(Float.parseFloat(walkingSpeed.getText()));
                ca.setTextColor(Param.parseColor(textColor.getText()));
                ca.setTextStyle(textStyle.getText());
            }
        }
    }
    parent.addActor(e);
    if (isPlayer && !typeChanged)
        parent.setPlayer((CharacterActor) e);
    if (e instanceof InteractiveActor) {
        SceneLayer l = parent.getLayer(((InteractiveActor) e).getLayer());
        l.orderByZIndex();
    }
    if (e instanceof SpriteActor)
        ((SpriteActor) e).retrieveAssets();
    // TODO UNDO OP
    // UndoOp undoOp = new UndoAddElement(doc, e);
    // Ctx.project.getUndoStack().add(undoOp);
    Ctx.project.setModified();
}
Also used : AtlasRenderer(com.bladecoder.engine.model.AtlasRenderer) SceneLayer(com.bladecoder.engine.model.SceneLayer) InteractiveActor(com.bladecoder.engine.model.InteractiveActor) ParticleRenderer(com.bladecoder.engine.model.ParticleRenderer) SpineRenderer(com.bladecoder.engine.spine.SpineRenderer) CharacterActor(com.bladecoder.engine.model.CharacterActor) AnchorActor(com.bladecoder.engine.model.AnchorActor) ImageRenderer(com.bladecoder.engine.model.ImageRenderer) ObstacleActor(com.bladecoder.engine.model.ObstacleActor) Vector2(com.badlogic.gdx.math.Vector2) Verb(com.bladecoder.engine.model.Verb) Sprite3DRenderer(com.bladecoder.engine.model.Sprite3DRenderer) BaseActor(com.bladecoder.engine.model.BaseActor) SpriteActor(com.bladecoder.engine.model.SpriteActor) Polygon(com.badlogic.gdx.math.Polygon) TextRenderer(com.bladecoder.engine.model.TextRenderer)

Example 4 with AnchorActor

use of com.bladecoder.engine.model.AnchorActor in project bladecoder-adventure-engine by bladecoder.

the class CanvasDrawer method drawBBoxActors.

public void drawBBoxActors(Scene scn) {
    drawer.setProjectionMatrix(camera.combined);
    drawer.setTransformMatrix(new Matrix4());
    drawer.begin(ShapeType.Line);
    for (BaseActor a : scn.getActors().values()) {
        Polygon p = a.getBBox();
        if (p == null) {
            EditorLogger.error("ERROR DRAWING BBOX FOR: " + a.getId());
        }
        if (a instanceof ObstacleActor) {
            drawer.setColor(Scene.OBSTACLE_COLOR);
            drawer.polygon(p.getTransformedVertices());
        } else if (a instanceof InteractiveActor) {
            InteractiveActor iActor = (InteractiveActor) a;
            if (!scn.getLayer(iActor.getLayer()).isVisible())
                continue;
            drawer.setColor(Scene.ACTOR_BBOX_COLOR);
            if (p.getTransformedVertices().length > 2)
                drawer.polygon(p.getTransformedVertices());
        } else if (a instanceof AnchorActor) {
            drawer.setColor(Scene.ANCHOR_COLOR);
            drawer.line(p.getX() - Scene.ANCHOR_RADIUS, p.getY(), p.getX() + Scene.ANCHOR_RADIUS, p.getY());
            drawer.line(p.getX(), p.getY() - Scene.ANCHOR_RADIUS, p.getX(), p.getY() + Scene.ANCHOR_RADIUS);
        }
    // drawer.rect(r.getX(), r.getY(), r.getWidth(), r.getHeight());
    }
    drawer.end();
}
Also used : AnchorActor(com.bladecoder.engine.model.AnchorActor) ObstacleActor(com.bladecoder.engine.model.ObstacleActor) InteractiveActor(com.bladecoder.engine.model.InteractiveActor) BaseActor(com.bladecoder.engine.model.BaseActor) Polygon(com.badlogic.gdx.math.Polygon) Matrix4(com.badlogic.gdx.math.Matrix4)

Example 5 with AnchorActor

use of com.bladecoder.engine.model.AnchorActor in project bladecoder-adventure-engine by bladecoder.

the class CanvasDrawer method drawSelectedActor.

public void drawSelectedActor(BaseActor selectedActor) {
    // Gdx.gl20.glLineWidth(3);
    Gdx.gl20.glEnable(GL20.GL_BLEND);
    // Gdx.gl20.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
    drawer.setProjectionMatrix(camera.combined);
    if (selectedActor instanceof AnchorActor) {
        drawer.begin(ShapeRenderer.ShapeType.Line);
        drawer.setColor(MOUSESELECTION_STROKE_COLOR);
        drawer.rect(selectedActor.getX() - Scene.ANCHOR_RADIUS, selectedActor.getY() - Scene.ANCHOR_RADIUS, Scene.ANCHOR_RADIUS * 2, Scene.ANCHOR_RADIUS * 2);
        drawer.end();
    } else {
        Polygon p = selectedActor.getBBox();
        Rectangle rect = p.getBoundingRectangle();
        drawer.begin(ShapeRenderer.ShapeType.Filled);
        drawer.setColor(MOUSESELECTION_FILL_COLOR);
        drawer.rect(rect.x, rect.y, rect.width, rect.height);
        drawer.end();
        drawer.begin(ShapeRenderer.ShapeType.Line);
        drawer.setColor(MOUSESELECTION_STROKE_COLOR);
        drawer.rect(rect.x, rect.y, rect.width, rect.height);
        // DRAW SELECTION BOUNDS
        if ((!(selectedActor instanceof SpriteActor) || !((SpriteActor) selectedActor).isBboxFromRenderer()) && !(selectedActor instanceof AnchorActor)) {
            float[] verts = selectedActor.getBBox().getTransformedVertices();
            for (int i = 0; i < verts.length; i += 2) drawer.rect(verts[i] - CORNER_DIST / 2, verts[i + 1] - CORNER_DIST / 2, CORNER_DIST, CORNER_DIST);
        }
        // DRAW REFPOINT
        if (selectedActor instanceof InteractiveActor) {
            Vector2 refPoint = ((InteractiveActor) selectedActor).getRefPoint();
            float orgX = selectedActor.getX() + refPoint.x;
            float orgY = selectedActor.getY() + refPoint.y;
            drawer.line(orgX - Scene.ANCHOR_RADIUS, orgY, orgX + Scene.ANCHOR_RADIUS, orgY);
            drawer.line(orgX, orgY - Scene.ANCHOR_RADIUS, orgX, orgY + Scene.ANCHOR_RADIUS);
        }
        drawer.end();
    }
}
Also used : AnchorActor(com.bladecoder.engine.model.AnchorActor) Vector2(com.badlogic.gdx.math.Vector2) InteractiveActor(com.bladecoder.engine.model.InteractiveActor) Rectangle(com.badlogic.gdx.math.Rectangle) SpriteActor(com.bladecoder.engine.model.SpriteActor) Polygon(com.badlogic.gdx.math.Polygon)

Aggregations

AnchorActor (com.bladecoder.engine.model.AnchorActor)7 InteractiveActor (com.bladecoder.engine.model.InteractiveActor)6 Polygon (com.badlogic.gdx.math.Polygon)5 Vector2 (com.badlogic.gdx.math.Vector2)5 SpriteActor (com.bladecoder.engine.model.SpriteActor)5 BaseActor (com.bladecoder.engine.model.BaseActor)4 ObstacleActor (com.bladecoder.engine.model.ObstacleActor)3 Rectangle (com.badlogic.gdx.math.Rectangle)2 AtlasRenderer (com.bladecoder.engine.model.AtlasRenderer)2 CharacterActor (com.bladecoder.engine.model.CharacterActor)2 ImageRenderer (com.bladecoder.engine.model.ImageRenderer)2 ParticleRenderer (com.bladecoder.engine.model.ParticleRenderer)2 Scene (com.bladecoder.engine.model.Scene)2 Sprite3DRenderer (com.bladecoder.engine.model.Sprite3DRenderer)2 TextRenderer (com.bladecoder.engine.model.TextRenderer)2 SpineRenderer (com.bladecoder.engine.spine.SpineRenderer)2 Color (com.badlogic.gdx.graphics.Color)1 Matrix4 (com.badlogic.gdx.math.Matrix4)1 ActorRenderer (com.bladecoder.engine.model.ActorRenderer)1 SceneLayer (com.bladecoder.engine.model.SceneLayer)1