java类com.badlogic.gdx.graphics.GL30的实例源码

HelpScreen.java 文件源码 项目:Space-Bombs 阅读 24 收藏 0 点赞 0 评论 0
/**------------------------RENDER------------------------**/
@Override
public void render(float f) 
{
    //Debug
    //stage.setDebugAll(true);

    //Clear Screen
    Gdx.gl.glClearColor(0.2f, 0.2f, 0.2f, 1);
    Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT);

     //Draw stage
    stage.act(Constants.DELTATIME);
    stage.draw();

    /*------------------SWITCH TO FULLSCREEN AND BACK------------------*/
    super.changeToFullScreenOnF12();

    /*------------------QUIT GAME------------------*/
    if (Gdx.input.isKeyPressed(Input.Keys.ESCAPE))
    {
        game.setScreen(new MenuScreen(game, client, server));
    }
}
MenuScreen.java 文件源码 项目:Space-Bombs 阅读 27 收藏 0 点赞 0 评论 0
/**------------------------RENDER------------------------**/
@Override
public void render(float f) 
{        
    //Debug
    //stage.setDebugAll(true);

    //Clear Screen
    Gdx.gl.glClearColor(0.2f, 0.2f, 0.2f, 1);
    Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT);

    //Set background image
    rootTable.background(new TextureRegionDrawable(new TextureRegion(TextureManager.menuBackground)));

    //Draw stage
    stage.act(Gdx.graphics.getDeltaTime());
    stage.draw();

    /*------------------SWITCH TO FULLSCREEN AND BACK------------------*/
    super.changeToFullScreenOnF12();

}
HostSettingsScreen1.java 文件源码 项目:Space-Bombs 阅读 28 收藏 0 点赞 0 评论 0
/**------------------------RENDER------------------------**/
    @Override
    public void render(float f) 
    {        
        //Debug
//        stage.setDebugAll(true);

        //Clear Screen
        Gdx.gl.glClearColor(0.2f, 0.2f, 0.2f, 1);
        Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT);

        //Draw stage
        stage.act(Constants.DELTATIME);
        stage.draw();

        /*------------------SWITCH TO FULLSCREEN AND BACK------------------*/
        super.changeToFullScreenOnF12();

        /*------------------QUIT GAME------------------*/
        if (Gdx.input.isKeyJustPressed(Input.Keys.ESCAPE))
        {

            game.setScreen(new HostScreen(game, client, server));
        }
    }
