diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTButton.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTButton.java index a208c76..38d66a6 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTButton.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTButton.java @@ -6,12 +6,14 @@ public class RWTButton implements TouchListener { private RWTSprite[] sprite = null; - RWTSurfaceView view; - public RWTButton(final RWTSurfaceView view) { - this.view = view; + + public RWTButton(final RWTLayer layer) { sprite = new RWTSprite[2]; - sprite[0] = new RWTSprite(view); - sprite[1] = new RWTSprite(view); + sprite[0] = new RWTSprite(); + sprite[1] = new RWTSprite(); + + layer.addDrawable(sprite[0]); + layer.addDrawable(sprite[1]); } @Override diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTDrawable.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTDrawable.java index 8b225f5..7fcc412 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTDrawable.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTDrawable.java @@ -2,6 +2,33 @@ import org.ntlab.radishforandroidstudio.java3d.GraphicsContext3D; +/** + * 描画可能な要素を示すインタフェース + * + * @author s.iwatani + */ public interface RWTDrawable { + /** + * 描画を行う + * + * @author s.iwatani + * @param gc3D + */ public void draw(GraphicsContext3D gc3D); + + /** + * 描画するかしないかをセット + * + * @author s.iwatani + * @param isDraw trueで描画する + */ + public void setIsDraw(boolean isDraw); + + /** + * 描画するかしないかを取得 + * + * @author s.iwatani + * @return boolean + */ + public boolean getIsDraw(); } diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTLayer.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTLayer.java new file mode 100644 index 0000000..4635c35 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTLayer.java @@ -0,0 +1,54 @@ +package org.ntlab.radishforandroidstudio.framework.RWT; + +import android.graphics.drawable.Drawable; + +import org.ntlab.radishforandroidstudio.java3d.GraphicsContext3D; + +import java.util.ArrayList; + +/** + * 複数のdrawableを管理するクラス + */ +public class RWTLayer { + private ArrayList drawables = new ArrayList<>(); + + public RWTLayer() { + + } + + /** + * RWTDrawableを追加する + * + * @auther s.iwatani + * @param drawable 追加したいRWTDrawable + */ + public void addDrawable(RWTDrawable drawable) { + drawables.add(drawable); + } + + /** + * RWTDrawableを削除する + * + * @param drawable 削除したいRWTDrawable + */ + public void removeDrawable(RWTDrawable drawable) { + drawables.remove(drawable); + } + + /** + * レイヤーに配置されたdrawableを描画する + * + * @param gc3D + */ + public void draw(GraphicsContext3D gc3D) { + // 2D描画開始 + gc3D.startDrawImage(); + + for (RWTDrawable drawable : drawables) { + drawable.draw(gc3D); + } + + // 戻し + gc3D.endDrawImage(); + } +} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTLayers.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTLayers.java new file mode 100644 index 0000000..c45d137 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTLayers.java @@ -0,0 +1,102 @@ +package org.ntlab.radishforandroidstudio.framework.RWT; + +import android.support.v13.view.DragStartHelper; + +import org.ntlab.radishforandroidstudio.java3d.GraphicsContext3D; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.Map; +import java.util.TreeMap; + +public class RWTLayers { + private TreeMap> layers = new TreeMap(); + + public RWTLayers() { + + } + + /** + * レイヤーを追加 + * + * @author s.iwatani + * @param priority 描画の優先順位.低いほうが手前に表示される + * @param layer 追加するレイヤー + */ + public void addLayer(int priority, RWTLayer layer) { + if (layers.get(priority) == null) { + layers.put(priority, new ArrayList()); + } + layers.get(priority).add(layer); + } + + /** + * レイヤーを削除 + * + * @author s.iwatani + * @param layer 削除したいレイヤー + */ + public void removeLayer(RWTLayer layer) { + Iterator>> it = layers.entrySet().iterator(); + + while(it.hasNext()) { + Map.Entry> value = it.next(); + value.getValue().remove(layer); + + // 空ならその優先順位の値は不要になるため削除 + if (value.getValue().isEmpty()) { + it.remove(); + } + } + } + + /** + * 描画の優先順位を変更 + * + * @author s.iwatani + * @param priority 変更後の優先順位 + * @param layer 対象レイヤー + */ + public void changePriority(int priority, RWTLayer layer) { + removeLayer(layer); + addLayer(priority, layer); + } + + /** + * 描画の優先順位を最前面へ変更 + * + * @author s.iwatani + * @param layer 対象レイヤー + */ + public void changeTopPriority(RWTLayer layer) { + removeLayer(layer); + addLayer(calcTopPriority(), layer); + } + + /** + * 最前面に表示するためのpriorityの値を取得する + * + * @author s.iwatani + * @return int 優先順位 + */ + public int calcTopPriority() { + if (layers.isEmpty()) { + return 0; + } + return layers.firstKey() - 1; + } + + /** + * セットされているレイヤーを描画する + * + * @author s.iwatani + * @param gc3D + */ + public void draw(GraphicsContext3D gc3D) { + for (Map.Entry> entry : layers.entrySet()) { + for (RWTLayer layer : entry.getValue()) { + layer.draw(gc3D); + } + } + } +} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTRenderer.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTRenderer.java index 559a2c7..17a20f8 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTRenderer.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTRenderer.java @@ -16,7 +16,7 @@ protected Viewer3D viewer; protected Camera3D camera; protected GraphicsContext3D gc3D = null; - protected RWTSprites sprites = new RWTSprites(); + protected RWTLayers layers = new RWTLayers(); protected GL10 gl; public RWTRenderer() { @@ -29,12 +29,8 @@ viewer = new Viewer3D(camera); } - public void attachSprites(RWTSprites sprites) { - this.sprites = sprites; - } - - public GL10 getGl() { - return gl; + public void attachLayers(RWTLayers layers) { + this.layers = layers; } @Override @@ -76,6 +72,6 @@ gc3D.popMatrix(); // UI, HUDのレンダリング - sprites.draw(gc3D); + layers.draw(gc3D); } } diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTSprite.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTSprite.java index 45b8b4c..de02231 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTSprite.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTSprite.java @@ -1,11 +1,11 @@ package org.ntlab.radishforandroidstudio.framework.RWT; -import javax.microedition.khronos.opengles.GL10; -import javax.microedition.khronos.opengles.GL11; -import javax.microedition.khronos.opengles.GL11Ext; import android.content.res.Resources; import android.opengl.GLUtils; import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.TableLayout; import org.ntlab.radishforandroidstudio.framework.model3D.Position3D; import org.ntlab.radishforandroidstudio.java3d.GraphicsContext3D; @@ -13,6 +13,8 @@ import org.ntlab.radishforandroidstudio.java3d.Texture; import org.ntlab.radishforandroidstudio.java3d.TextureLoader; +import java.util.ArrayList; + /** * 画像管理クラス * 座標は左下が原点であることに注意(DirectXは左上のため) @@ -24,6 +26,7 @@ private RWTImageLoader texLoader; private Texture tex; private ImageComponent2D image = null; + private boolean isDraw = true; // 表示座標 private Position3D pos = new Position3D(0.f, 0.f, 0.f); @@ -31,8 +34,7 @@ private Position3D texPos = new Position3D(0.f, 0.f, 0.f); private Position3D viewSize = new Position3D(0.f, 0.f, 0.f); - public RWTSprite(final RWTSurfaceView view) { - view.addSprite(this); + public RWTSprite() { } /** @@ -121,6 +123,10 @@ * @param gc3D GL10 */ public void draw(GraphicsContext3D gc3D) { + if (!getIsDraw()) { + return; + } + boolean isNullTextureId = textureId == null; if (textureId == null) { textureId = new int[1]; @@ -128,4 +134,26 @@ } gc3D.draw(textureId[0], pos, texPos, texSize, viewSize); } + + /** + * 描画するかしないかをセット + * + * @author s.iwatani + * @param isDraw trueで描画する + */ + @Override + public void setIsDraw(boolean isDraw) { + this.isDraw = isDraw; + } + + /** + * 描画するかしないかを取得 + * + * @author s.iwatani + * @return boolean + */ + @Override + public boolean getIsDraw() { + return isDraw; + } } diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTSprites.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTSprites.java deleted file mode 100644 index 5a6b5a2..0000000 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTSprites.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.ntlab.radishforandroidstudio.framework.RWT; - -import org.ntlab.radishforandroidstudio.java3d.GraphicsContext3D; - -import java.util.ArrayList; - -/** - * スプライト管理クラス - * - * @author s.iwatani - */ -public class RWTSprites { - private ArrayList sprites = new ArrayList<>(); - - public RWTSprites() {} - - /** - * スプライトの追加 - * - * @author s,iwatani - * @param sprite 追加したいRWTSprite - */ - public void addSprite(RWTSprite sprite) { - sprites.add(sprite); - } - - /** - * スプライトの削除 - * - * @author s.iwatani - * @param sprite 削除したいRWTSprite - */ - public void removeSprite(RWTSprite sprite) { - sprites.remove(sprite); - } - - /** - * 登録されたスプライトの描画 - * - * @param gc3D GraphicsContext3D - */ - public void draw(GraphicsContext3D gc3D) { - gc3D.startDrawImage(); - - // 描画 - for (RWTDrawable sprite : sprites) { - sprite.draw(gc3D); - } - - // 戻し - gc3D.endDrawImage(); - } -} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTSurfaceView.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTSurfaceView.java index 9fa2686..43e52b4 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTSurfaceView.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTSurfaceView.java @@ -2,19 +2,12 @@ import android.content.Context; import android.opengl.GLSurfaceView; -import android.os.Bundle; -import android.util.AttributeSet; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; import org.ntlab.radishforandroidstudio.framework.view3D.Camera3D; -import javax.microedition.khronos.opengles.GL10; - public class RWTSurfaceView extends GLSurfaceView { protected RWTRenderer renderer; - protected RWTSprites sprites = new RWTSprites(); + protected RWTLayers layers = new RWTLayers(); public RWTSurfaceView(Context context) { this(context, true); @@ -24,7 +17,7 @@ super(context); if (bInitRenderer) { renderer = new RWTRenderer(); - renderer.attachSprites(sprites); + renderer.attachLayers(layers); setEGLConfigChooser(8, 8, 8, 8, 16, 0); this.setRenderer(renderer); } @@ -34,11 +27,53 @@ renderer.attachCamera(camera); } - public void addSprite(RWTSprite sprite) { - sprites.addSprite(sprite); + /** + * レイヤーを最前面に配置するように追加 + * + * @author s.iwatani + * @param layer 追加したいレイヤー + */ + public void addLayer(RWTLayer layer) { addLayer(layers.calcTopPriority(), layer); } + + /** + * レイヤーを追加 + * + * @author s.iwatani + * @param priority 優先順位 低いほど手前に表示される + * @param layer 追加したいレイヤー + */ + public void addLayer(int priority, RWTLayer layer) { + layers.addLayer(priority, layer); } - public void removeSprite(RWTSprite sprite) { - sprites.removeSprite(sprite); + /** + * 描画の優先順位を変更 + * + * @author s.iwatani + * @param priority 変更後の優先順位 + * @param layer 対象レイヤー + */ + public void changePriority(int priority, RWTLayer layer) { + layers.changePriority(priority, layer); + } + + /** + * 描画の優先順位を最前面へ変更 + * + * @author s.iwatani + * @param layer 対象レイヤー + */ + public void changeTopPriority(RWTLayer layer) { + layers.changeTopPriority(layer); + } + + /** + * レイヤーを削除 + * + * @author s.iwatani + * @param layer 削除したいレイヤー + */ + public void removeLayer(RWTLayer layer) { + layers.removeLayer(layer); } } diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/spriteTest/TestActivity.java b/app/src/main/java/org/ntlab/radishforandroidstudio/spriteTest/TestActivity.java index 1e8e6d5..b4ae5a3 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/spriteTest/TestActivity.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/spriteTest/TestActivity.java @@ -13,6 +13,8 @@ import android.widget.TableLayout; import org.ntlab.radishforandroidstudio.R; +import org.ntlab.radishforandroidstudio.framework.RWT.RWTLayer; +import org.ntlab.radishforandroidstudio.framework.RWT.RWTLayers; import org.ntlab.radishforandroidstudio.framework.RWT.RWTSprite; import org.ntlab.radishforandroidstudio.framework.RWT.RWTSurfaceView; import org.ntlab.radishforandroidstudio.framework.gameMain.RealTimeActivity; @@ -38,6 +40,11 @@ private Solid3D ground; private Transform3D initTrans; private Solid3D diceObj; + RWTLayer[] layer = new RWTLayer[3]; + private long time = 0; + private int side = 0; + + private RWTSurfaceView view = null; private RWTSprite[] sprite = new RWTSprite[3]; @@ -100,27 +107,32 @@ camera.addTarget(diceObj); // 画面との関連付け - RWTSurfaceView view = new RWTSurfaceView(this); + view = new RWTSurfaceView(this); view.attachCamera(camera); setContentView(view); - // 適当に設定してみる - Button sv = new Button(this); - sv.setText("test"); - sv.setBackgroundColor(0); - sv.setLayoutParams(new LinearLayout.LayoutParams(50, 50)); - setContentView(sv); + // layer + layer[0] = new RWTLayer(); + layer[1] = new RWTLayer(); + layer[2] = new RWTLayer(); + view.addLayer(layer[0]); + view.addLayer(layer[1]); + view.addLayer(layer[2]); - sprite[0] = new RWTSprite(view); + sprite[0] = new RWTSprite(); sprite[0].setTexture(getResources(), R.drawable.dice_6, false); + layer[0].addDrawable(sprite[0]); - sprite[1] = new RWTSprite(view); + sprite[1] = new RWTSprite(); sprite[1].setTexture(getResources(), R.drawable.wadahand, true); sprite[1].setPosition(100, 100); + layer[1].addDrawable(sprite[1]); - sprite[2] = new RWTSprite(view); + sprite[2] = new RWTSprite(); sprite[2].setTexture(getResources(), R.drawable.tss_thumb, true); sprite[2].setPosition(100, 100); + layer[2].addDrawable(sprite[2]); + start(10); } @@ -132,7 +144,14 @@ long newTime = System.nanoTime(); physicalSystem.motion(0, 10, Force3D.ZERO, physicalSystem.objects.get(0).getGravityCenter(), null); -// Log.v("moji", "" + ((System.nanoTime()-newTime)/1000.0)); + + time += interval; + if (time > 1000) { + time -= 1000; + side++; + view.changeTopPriority(layer[side % 3]); + } + // Log.v("moji", "" + ((System.nanoTime()-newTime)/1000.0)); } @Override