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 new file mode 100644 index 0000000..8b225f5 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTDrawable.java @@ -0,0 +1,7 @@ +package org.ntlab.radishforandroidstudio.framework.RWT; + +import org.ntlab.radishforandroidstudio.java3d.GraphicsContext3D; + +public interface RWTDrawable { + public void draw(GraphicsContext3D gc3D); +} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTImageLoader.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTImageLoader.java index 3c5afc1..b571577 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTImageLoader.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTImageLoader.java @@ -3,7 +3,9 @@ import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; +import android.util.DisplayMetrics; +import org.ntlab.radishforandroidstudio.framework.model3D.Position3D; import org.ntlab.radishforandroidstudio.java3d.ImageComponent2D; import org.ntlab.radishforandroidstudio.java3d.Texture; import org.ntlab.radishforandroidstudio.java3d.Texture2D; @@ -26,6 +28,7 @@ private int id = 0; private Bitmap bitmap; private int format, texFormat; + private Position3D size = null; public RWTImageLoader(InputStream in, int flags) { this.in = in; @@ -74,9 +77,15 @@ if (format == ImageComponent2D.FORMAT_RGBA) { bitmap.setHasAlpha(true); } + + size = new Position3D(bitmap.getWidth(), bitmap.getHeight(), 0.0); return new ImageComponent2D(format, bitmap); } + public Position3D getSize() { + return size; + } + public ImageComponent2D setImage(Bitmap bitmap) { this.bitmap = bitmap; return new ImageComponent2D(format, this.bitmap); 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 9c8a9d5..559a2c7 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 @@ -76,6 +76,6 @@ gc3D.popMatrix(); // UI, HUDのレンダリング - sprites.draw(gl); + sprites.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 ab4cb5f..45b8b4c 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 @@ -5,8 +5,10 @@ import javax.microedition.khronos.opengles.GL11Ext; import android.content.res.Resources; import android.opengl.GLUtils; +import android.util.Log; import org.ntlab.radishforandroidstudio.framework.model3D.Position3D; +import org.ntlab.radishforandroidstudio.java3d.GraphicsContext3D; import org.ntlab.radishforandroidstudio.java3d.ImageComponent2D; import org.ntlab.radishforandroidstudio.java3d.Texture; import org.ntlab.radishforandroidstudio.java3d.TextureLoader; @@ -17,7 +19,7 @@ * * @author s.iwatani */ -public class RWTSprite { +public class RWTSprite implements RWTDrawable { private int[] textureId = null; private RWTImageLoader texLoader; private Texture tex; @@ -99,6 +101,10 @@ isEnableAlpha ? ImageComponent2D.FORMAT_RGBA : ImageComponent2D.FORMAT_RGB); image = texLoader.getImage(); tex = texLoader.getTexture(); + Log.v("moji", "faaa"); + Log.v("moji", ((Double)(texLoader.getSize().getX())).toString() + ", " + ((Double)(texLoader.getSize().getY())).toString()); + Log.v("moji", "faaa"); + texPos.setX(0.f); texPos.setY(image.getBitmap().getHeight()); texSize.setX(image.getBitmap().getWidth()); @@ -112,28 +118,14 @@ * 画像を描画する * * @author s.iwatani - * @param gl GL10 + * @param gc3D GL10 */ - public void draw(GL10 gl) { + public void draw(GraphicsContext3D gc3D) { boolean isNullTextureId = textureId == null; - if (isNullTextureId) { + if (textureId == null) { textureId = new int[1]; - gl.glGenTextures(1, textureId, 0); + textureId[0] = gc3D.loadImage(image); } - //テクスチャIDに対応するテクスチャをバインドする - gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId[0]); - - // 初回のみ画像を流し込む - if (isNullTextureId) { - GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, image.getBitmap(), 0); - } - - // 拡大縮小のアルゴリズム指定 - gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST); - gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST); - - int rect[] = { (int)texPos.getX(), (int)texPos.getY(), (int)texSize.getX(), (int)texSize.getY()}; - ((GL11) gl).glTexParameteriv(GL10.GL_TEXTURE_2D,GL11Ext.GL_TEXTURE_CROP_RECT_OES, rect, 0); - ((GL11Ext) gl).glDrawTexfOES((int)pos.getX(), (int)pos.getY(), (int)pos.getZ(), (int)viewSize.getX(), (int)viewSize.getY()); + gc3D.draw(textureId[0], pos, texPos, texSize, viewSize); } } 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 index 209b4dd..5a6b5a2 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTSprites.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/RWT/RWTSprites.java @@ -1,6 +1,7 @@ package org.ntlab.radishforandroidstudio.framework.RWT; -import javax.microedition.khronos.opengles.GL10; +import org.ntlab.radishforandroidstudio.java3d.GraphicsContext3D; + import java.util.ArrayList; /** @@ -9,7 +10,7 @@ * @author s.iwatani */ public class RWTSprites { - private ArrayList sprites = new ArrayList<>(); + private ArrayList sprites = new ArrayList<>(); public RWTSprites() {} @@ -36,34 +37,17 @@ /** * 登録されたスプライトの描画 * - * @param gl GL10 + * @param gc3D GraphicsContext3D */ - public void draw(GL10 gl) { - // なんかやってる - gl.glDisable(GL10.GL_DEPTH_TEST); - gl.glDisable(GL10.GL_DITHER); - gl.glDisable(GL10.GL_LIGHTING); - -// gl.glEnable(GL10.GL_ALPHA_TEST); - // アルファ値を適用するための一連 - gl.glEnable(GL10.GL_ALPHA); // GL_INVALID_ENUMが出るけどちゃんと動いてる.謎 - gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); - gl.glEnable(GL10.GL_BLEND); - - gl.glEnable(GL10.GL_TEXTURE_2D); - - // テクスチャ0番をアクティブにする(よくわからん) - gl.glActiveTexture(GL10.GL_TEXTURE0); + public void draw(GraphicsContext3D gc3D) { + gc3D.startDrawImage(); // 描画 - for (RWTSprite sprite : sprites) { - sprite.draw(gl); + for (RWTDrawable sprite : sprites) { + sprite.draw(gc3D); } // 戻し - gl.glEnable(GL10.GL_DEPTH_TEST); - gl.glEnable(GL10.GL_DITHER); - gl.glEnable(GL10.GL_LIGHTING); - gl.glDisable(GL10.GL_ALPHA); + 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 7b1451b..9fa2686 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,6 +2,11 @@ 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; diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/gameMain/RealTime3DActivity.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/gameMain/RealTime3DActivity.java index 2bb5dd7..2e6592d 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/gameMain/RealTime3DActivity.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/gameMain/RealTime3DActivity.java @@ -15,7 +15,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); universe = new Universe(); - + camera = new Camera3D(universe); view = new RWTSurfaceView(this); diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/gameMain/RealTimeActivity.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/gameMain/RealTimeActivity.java index 29025ca..0d8c19c 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/gameMain/RealTimeActivity.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/gameMain/RealTimeActivity.java @@ -18,7 +18,7 @@ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - } + } protected void start(long interval){ this.interval = interval; diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/java3d/GraphicsContext3D.java b/app/src/main/java/org/ntlab/radishforandroidstudio/java3d/GraphicsContext3D.java index cb0fe2e..cd13e19 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/java3d/GraphicsContext3D.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/java3d/GraphicsContext3D.java @@ -1,5 +1,6 @@ package org.ntlab.radishforandroidstudio.java3d; +import android.graphics.Bitmap; import android.opengl.GLU; import android.opengl.GLUtils; @@ -10,6 +11,8 @@ import java.util.HashMap; import javax.microedition.khronos.opengles.GL10; +import javax.microedition.khronos.opengles.GL11; +import javax.microedition.khronos.opengles.GL11Ext; public class GraphicsContext3D { private GL10 gl; @@ -348,6 +351,72 @@ } } + /** + * 画像を流し込む + * + * @author s.iwatani + * @param image ImageComponent2D + * @return int textureId + */ + public int loadImage(ImageComponent2D image) { + int[] textureId = new int[1]; + gl.glGenTextures(1, textureId, 0); + //テクスチャIDに対応するテクスチャをバインドする + gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId[0]); + + // 初回のみ画像を流し込む + GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, image.getBitmap(), 0); + return textureId[0]; + } + + /** + * Bitmap描画 + * + * @author s.iwatani + * @param textureId + * @param pos + * @param texPos + * @param texSize + * @param viewSize + */ + public void draw(int textureId, Position3D pos, Position3D texPos, Position3D texSize, Position3D viewSize) { + //テクスチャIDに対応するテクスチャをバインドする + gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId); + + // 拡大縮小のアルゴリズム指定 + gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST); + gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST); + + int rect[] = { (int)texPos.getX(), (int)texPos.getY(), (int)texSize.getX(), (int)texSize.getY()}; + ((GL11) gl).glTexParameteriv(GL10.GL_TEXTURE_2D, GL11Ext.GL_TEXTURE_CROP_RECT_OES, rect, 0); + ((GL11Ext) gl).glDrawTexfOES((int)pos.getX(), (int)pos.getY(), (int)pos.getZ(), (int)viewSize.getX(), (int)viewSize.getY()); + } + + public void startDrawImage() { + // なんかやってる + gl.glDisable(GL10.GL_DEPTH_TEST); + gl.glDisable(GL10.GL_DITHER); + gl.glDisable(GL10.GL_LIGHTING); + +// gl.glEnable(GL10.GL_ALPHA_TEST); + // アルファ値を適用するための一連 + gl.glEnable(GL10.GL_ALPHA); // GL_INVALID_ENUMが出るけどちゃんと動いてる.謎 + gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); + gl.glEnable(GL10.GL_BLEND); + + gl.glEnable(GL10.GL_TEXTURE_2D); + + // テクスチャ0番をアクティブにする(よくわからん) + gl.glActiveTexture(GL10.GL_TEXTURE0); + } + + public void endDrawImage() { + gl.glEnable(GL10.GL_DEPTH_TEST); + gl.glEnable(GL10.GL_DITHER); + gl.glEnable(GL10.GL_LIGHTING); + gl.glDisable(GL10.GL_ALPHA); + } + private void setTextureAttributes(TextureAttributes ta) { int textureMode = ta.getTextureMode(); switch (textureMode) { 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 b7affa1..1e8e6d5 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/spriteTest/TestActivity.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/spriteTest/TestActivity.java @@ -5,6 +5,12 @@ import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; +import android.view.SurfaceView; +import android.view.View; +import android.widget.Button; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TableLayout; import org.ntlab.radishforandroidstudio.R; import org.ntlab.radishforandroidstudio.framework.RWT.RWTSprite; @@ -98,6 +104,13 @@ 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); + sprite[0] = new RWTSprite(view); sprite[0].setTexture(getResources(), R.drawable.dice_6, false); @@ -119,7 +132,7 @@ long newTime = System.nanoTime(); physicalSystem.motion(0, 10, Force3D.ZERO, physicalSystem.objects.get(0).getGravityCenter(), null); - Log.v("moji", "" + ((System.nanoTime()-newTime)/1000.0)); +// Log.v("moji", "" + ((System.nanoTime()-newTime)/1000.0)); } @Override diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 9d26b30..35b4e02 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -16,4 +16,12 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> + +