Terrain.java 文件源码 项目:Argent 阅读 21 收藏 0 点赞 0 评论 0
public void init() {
    final int numVertices = this.vertexResolution * this.vertexResolution;
    final int numIndices = (this.vertexResolution-1) * (this.vertexResolution-1) * 6;

    mesh = new Mesh(true, numVertices, numIndices, attribs);
    this.vertices = new float[numVertices * stride];
    mesh.setIndices(buildIndices());
    buildVertices();
    mesh.setVertices(vertices);

    MeshPart meshPart = new MeshPart(null, mesh, 0, numIndices, GL30.GL_TRIANGLES);
    meshPart.update();
    ModelBuilder mb = new ModelBuilder();
    mb.begin();
    mb.part(meshPart, material);
    model = mb.end();
    modelInstance = new ModelInstance(model);
    modelInstance.transform = transform;
}
LandscapeWorldActor.java 文件源码 项目:Argent 阅读 35 收藏 0 点赞 0 评论 0
public void constructCells() {
    builder.begin();

    int vertAttrs = Position | Normal | TextureCoordinates;


    for(int x = 0; x < cells.length; x++) {
        for (int z = 0; z < cells[x].length; z++) {
            MeshPartBuilder partBuilder = builder.part("cell"+x+","+z, GL30.GL_TRIANGLES, vertAttrs, Reference.Defaults.Models.material());
            partBuilder.rect(getPoint("D", x, z), getPoint("C", x, z), getPoint("B", x, z), getPoint("A", x, z), Vector3.Y);
            cells[x][z].setCellPart(partBuilder.getMeshPart());
            cells[x][z].init();
        }
    }
    model = builder.end();
    instance = new ModelInstance(model);
}
WeatherParticleEmitter.java 文件源码 项目:fabulae 阅读 33 收藏 0 点赞 0 评论 0
public void draw(GameMap map, Batch batch) {
    if (map == null) {
        return;
    }

    if (additive)
        batch.setBlendFunction(GL30.GL_SRC_ALPHA, GL30.GL_ONE);

    Particle[] particles = this.particles;
    boolean[] active = this.active;
    Vector2 tempVector = MathUtil.getVector2();

    for (int i = 0, n = maxParticleCount; i < n; i++)
        if (active[i]) {
            tempVector.set(particles[i].getX() + particles[i].getOriginX(),
                    particles[i].getY() + particles[i].getOriginY());
            map.projectToTiles(tempVector);
            if (map.shouldRenderTile((int) tempVector.x, (int) tempVector.y)) {
                particles[i].draw(batch);
            }

        }
    MathUtil.freeVector2(tempVector);
    if (additive)
        batch.setBlendFunction(GL30.GL_SRC_ALPHA, GL30.GL_ONE_MINUS_SRC_ALPHA);
}
GameMapScreen.java 文件源码 项目:fabulae 阅读 31 收藏 0 点赞 0 评论 0
@Override
public void render(float delta) {
    // get any missing assets
    Assets.getAssetManager().update();

    // update phase
    gameState.update(delta, camera);
    UIManager.updateUI(delta);
    cameraController.updateCamera(delta);       
    camera.update();

    // render phase
    Gdx.gl.glClearColor(0f, 0f, 0f, 1f);
    Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT);
    renderer.render(delta, camera);
    UIManager.drawUI();
}
BasePicker.java 文件源码 项目:Mundus 阅读 26 收藏 0 点赞 0 评论 0
public Pixmap getFrameBufferPixmap(Viewport viewport) {
    int w = viewport.getScreenWidth();
    int h = viewport.getScreenHeight();
    int x = viewport.getScreenX();
    int y = viewport.getScreenY();
    final ByteBuffer pixelBuffer = BufferUtils.newByteBuffer(w * h * 4);

    Gdx.gl.glBindFramebuffer(GL20.GL_FRAMEBUFFER, fbo.getFramebufferHandle());
    Gdx.gl.glReadPixels(x, y, w, h, GL30.GL_RGBA, GL30.GL_UNSIGNED_BYTE, pixelBuffer);
    Gdx.gl.glBindFramebuffer(GL20.GL_FRAMEBUFFER, 0);

    final int numBytes = w * h * 4;
    byte[] imgLines = new byte[numBytes];
    final int numBytesPerLine = w * 4;
    for (int i = 0; i < h; i++) {
        pixelBuffer.position((h - i - 1) * numBytesPerLine);
        pixelBuffer.get(imgLines, i * numBytesPerLine, numBytesPerLine);
    }

    Pixmap pixmap = new Pixmap(w, h, Pixmap.Format.RGBA8888);
    BufferUtils.copy(imgLines, 0, pixmap.getPixels(), imgLines.length);

    return pixmap;
}
DepthShader.java 文件源码 项目:ForgE 阅读 23 收藏 0 点赞 0 评论 0
@Override
public void beforeRender(Renderable renderable) {
  context.setDepthMask(true);
  context.setDepthTest(GL30.GL_LESS);
  if (env.depthShaderMode == LevelEnv.DepthShaderMode.Normal) {
    shader.setUniformf(UNIFORM_TRANSPARENT_DEPTH, 1.0f);
    if (BaseRenderable.haveTransparency(renderable.material)) {
      context.setCullFace(GL30.GL_NONE);
    } else {
      context.setCullFace(GL20.GL_FRONT);
    }
  } else {
    shader.setUniformf(UNIFORM_TRANSPARENT_DEPTH, 1.0f);
    context.setCullFace(GL20.GL_BACK);
  }

}
TerrainBuilder.java 文件源码 项目:ForgE 阅读 24 收藏 0 点赞 0 评论 0
private VoxelChunkRenderableFactory buildFactoryFor(Chunk chunk, VoxelsAssembler assembler, Material material) {
  if (assembler.isEmpty()) {
    return null;
  } else {
    VoxelChunkRenderableFactory voxelChunkRenderableFactory = new VoxelChunkRenderableFactory();
    voxelChunkRenderableFactory.material                    = material;
    voxelChunkRenderableFactory.primitiveType               = GL30.GL_TRIANGLES;

    if (ForgE.config.getBool(Config.Key.GenerateWireframe))
      voxelChunkRenderableFactory.wireframe           = assembler.wireframe();
    voxelChunkRenderableFactory.triangleCount         = assembler.getTriangleCount();
    voxelChunkRenderableFactory.attributes            = MeshVertexInfo.voxelTypes();
    voxelChunkRenderableFactory.meshFactory           = assembler.meshFactory(voxelChunkRenderableFactory.attributes);
    return voxelChunkRenderableFactory;
  }
}
TerrainBuilder.java 文件源码 项目:ForgE 阅读 29 收藏 0 点赞 0 评论 0
private VoxelChunkRenderable buildFaceForChunkWithAssembler(Chunk chunk, VoxelsAssembler assembler, boolean haveTransparency) {
  if (!assembler.isEmpty()) {
    VoxelChunkRenderable renderable   = new VoxelChunkRenderable();
    renderable.primitiveType          = GL30.GL_TRIANGLES;

    if (ForgE.config.getBool(Config.Key.GenerateWireframe))
      renderable.wireframe           = assembler.wireframe();
    renderable.triangleCount         = assembler.getTriangleCount();
    renderable.meshFactory           = assembler.meshFactory(MeshVertexInfo.voxelTypes());

    renderable.worldTransform.idt();
    renderable.material = new Material(new SolidTerrainAttribute());
    if (haveTransparency) {
      renderable.material.set(new BlendingAttribute(true,1f));
    }

    chunk.addFace(renderable);
    return renderable;
  } else {
    return null;
  }
}
VersusScreen.java 文件源码 项目:javacup 阅读 29 收藏 0 点赞 0 评论 0
@Override
public void render() {
  Gdx.gl.glClearColor(0, 0, 0, 1);
  Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT);

  //TODO background

  localTSR.draw(game.cRenderer);
  visitorTSR.draw(game.cRenderer);

  ShapeRenderer shapeRenderer = game.cRenderer.shape;
  shapeRenderer.begin(ShapeRenderer.ShapeType.Filled);
  shapeRenderer.setColor(new Color(0, 0, 1, 1));
  shapeRenderer.rect(button.x, button.y, button.width, button.height);
  shapeRenderer.end();
}
OptionScreen.java 文件源码 项目:Space-Bombs 阅读 23 收藏 0 点赞 0 评论 0
/**------------------------RENDER------------------------**/
@Override
public void render(float f) 
{        
    //Debug
    //stage.setDebugAll(true);

    if(Gdx.graphics.isFullscreen())
    {
        checkBoxFullscreen.setChecked(true);
    }else
    {
        checkBoxFullscreen.setChecked(false);
    }

    //Clear Screen
    Gdx.gl.glClearColor(0.2f, 0.2f, 0.2f, 1);
    Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT);

    //Draw stage
    stage.act(Constants.DELTATIME);
    stage.draw();

    /*------------------SWITCH TO FULLSCREEN AND BACK------------------*/
    super.changeToFullScreenOnF12();

    /*------------------QUIT GAME------------------*/
    if (Gdx.input.isKeyJustPressed(Input.Keys.ESCAPE))
    {
        game.setScreen(new MenuScreen(game, client, server));
    }
}
HostSettingsScreen.java 文件源码 项目:Space-Bombs 阅读 29 收藏 0 点赞 0 评论 0
/**------------------------RENDER------------------------**/
    @Override
    public void render(float f) 
    {        
        //Debug
//        stage.setDebugAll(true);

        //Clear Screen
        Gdx.gl.glClearColor(0.2f, 0.2f, 0.2f, 1);
        Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT);

        //Draw stage
        stage.act(Constants.DELTATIME);
        stage.draw();

        /*------------------SWITCH TO FULLSCREEN AND BACK------------------*/
        super.changeToFullScreenOnF12();

        /*------------------QUIT GAME------------------*/
        if (Gdx.input.isKeyJustPressed(Input.Keys.ESCAPE))
        {
            if(oldMaxPlayerValue != maxPlayers)
            {
                server.resetServer();
            }

            game.setScreen(new HostScreen(game, client, server));
        }
    }
