diff --git a/app/src/main/java/com/google/ar/core/examples/java/common/framework/RWT/RWTRenderer.java b/app/src/main/java/com/google/ar/core/examples/java/common/framework/RWT/RWTRenderer.java index 24a4558..8619fec 100644 --- a/app/src/main/java/com/google/ar/core/examples/java/common/framework/RWT/RWTRenderer.java +++ b/app/src/main/java/com/google/ar/core/examples/java/common/framework/RWT/RWTRenderer.java @@ -1,14 +1,19 @@ package com.google.ar.core.examples.java.common.framework.RWT; +import android.opengl.GLES20; import android.opengl.GLSurfaceView.Renderer; +import com.google.ar.core.Camera; +import com.google.ar.core.Frame; import com.google.ar.core.Session; import com.google.ar.core.examples.java.common.framework.model3D.Universe; import com.google.ar.core.examples.java.common.framework.view3D.Camera3D; import com.google.ar.core.examples.java.common.framework.view3D.Viewer3D; import com.google.ar.core.examples.java.common.java3d.GraphicsContext3D; import com.google.ar.core.examples.java.common.java3d.Light; +import com.google.ar.core.examples.java.common.rendering.BackgroundRenderer; import com.google.ar.core.examples.java.helloar.HelloArActivity; +import com.google.ar.core.exceptions.CameraNotAvailableException; import java.util.ArrayList; @@ -18,16 +23,25 @@ public class RWTRenderer implements Renderer { protected Viewer3D viewer; protected Session session; + protected BackgroundRenderer backgroundRenderer; protected HelloArActivity helloArActivity; protected Universe universe; protected GraphicsContext3D gc3D = null; - public RWTRenderer(Session session, HelloArActivity helloArActivity) { + public RWTRenderer(HelloArActivity helloArActivity, BackgroundRenderer backgroundRenderer) { super(); - this.session = session; this.helloArActivity = helloArActivity; + this.backgroundRenderer = backgroundRenderer; } - + + public void setSession(Session session) { + this.session = session; + } + +// public void setBackgroundRenderer(BackgroundRenderer backgroundRenderer) { +// this.backgroundRenderer = backgroundRenderer; +// } + // public void attachCamera(Camera3D camera) { // // onSurfaceCreated()より先に呼ばれる // this.camera = camera; @@ -62,19 +76,38 @@ @Override public void onDrawFrame(GL10 gl) { -// if (gc3D == null) { -// gc3D = new GraphicsContext3D(gl); -// viewer.setGraphicsContext3D(gc3D); -// } else { -// viewer.setGraphicsContext3D(gc3D.setGL10(gl)); -// } -// viewer.onDrawFrame(); -// -// // 3Dモデルのレンダリング -// gc3D.pushMatrix(); -// universe.render(viewer); -// gc3D.popMatrix(); + GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); - helloArActivity.onDrawFrame(gl); + if(session == null) { + return; + } + try { + session.setCameraTextureName(backgroundRenderer.getTextureId()); + + Frame frame = session.update(); + Camera camera = frame.getCamera(); + + backgroundRenderer.draw(frame); + + if (viewer == null) { + viewer = new Viewer3D(camera); + } + + if (gc3D == null) { + gc3D = new GraphicsContext3D(gl); + viewer.setGraphicsContext3D(gc3D); + } else { + viewer.setGraphicsContext3D(gc3D.setGL10(gl)); + } + viewer.onDrawFrame(); +// +// // 3Dモデルのレンダリング +// gc3D.pushMatrix(); +// universe.render(viewer); +// gc3D.popMatrix(); + helloArActivity.onDrawFrame(gl, frame, camera); + } catch (CameraNotAvailableException e) { + e.printStackTrace(); + } } } diff --git a/app/src/main/java/com/google/ar/core/examples/java/common/framework/view3D/Viewer3D.java b/app/src/main/java/com/google/ar/core/examples/java/common/framework/view3D/Viewer3D.java index 0fc7f64..414b09c 100644 --- a/app/src/main/java/com/google/ar/core/examples/java/common/framework/view3D/Viewer3D.java +++ b/app/src/main/java/com/google/ar/core/examples/java/common/framework/view3D/Viewer3D.java @@ -45,7 +45,7 @@ // Position3D eye = camera.getViewPoint(); // Position3D center = eye.clone().add(camera.getViewLine()); // Vector3d up = camera.getViewUp(); -// gc3D.update((float)camera.getFieldOfView(), (float)camera.getFrontClipDistance(), (float)camera.getBackClipDistance(), eye, center, up, camera.isParallel()); + gc3D.update((float)camera.getFieldOfView(), (float)camera.getFrontClipDistance(), (float)camera.getBackClipDistance(), eye, center, up, camera.isParallel()); } @Override diff --git a/app/src/main/java/com/google/ar/core/examples/java/helloar/HelloArActivity.java b/app/src/main/java/com/google/ar/core/examples/java/helloar/HelloArActivity.java index e2f634e..1d8b73e 100644 --- a/app/src/main/java/com/google/ar/core/examples/java/helloar/HelloArActivity.java +++ b/app/src/main/java/com/google/ar/core/examples/java/helloar/HelloArActivity.java @@ -63,7 +63,7 @@ * ARCore API. The application will display any detected planes and will allow the user to tap on a * plane to place a 3d model of the Android robot. */ -public class HelloArActivity extends AppCompatActivity implements GLSurfaceView.Renderer { +public class HelloArActivity extends AppCompatActivity { private static final String TAG = HelloArActivity.class.getSimpleName(); // Rendering. The Renderers are created here, and initialized when the GL surface is created. @@ -108,7 +108,8 @@ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); surfaceView = findViewById(R.id.surfaceview); - renderer = new RWTRenderer(session, this); + renderer = new RWTRenderer(this, backgroundRenderer); +// renderer.setBackgroundRenderer(backgroundRenderer); displayRotationHelper = new DisplayRotationHelper(/*context=*/ this); // Set up tap listener. @@ -119,7 +120,7 @@ surfaceView.setPreserveEGLContextOnPause(true); surfaceView.setEGLContextClientVersion(2); surfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0); // Alpha used for plane blending. - surfaceView.setRenderer(this); + surfaceView.setRenderer(renderer); surfaceView.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY); surfaceView.setWillNotDraw(false); @@ -151,6 +152,7 @@ // Create the session. session = new Session(/* context= */ this); + renderer.setSession(session); } catch (UnavailableArcoreNotInstalledException | UnavailableUserDeclinedInstallationException e) { @@ -222,7 +224,6 @@ FullScreenHelper.setFullScreenOnWindowFocusChanged(this, hasFocus); } - @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { GLES20.glClearColor(0.1f, 0.1f, 0.1f, 1.0f); @@ -248,7 +249,6 @@ } } - @Override public void onSurfaceChanged(GL10 gl, int width, int height) { displayRotationHelper.onSurfaceChanged(width, height); GLES20.glViewport(0, 0, width, height); @@ -256,10 +256,9 @@ // renderer.onSurfaceChanged(gl, width, height); } - @Override - public void onDrawFrame(GL10 gl) { + public void onDrawFrame(GL10 gl, Frame frame, Camera camera) { // Clear screen to notify driver it should not load any pixels from previous frame. - GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); +// GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); if (session == null) { return; @@ -269,19 +268,19 @@ displayRotationHelper.updateSessionIfNeeded(session); try { - session.setCameraTextureName(backgroundRenderer.getTextureId()); +// session.setCameraTextureName(backgroundRenderer.getTextureId()); // Obtain the current frame from ARSession. When the configuration is set to // UpdateMode.BLOCKING (it is by default), this will throttle the rendering to the // camera framerate. - Frame frame = session.update(); - Camera camera = frame.getCamera(); +// Frame frame = session.update(); +// Camera camera = frame.getCamera(); // Handle one tap per frame. handleTap(frame, camera); // If frame is ready, render camera preview image to the GL surface. - backgroundRenderer.draw(frame); +// backgroundRenderer.draw(frame); // Keep the screen unlocked while tracking, but allow it to lock when tracking stops. trackingStateHelper.updateKeepScreenOnFlag(camera.getTrackingState()); @@ -342,7 +341,7 @@ virtualObject.draw(viewmtx, projmtx, colorCorrectionRgba, coloredAnchor.color); virtualObjectShadow.draw(viewmtx, projmtx, colorCorrectionRgba, coloredAnchor.color); - renderer.onDrawFrame(gl); +// renderer.onDrawFrame(gl); } } catch (Throwable t) {