JoinScreen.java 文件源码 项目:Space-Bombs 阅读 28 收藏 0 点赞 0 评论 0
/**------------------------RENDER------------------------**/
@Override
public void render(float f) 
{
    //Debug
    //stage.setDebugAll(true);

    //Clear Screen
    Gdx.gl.glClearColor(0.2f, 0.2f, 0.2f, 1);
    Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT);

    //Set background image
    rootTable.background(new TextureRegionDrawable(new TextureRegion(TextureManager.menuBackground)));

    //Render stage
    stage.act(Constants.DELTATIME);
    stage.draw();

    /*------------------SWITCH TO FULLSCREEN AND BACK------------------*/
    super.changeToFullScreenOnF12();

    /*------------------QUIT GAME------------------*/
    if (Gdx.input.isKeyPressed(Input.Keys.ESCAPE))
    {
        game.setScreen(new MenuScreen(game, client, server));
    }

    /*------------------JOIN GAME WITH ENTER------------------*/
    if(Gdx.input.isKeyJustPressed(Input.Keys.ENTER))
    {
        ChangeEvent event1 = new ChangeEvent();
        joinButton.fire(event1);
    }
}
WinnerScreen.java 文件源码 项目:Space-Bombs 阅读 22 收藏 0 点赞 0 评论 0
/**------------------------RENDER------------------------**/
@Override
public void render(float f) 
{
    //Debug
    //stage.setDebugAll(true);

    //Clear Screen
    Gdx.gl.glClearColor(0.2f, 0.2f, 0.2f, 1);
    Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT);

    //Draw stage
    stage.act(Constants.DELTATIME);
    stage.draw();

    /*------------------SWITCH TO FULLSCREEN AND BACK------------------*/
    super.changeToFullScreenOnF12();

    /*------------------QUIT GAME------------------*/
    if (Gdx.input.isKeyPressed(Input.Keys.ESCAPE))
    {
        if(isWinner)
        {
            AudioManager.getCurrentMusic().stop();
        }else
        {
            AudioManager.getCurrentMusic().stop();
        }

        server.stopServer();
        game.setScreen(new MenuScreen(game, client, server));
    }
}
Terrain.java 文件源码 项目:Argent 阅读 23 收藏 0 点赞 0 评论 0
@Override
public void getRenderables(Array<Renderable> renderables, Pool<Renderable> pool) {
    if (Gdx.input.isKeyJustPressed(Input.Keys.N)) {
        heightData[MathUtils.random(0, heightData.length-1)] = MathUtils.random(0, 1024);
        update();
    }
    modelInstance.nodes.forEach(n -> n.parts.forEach(p -> p.meshPart.primitiveType = GL30.GL_LINES));
    modelInstance.getRenderables(renderables, pool);
}
WorldObjectCharacter.java 文件源码 项目:Argent 阅读 32 收藏 0 点赞 0 评论 0
public static WorldObjectCharacter createDefaultPlayerCharacter(GameWorld.Generic world) {
    modelBuilder.begin();
    MeshPartBuilder builder = modelBuilder.part("player_body", GL30.GL_TRIANGLES, VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal | VertexAttributes.Usage.TextureCoordinates, Reference.Defaults.Models.material());
    CapsuleShapeBuilder.build(builder, 75, 500, 64);
    WorldObject obj = new WorldObject(world, new ModelInstance(modelBuilder.end()));
    if(world instanceof GameWorld.Physics) {
        world.addInstance(new BulletEntity<>(world, obj.transform(), obj));
    }else{
        world.addInstance(obj);
    }
    return new WorldObjectCharacter(obj);
}
DepthFrameBuffer.java 文件源码 项目:origin 阅读 31 收藏 0 点赞 0 评论 0
/**
 * старый но! рабочий код) создания текстуры для буфера глубины. оставлен для истории
 */
@Deprecated
public void createDepthTextre(Texture.TextureFilter filter, Texture.TextureWrap wrap)
{
    // сначала биндим наш буфер
    gl.glBindFramebuffer(GL20.GL_FRAMEBUFFER, getFramebufferHandle());

    // создаем текстуру
    _depthTexture = gl.glGenTexture();
    // биндим ее
    gl.glBindTexture(GL11.GL_TEXTURE_2D, _depthTexture);
    gl.glTexImage2D(
            GL11.GL_TEXTURE_2D, 0,
            GL14.GL_DEPTH_COMPONENT16, width, height,
            0, GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, null);
    // сделаем сглаживание
    gl.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, filter.getGLEnum());
    gl.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, filter.getGLEnum());
    gl.glTexParameteri(GL11.GL_TEXTURE_2D, GL20.GL_TEXTURE_WRAP_S, wrap.getGLEnum());
    gl.glTexParameteri(GL11.GL_TEXTURE_2D, GL20.GL_TEXTURE_WRAP_T, wrap.getGLEnum());
    // связываем нашу текстуру с буфером
    gl.glFramebufferTexture2D(GL20.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT,
                              GL20.GL_TEXTURE_2D,
                              _depthTexture, 0);

    // а вот тут может случится ата-та. т.к. надо знать ид буфера экрана. см код libgdx
    gl.glBindFramebuffer(GL20.GL_FRAMEBUFFER, 0);
}
Fill.java 文件源码 项目:METRO 阅读 32 收藏 0 点赞 0 评论 0
/**
 * Initializes the screen for drawing on it. It also stops the spriteBatch for a transparent background.
 * 
 * @param spriteBatch
 *            The sprite batch to draw on.
 */
private static void init(SpriteBatch spriteBatch)
{
    spriteBatch.end();
    Gdx.gl.glEnable(GL30.GL_BLEND);
    Gdx.gl.glBlendFunc(GL30.GL_SRC_ALPHA, GL30.GL_ONE_MINUS_SRC_ALPHA);

    __shapeRenderer.setProjectionMatrix(METRO.__camera.combined);
    __shapeRenderer.begin(ShapeType.Filled);
    __shapeRenderer.setColor(__r, __g, __b, __a);
}
Fill.java 文件源码 项目:METRO 阅读 31 收藏 0 点赞 0 评论 0
/**
 * Resets the screen and the spriteBatch to the default values so that METRO can use it normally. The drawing has finished at this point.
 * 
 * @param spriteBatch
 *            The sprite batch to draw on.
 */
private static void reset(SpriteBatch spriteBatch)
{
    __shapeRenderer.end();
    Gdx.gl.glDisable(GL30.GL_BLEND);
    spriteBatch.begin();
}
Draw.java 文件源码 项目:METRO 阅读 34 收藏 0 点赞 0 评论 0
/**
 * Initializes the screen for drawing on it. It also stops the spriteBatch for a transparent background.
 */
private static void init()
{
    METRO.__spriteBatch.end();
    Gdx.gl.glEnable(GL30.GL_BLEND);
    Gdx.gl.glBlendFunc(GL30.GL_SRC_ALPHA, GL30.GL_ONE_MINUS_SRC_ALPHA);

    if (__shapeRenderer == null)
    {
        __shapeRenderer = new ShapeRenderer();
    }
    __shapeRenderer.setProjectionMatrix(METRO.__camera.combined);
    __shapeRenderer.begin(ShapeType.Line);
    __shapeRenderer.setColor(__r, __g, __b, __a);
}
Draw.java 文件源码 项目:METRO 阅读 32 收藏 0 点赞 0 评论 0
/**
 * Resets the screen and the spriteBatch to the default values so that METRO can use it normally. The drawing has finished at this point.
 */
private static void reset()
{
    __shapeRenderer.end();
    Gdx.gl.glDisable(GL30.GL_BLEND);
    METRO.__spriteBatch.begin();
}
METRO.java 文件源码 项目:METRO 阅读 36 收藏 0 点赞 0 评论 0
/**
 * Initializes the rendering by clearing the screen and updating the control list.
 */
private void renderInit()
{
    Gdx.gl.glClearColor(1, 1, 1, 1);
    Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT);

}
Game.java 文件源码 项目:KittenMaxit 阅读 31 收藏 0 点赞 0 评论 0
@Override
public void render() {
    update(Gdx.graphics.getRawDeltaTime());

    Gdx.gl30.glClearColor(1, 1, 1, 1);
    Gdx.gl30.glClear(GL30.GL_COLOR_BUFFER_BIT | GL30.GL_DEPTH_BUFFER_BIT
            | (Gdx.graphics.getBufferFormat().coverageSampling ? GL30.GL_COVERAGE_BUFFER_BIT_NV : 0));

    Gdx.graphics.setCursor(cursor);

    if (state == 1) {
        if (!menu.equals(null)) {
            menu.render(mX, mY);
        }
    } else if (state == 2) {
        if (!singleplayer.equals(null)) {
            singleplayer.render(mX, mY);
        }
    } else if (state == 3) {
        if (!help.equals(null)) {
            help.render(mX, mY);
        }
    } else if (state == 4) {
        if (!options.equals(null)) {
            options.render(mX, mY);
        }
    } else if (state == 5) {
        if (!credits.equals(null)) {
            credits.render(mX, mY);
        }
    }
}
TerrainShader.java 文件源码 项目:ForgE 阅读 31 收藏 0 点赞 0 评论 0
@Override
public void beforeRender(VoxelChunkRenderable renderable) {
  if (BaseRenderable.haveTransparency(renderable.material)) {
    context.setBlending(true, GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
    context.setCullFace(GL30.GL_NONE);
  } else {
    context.setBlending(false, GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
    context.setCullFace(GL30.GL_BACK);
  }
}
Default.java 文件源码 项目:ForgE 阅读 22 收藏 0 点赞 0 评论 0
@Override
public void afterBegin() {
  context.setCullFace(GL30.GL_BACK);
  context.setBlending(false, GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
  context.setDepthMask(true);
  context.setDepthTest(GL30.GL_LEQUAL);
}
SpriteShader.java 文件源码 项目:ForgE 阅读 29 收藏 0 点赞 0 评论 0
@Override
public void beforeRender(SpriteRenderable renderable) {
  shader.setUniformi(UNIFORM_SPRITE_TEXTURE, context.textureBinder.bind(renderable.texture));

  context.setBlending(true, GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
  context.setCullFace(GL30.GL_BACK);
}
ShaderPostProcessingStep.java 文件源码 项目:ForgE 阅读 28 收藏 0 点赞 0 评论 0
@Override
public void run(RenderContext renderContext, LevelEnv env) {
  renderContext.begin(); {
    ForgE.fb.begin(targetFboName); {
      ForgE.graphics.clearAll(Color.CLEAR);// TODO change it using json
      shader.begin(ForgE.fb.getScreenCamera(), renderContext, env); {
        shader.render(ForgE.fb.getScreenQuad(), GL30.GL_TRIANGLE_STRIP);
      } shader.end();
    } ForgE.fb. end();
  } renderContext.end();
}
CubemapSkybox.java 文件源码 项目:ForgE 阅读 28 收藏 0 点赞 0 评论 0
private Renderable getRenderable() {
  if (renderable == null) {
    this.renderable           = new CubemapSkyboxRenderable();
    this.renderable.mesh      = buildMesh();

    renderable.primitiveType  = GL30.GL_TRIANGLE_STRIP;
    renderable.worldTransform.idt();
  }

  return renderable;
}


问题


面经


文章

微信
公众号

扫码关注公众号