Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package org.chromium.chromoting; | 5 package org.chromium.chromoting; |
| 6 | 6 |
| 7 import android.app.Activity; | 7 import android.app.Activity; |
| 8 import android.graphics.Bitmap; | 8 import android.graphics.Bitmap; |
| 9 import android.graphics.BitmapFactory; | 9 import android.graphics.BitmapFactory; |
| 10 import android.graphics.PointF; | 10 import android.graphics.PointF; |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 93 | 93 |
| 94 // Top | 94 // Top |
| 95 5, 1, 4, | 95 5, 1, 4, |
| 96 4, 1, 0, | 96 4, 1, 0, |
| 97 | 97 |
| 98 // Bottom | 98 // Bottom |
| 99 6, 2, 7, | 99 6, 2, 7, |
| 100 7, 2, 3 | 100 7, 2, 3 |
| 101 }); | 101 }); |
| 102 | 102 |
| 103 private static final String DESKTOP_VERTEX_SHADER = | |
| 104 "uniform mat4 u_CombinedMatrix;" | |
| 105 + "attribute vec4 a_Position;" | |
| 106 + "attribute vec2 a_TexCoordinate;" | |
| 107 + "varying vec2 v_TexCoordinate;" | |
| 108 + "void main() {" | |
| 109 + " v_TexCoordinate = a_TexCoordinate;" | |
| 110 + " gl_Position = u_CombinedMatrix * a_Position;" | |
| 111 + "}"; | |
| 112 | |
| 113 private static final String DESKTOP_FRAGMENT_SHADER = | |
| 114 "precision highp float;" | |
| 115 + "uniform sampler2D u_Texture;" | |
| 116 + "varying vec2 v_TexCoordinate;" | |
| 117 + "const float borderWidth = 0.002;" | |
| 118 + "void main() {" | |
| 119 + " if (v_TexCoordinate.x > (1.0 - borderWidth) || v_TexCoordinate. x < borderWidth" | |
| 120 + " || v_TexCoordinate.y > (1.0 - borderWidth)" | |
| 121 + " || v_TexCoordinate.y < borderWidth) {" | |
| 122 + " gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);" | |
| 123 + " } else {" | |
| 124 + " gl_FragColor = texture2D(u_Texture, v_TexCoordinate);" | |
| 125 + " }" | |
| 126 + "}"; | |
| 127 | |
| 128 private static final String SKYBOX_VERTEX_SHADER = | 103 private static final String SKYBOX_VERTEX_SHADER = |
| 129 "uniform mat4 u_CombinedMatrix;" | 104 "uniform mat4 u_CombinedMatrix;" |
| 130 + "attribute vec3 a_Position;" | 105 + "attribute vec3 a_Position;" |
| 131 + "varying vec3 v_Position;" | 106 + "varying vec3 v_Position;" |
| 132 + "void main() {" | 107 + "void main() {" |
| 133 + " v_Position = a_Position;" | 108 + " v_Position = a_Position;" |
| 134 // Make sure to convert from the right-handed coordinate system of t he | 109 // Make sure to convert from the right-handed coordinate system of t he |
| 135 // world to the left-handed coordinate system of the cube map, other wise, | 110 // world to the left-handed coordinate system of the cube map, other wise, |
| 136 // our cube map will still work but everything will be flipped. | 111 // our cube map will still work but everything will be flipped. |
| 137 + " v_Position.z = -v_Position.z;" | 112 + " v_Position.z = -v_Position.z;" |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 182 private float[] mEyePointCombinedMatrix; | 157 private float[] mEyePointCombinedMatrix; |
| 183 private float[] mSkyboxModelMatrix; | 158 private float[] mSkyboxModelMatrix; |
| 184 private float[] mSkyboxCombinedMatrix; | 159 private float[] mSkyboxCombinedMatrix; |
| 185 | 160 |
| 186 // Direction that user is looking towards. | 161 // Direction that user is looking towards. |
| 187 private float[] mForwardVector; | 162 private float[] mForwardVector; |
| 188 | 163 |
| 189 // Eye position in desktop. | 164 // Eye position in desktop. |
| 190 private float[] mEyePositionVector; | 165 private float[] mEyePositionVector; |
| 191 | 166 |
| 192 private int mDesktopCombinedMatrixHandle; | |
| 193 private int mPositionHandle; | |
| 194 private int mTextureDataHandle; | |
| 195 private int mTextureUniformHandle; | |
| 196 private int mTextureCoordinateHandle; | |
| 197 private int mProgramHandle; | |
| 198 private int mDesktopVertexShaderHandle; | |
| 199 private int mDesktopFragmentShaderHandle; | |
| 200 private int mSkyboxVertexShaderHandle; | 167 private int mSkyboxVertexShaderHandle; |
| 201 private int mSkyboxFragmentShaderHandle; | 168 private int mSkyboxFragmentShaderHandle; |
| 202 private int mSkyboxProgramHandle; | 169 private int mSkyboxProgramHandle; |
| 203 private int mSkyboxPositionHandle; | 170 private int mSkyboxPositionHandle; |
| 204 private int mSkyboxCombinedMatrixHandle; | 171 private int mSkyboxCombinedMatrixHandle; |
| 205 private int mSkyboxTextureUnitHandle; | 172 private int mSkyboxTextureUnitHandle; |
| 206 private int mSkyboxTextureDataHandle; | 173 private int mSkyboxTextureDataHandle; |
| 174 private CardboardActivityDesktop mDesktop; | |
| 207 private CardboardActivityEyePoint mEyePoint; | 175 private CardboardActivityEyePoint mEyePoint; |
| 208 | 176 |
| 209 // Flag to indicate whether reload the desktop texture or not. | 177 // Flag to indicate whether reload the desktop texture or not. |
| 210 private boolean mReloadTexture; | 178 private boolean mReloadTexture; |
| 211 | 179 |
| 212 /** Lock to allow multithreaded access to mReloadTexture. */ | 180 /** Lock to allow multithreaded access to mReloadTexture. */ |
| 213 private Object mReloadTextureLock = new Object(); | 181 private Object mReloadTextureLock = new Object(); |
| 214 | 182 |
| 215 // Lock for eye position related operations. | 183 // Lock for eye position related operations. |
| 216 // This protects access to mEyePositionVector as well as mDesktop{Height/Wid th}Pixels. | 184 // This protects access to mEyePositionVector as well as mDesktop{Height/Wid th}Pixels. |
| 217 private Object mEyePositionLock = new Object(); | 185 private Object mEyePositionLock = new Object(); |
| 218 | 186 |
| 219 private int mDesktopHeightPixels; | 187 private int mDesktopHeightPixels; |
| 220 private int mDesktopWidthPixels; | 188 private int mDesktopWidthPixels; |
| 221 | 189 |
| 222 private FloatBuffer mDesktopCoordinates; | 190 private FloatBuffer mDesktopCoordinates; |
|
Lambros
2015/08/19 23:17:28
I think this should be moved into the CardboardAct
shichengfeng
2015/08/20 01:02:54
Done.
| |
| 223 | 191 |
| 224 // Flag to signal that the skybox images are fully decoded and should be loa ded | 192 // Flag to signal that the skybox images are fully decoded and should be loa ded |
| 225 // into the OpenGL textures. | 193 // into the OpenGL textures. |
| 226 private boolean mLoadSkyboxImagesTexture; | 194 private boolean mLoadSkyboxImagesTexture; |
| 227 | 195 |
| 228 // Lock to allow multithreaded access to mLoadSkyboxImagesTexture. | 196 // Lock to allow multithreaded access to mLoadSkyboxImagesTexture. |
| 229 private Object mLoadSkyboxImagesTextureLock = new Object(); | 197 private Object mLoadSkyboxImagesTextureLock = new Object(); |
| 230 | 198 |
| 231 private ChromotingDownloadManager mDownloadManager; | 199 private ChromotingDownloadManager mDownloadManager; |
| 232 | 200 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 278 public void onSurfaceCreated(EGLConfig config) { | 246 public void onSurfaceCreated(EGLConfig config) { |
| 279 // Set the background clear color to black. | 247 // Set the background clear color to black. |
| 280 GLES20.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); | 248 GLES20.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); |
| 281 | 249 |
| 282 // Use culling to remove back faces. | 250 // Use culling to remove back faces. |
| 283 GLES20.glEnable(GLES20.GL_CULL_FACE); | 251 GLES20.glEnable(GLES20.GL_CULL_FACE); |
| 284 | 252 |
| 285 // Enable depth testing. | 253 // Enable depth testing. |
| 286 GLES20.glEnable(GLES20.GL_DEPTH_TEST); | 254 GLES20.glEnable(GLES20.GL_DEPTH_TEST); |
| 287 | 255 |
| 288 // Set handles for desktop drawing. | |
| 289 mDesktopVertexShaderHandle = | |
| 290 ShaderHelper.compileShader(GLES20.GL_VERTEX_SHADER, DESKTOP_VERT EX_SHADER); | |
| 291 mDesktopFragmentShaderHandle = | |
| 292 ShaderHelper.compileShader(GLES20.GL_FRAGMENT_SHADER, DESKTOP_FR AGMENT_SHADER); | |
| 293 mProgramHandle = ShaderHelper.createAndLinkProgram(mDesktopVertexShaderH andle, | |
| 294 mDesktopFragmentShaderHandle, new String[] {"a_Position", "a_Tex Coordinate"}); | |
| 295 mDesktopCombinedMatrixHandle = | |
| 296 GLES20.glGetUniformLocation(mProgramHandle, "u_CombinedMatrix"); | |
| 297 mTextureUniformHandle = GLES20.glGetUniformLocation(mProgramHandle, "u_T exture"); | |
| 298 mPositionHandle = GLES20.glGetAttribLocation(mProgramHandle, "a_Position "); | |
| 299 mTextureCoordinateHandle = GLES20.glGetAttribLocation(mProgramHandle, "a _TexCoordinate"); | |
| 300 mTextureDataHandle = TextureHelper.createTextureHandle(); | |
| 301 | |
| 302 // Set handlers for skybox drawing. | 256 // Set handlers for skybox drawing. |
| 303 GLES20.glEnable(GLES20.GL_TEXTURE_CUBE_MAP); | 257 GLES20.glEnable(GLES20.GL_TEXTURE_CUBE_MAP); |
| 304 mSkyboxVertexShaderHandle = | 258 mSkyboxVertexShaderHandle = |
| 305 ShaderHelper.compileShader(GLES20.GL_VERTEX_SHADER, SKYBOX_VERTE X_SHADER); | 259 ShaderHelper.compileShader(GLES20.GL_VERTEX_SHADER, SKYBOX_VERTE X_SHADER); |
| 306 mSkyboxFragmentShaderHandle = | 260 mSkyboxFragmentShaderHandle = |
| 307 ShaderHelper.compileShader(GLES20.GL_FRAGMENT_SHADER, SKYBOX_FRA GMENT_SHADER); | 261 ShaderHelper.compileShader(GLES20.GL_FRAGMENT_SHADER, SKYBOX_FRA GMENT_SHADER); |
| 308 mSkyboxProgramHandle = ShaderHelper.createAndLinkProgram(mSkyboxVertexSh aderHandle, | 262 mSkyboxProgramHandle = ShaderHelper.createAndLinkProgram(mSkyboxVertexSh aderHandle, |
| 309 mSkyboxFragmentShaderHandle, | 263 mSkyboxFragmentShaderHandle, |
| 310 new String[] {"a_Position", "u_CombinedMatrix", "u_TextureUnit"} ); | 264 new String[] {"a_Position", "u_CombinedMatrix", "u_TextureUnit"} ); |
| 311 mSkyboxPositionHandle = | 265 mSkyboxPositionHandle = |
| 312 GLES20.glGetAttribLocation(mSkyboxProgramHandle, "a_Position"); | 266 GLES20.glGetAttribLocation(mSkyboxProgramHandle, "a_Position"); |
| 313 mSkyboxCombinedMatrixHandle = | 267 mSkyboxCombinedMatrixHandle = |
| 314 GLES20.glGetUniformLocation(mSkyboxProgramHandle, "u_CombinedMat rix"); | 268 GLES20.glGetUniformLocation(mSkyboxProgramHandle, "u_CombinedMat rix"); |
| 315 mSkyboxTextureUnitHandle = | 269 mSkyboxTextureUnitHandle = |
| 316 GLES20.glGetUniformLocation(mSkyboxProgramHandle, "u_TextureUnit "); | 270 GLES20.glGetUniformLocation(mSkyboxProgramHandle, "u_TextureUnit "); |
| 317 mSkyboxTextureDataHandle = TextureHelper.createTextureHandle(); | 271 mSkyboxTextureDataHandle = TextureHelper.createTextureHandle(); |
| 318 | 272 |
| 273 mDesktop = new CardboardActivityDesktop(); | |
| 319 mEyePoint = new CardboardActivityEyePoint(); | 274 mEyePoint = new CardboardActivityEyePoint(); |
| 320 } | 275 } |
| 321 | 276 |
| 322 @Override | 277 @Override |
| 323 public void onSurfaceChanged(int width, int height) { | 278 public void onSurfaceChanged(int width, int height) { |
| 324 } | 279 } |
| 325 | 280 |
| 326 @Override | 281 @Override |
| 327 public void onNewFrame(HeadTransform headTransform) { | 282 public void onNewFrame(HeadTransform headTransform) { |
| 328 // Position the eye at the origin. | 283 // Position the eye at the origin. |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 340 | 295 |
| 341 // Set our up vector. This is where our head would be pointing were we h olding the camera. | 296 // Set our up vector. This is where our head would be pointing were we h olding the camera. |
| 342 float upX = 0.0f; | 297 float upX = 0.0f; |
| 343 float upY = 1.0f; | 298 float upY = 1.0f; |
| 344 float upZ = 0.0f; | 299 float upZ = 0.0f; |
| 345 | 300 |
| 346 Matrix.setLookAtM(mCameraMatrix, 0, eyeX, eyeY, eyeZ, lookX, lookY, look Z, upX, upY, upZ); | 301 Matrix.setLookAtM(mCameraMatrix, 0, eyeX, eyeY, eyeZ, lookX, lookY, look Z, upX, upY, upZ); |
| 347 | 302 |
| 348 headTransform.getForwardVector(mForwardVector, 0); | 303 headTransform.getForwardVector(mForwardVector, 0); |
| 349 getLookingPosition(); | 304 getLookingPosition(); |
| 350 maybeLoadTexture(mTextureDataHandle); | 305 maybeLoadDesktopTexture(); |
| 351 maybeLoadCubeMapAndCleanImages(mSkyboxTextureDataHandle); | 306 maybeLoadCubeMapAndCleanImages(mSkyboxTextureDataHandle); |
| 352 } | 307 } |
| 353 | 308 |
| 354 @Override | 309 @Override |
| 355 public void onDrawEye(Eye eye) { | 310 public void onDrawEye(Eye eye) { |
| 356 GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); | 311 GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); |
| 357 | 312 |
| 358 // Apply the eye transformation to the camera. | 313 // Apply the eye transformation to the camera. |
| 359 Matrix.multiplyMM(mViewMatrix, 0, eye.getEyeView(), 0, mCameraMatrix, 0) ; | 314 Matrix.multiplyMM(mViewMatrix, 0, eye.getEyeView(), 0, mCameraMatrix, 0) ; |
| 360 | 315 |
| 361 mProjectionMatrix = eye.getPerspective(Z_NEAR, Z_FAR); | 316 mProjectionMatrix = eye.getPerspective(Z_NEAR, Z_FAR); |
| 362 | 317 |
| 363 drawSkybox(); | 318 drawSkybox(); |
| 364 drawDesktop(); | 319 drawDesktop(); |
| 365 drawEyePoint(); | 320 drawEyePoint(); |
| 366 } | 321 } |
| 367 | 322 |
| 368 @Override | 323 @Override |
| 369 public void onRendererShutdown() { | 324 public void onRendererShutdown() { |
| 370 GLES20.glDeleteShader(mDesktopVertexShaderHandle); | 325 mDesktop.cleanup(); |
| 371 GLES20.glDeleteShader(mDesktopFragmentShaderHandle); | |
| 372 mEyePoint.cleanup(); | 326 mEyePoint.cleanup(); |
| 373 GLES20.glDeleteShader(mSkyboxVertexShaderHandle); | 327 GLES20.glDeleteShader(mSkyboxVertexShaderHandle); |
| 374 GLES20.glDeleteShader(mSkyboxFragmentShaderHandle); | 328 GLES20.glDeleteShader(mSkyboxFragmentShaderHandle); |
| 375 GLES20.glDeleteTextures(1, new int[] {mTextureDataHandle}, 0); | |
| 376 GLES20.glDeleteTextures(1, new int[] {mSkyboxTextureDataHandle}, 0); | 329 GLES20.glDeleteTextures(1, new int[] {mSkyboxTextureDataHandle}, 0); |
| 377 mActivity.runOnUiThread(new Runnable() { | 330 mActivity.runOnUiThread(new Runnable() { |
| 378 public void run() { | 331 public void run() { |
| 379 mDownloadManager.close(); | 332 mDownloadManager.close(); |
| 380 } | 333 } |
| 381 }); | 334 }); |
| 382 } | 335 } |
| 383 | 336 |
| 384 @Override | 337 @Override |
| 385 public void onFinishFrame(Viewport viewport) { | 338 public void onFinishFrame(Viewport viewport) { |
| 386 } | 339 } |
| 387 | 340 |
| 388 private void drawDesktop() { | 341 private void drawDesktop() { |
| 389 GLES20.glUseProgram(mProgramHandle); | 342 if (mDesktopCoordinates == null) { |
|
Lambros
2015/08/19 23:17:28
mDesktopCoordinates is no longer used in this meth
shichengfeng
2015/08/20 01:02:53
Done.
| |
| 343 // This can happen if the client is connected, but a complete video frame has not yet | |
| 344 // been decoded. | |
| 345 return; | |
| 346 } | |
| 390 | 347 |
| 391 // Translate the desktop model. | |
| 392 Matrix.setIdentityM(mDesktopModelMatrix, 0); | 348 Matrix.setIdentityM(mDesktopModelMatrix, 0); |
| 393 Matrix.translateM(mDesktopModelMatrix, 0, DESKTOP_POSITION_X, | 349 Matrix.translateM(mDesktopModelMatrix, 0, DESKTOP_POSITION_X, |
| 394 DESKTOP_POSITION_Y, DESKTOP_POSITION_Z); | 350 DESKTOP_POSITION_Y, DESKTOP_POSITION_Z); |
| 395 | 351 |
| 396 // Pass in Model View Matrix and Model View Project Matrix. | 352 // Pass in Model View Matrix and Model View Project Matrix. |
| 397 Matrix.multiplyMM(mDesktopCombinedMatrix, 0, mViewMatrix, 0, mDesktopMod elMatrix, 0); | 353 Matrix.multiplyMM(mDesktopCombinedMatrix, 0, mViewMatrix, 0, mDesktopMod elMatrix, 0); |
| 398 Matrix.multiplyMM(mDesktopCombinedMatrix, 0, mProjectionMatrix, | 354 Matrix.multiplyMM(mDesktopCombinedMatrix, 0, mProjectionMatrix, |
| 399 0, mDesktopCombinedMatrix, 0); | 355 0, mDesktopCombinedMatrix, 0); |
| 356 mDesktop.setCombinedMatrix(mDesktopCombinedMatrix); | |
| 400 | 357 |
| 401 // Pass in model view project matrix. | 358 mDesktop.draw(); |
| 402 GLES20.glUniformMatrix4fv(mDesktopCombinedMatrixHandle, 1, false, | |
| 403 mDesktopCombinedMatrix, 0); | |
| 404 | |
| 405 if (mDesktopCoordinates == null) { | |
| 406 // This can happen if the client is connected, but a complete video frame has not yet | |
| 407 // been decoded. | |
| 408 return; | |
| 409 } | |
| 410 // Pass in the desktop position. | |
| 411 GLES20.glVertexAttribPointer(mPositionHandle, POSITION_DATA_SIZE, GLES20 .GL_FLOAT, false, | |
| 412 0, mDesktopCoordinates); | |
| 413 GLES20.glEnableVertexAttribArray(mPositionHandle); | |
| 414 | |
| 415 // Pass in texture coordinate. | |
| 416 GLES20.glVertexAttribPointer(mTextureCoordinateHandle, TEXTURE_COORDINAT E_DATA_SIZE, | |
| 417 GLES20.GL_FLOAT, false, 0, DESKTOP_TEXTURE_COORDINATES); | |
| 418 GLES20.glEnableVertexAttribArray(mTextureCoordinateHandle); | |
| 419 | |
| 420 // Pass in texture data. | |
| 421 GLES20.glActiveTexture(GLES20.GL_TEXTURE0); | |
| 422 GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureDataHandle); | |
| 423 GLES20.glUniform1i(mTextureUniformHandle, 0); | |
| 424 | |
| 425 // Draw the desktop. | |
| 426 int totalPointNumber = 6; | |
| 427 GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, totalPointNumber); | |
| 428 } | 359 } |
| 429 | 360 |
| 430 private void drawEyePoint() { | 361 private void drawEyePoint() { |
| 431 if (!isLookingAtDesktop()) { | 362 if (!isLookingAtDesktop()) { |
| 432 return; | 363 return; |
| 433 } | 364 } |
| 434 | 365 |
| 435 float eyePointX = clamp(mEyePositionVector[0], -mHalfDesktopWidth, | 366 float eyePointX = clamp(mEyePositionVector[0], -mHalfDesktopWidth, |
| 436 mHalfDesktopWidth); | 367 mHalfDesktopWidth); |
| 437 float eyePointY = clamp(mEyePositionVector[1], -HALF_DESKTOP_HEIGHT, | 368 float eyePointY = clamp(mEyePositionVector[1], -HALF_DESKTOP_HEIGHT, |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 598 mEyePositionVector[1] = mForwardVector[1] * DESKTOP_POSITION_Z / mForwardVector[2]; | 529 mEyePositionVector[1] = mForwardVector[1] * DESKTOP_POSITION_Z / mForwardVector[2]; |
| 599 } | 530 } |
| 600 mEyePositionVector[2] = DESKTOP_POSITION_Z; | 531 mEyePositionVector[2] = DESKTOP_POSITION_Z; |
| 601 } | 532 } |
| 602 } | 533 } |
| 603 | 534 |
| 604 /** | 535 /** |
| 605 * Link desktop texture with textureDataHandle if {@link mReloadTexture} is true. | 536 * Link desktop texture with textureDataHandle if {@link mReloadTexture} is true. |
| 606 * @param textureDataHandle the handle we want attach texture to | 537 * @param textureDataHandle the handle we want attach texture to |
| 607 */ | 538 */ |
| 608 private void maybeLoadTexture(int textureDataHandle) { | 539 private void maybeLoadDesktopTexture() { |
| 609 synchronized (mReloadTextureLock) { | 540 synchronized (mReloadTextureLock) { |
| 610 if (!mReloadTexture) { | 541 if (!mReloadTexture) { |
| 611 return; | 542 return; |
| 612 } | 543 } |
| 613 } | 544 } |
| 614 | 545 |
| 615 // TODO(shichengfeng): Record the time desktop drawing takes. | 546 // TODO(shichengfeng): Record the time desktop drawing takes. |
| 616 Bitmap bitmap = JniInterface.getVideoFrame(); | 547 Bitmap bitmap = JniInterface.getVideoFrame(); |
| 617 | 548 |
| 618 if (bitmap == null) { | 549 if (bitmap == null) { |
| 619 // This can happen if the client is connected, but a complete video frame has not yet | 550 // This can happen if the client is connected, but a complete video frame has not yet |
| 620 // been decoded. | 551 // been decoded. |
| 621 return; | 552 return; |
| 622 } | 553 } |
| 623 | 554 |
| 624 synchronized (mEyePositionLock) { | 555 synchronized (mEyePositionLock) { |
| 625 mDesktopHeightPixels = bitmap.getHeight(); | 556 mDesktopHeightPixels = bitmap.getHeight(); |
| 626 mDesktopWidthPixels = bitmap.getWidth(); | 557 mDesktopWidthPixels = bitmap.getWidth(); |
| 627 } | 558 } |
| 628 | 559 |
| 629 updateDesktopCoordinatesBuffer(bitmap); | 560 updateDesktopCoordinatesBuffer(bitmap); |
| 630 TextureHelper.linkTexture(textureDataHandle, bitmap); | 561 mDesktop.setTexture(bitmap); |
| 631 | 562 |
| 632 synchronized (mReloadTextureLock) { | 563 synchronized (mReloadTextureLock) { |
| 633 mReloadTexture = false; | 564 mReloadTexture = false; |
| 634 } | 565 } |
| 635 } | 566 } |
| 636 | 567 |
| 637 /** | 568 /** |
| 638 * Convert float array to a FloatBuffer for use in OpenGL calls. | 569 * Convert float array to a FloatBuffer for use in OpenGL calls. |
| 639 */ | 570 */ |
| 640 private static FloatBuffer makeFloatBuffer(float[] data) { | 571 public static FloatBuffer makeFloatBuffer(float[] data) { |
| 641 FloatBuffer result = ByteBuffer | 572 FloatBuffer result = ByteBuffer |
| 642 .allocateDirect(data.length * BYTE_PER_FLOAT) | 573 .allocateDirect(data.length * BYTE_PER_FLOAT) |
| 643 .order(ByteOrder.nativeOrder()).asFloatBuffer(); | 574 .order(ByteOrder.nativeOrder()).asFloatBuffer(); |
| 644 result.put(data).position(0); | 575 result.put(data).position(0); |
| 645 return result; | 576 return result; |
| 646 } | 577 } |
| 647 | 578 |
| 648 /** | 579 /** |
| 649 * Update the desktop coordinates based on the new bitmap. Note here we fix the | 580 * Update the desktop coordinates based on the new bitmap. Note here we fix the |
| 650 * height of the desktop and vary width accordingly. | 581 * height of the desktop and vary width accordingly. |
| 651 */ | 582 */ |
| 652 private void updateDesktopCoordinatesBuffer(Bitmap bitmap) { | 583 private void updateDesktopCoordinatesBuffer(Bitmap bitmap) { |
|
Lambros
2015/08/19 23:17:28
Move this inside CardboardActivityDesktop as well.
shichengfeng
2015/08/20 01:02:53
Done.
| |
| 653 int width = bitmap.getWidth(); | 584 int width = bitmap.getWidth(); |
| 654 int height = bitmap.getHeight(); | 585 int height = bitmap.getHeight(); |
| 655 float newHalfDesktopWidth = width * HALF_DESKTOP_HEIGHT / height; | 586 float newHalfDesktopWidth = width * HALF_DESKTOP_HEIGHT / height; |
| 656 if (Math.abs(mHalfDesktopWidth - newHalfDesktopWidth) > 0.0001) { | 587 if (Math.abs(mHalfDesktopWidth - newHalfDesktopWidth) > 0.0001) { |
| 657 mHalfDesktopWidth = newHalfDesktopWidth; | 588 mHalfDesktopWidth = newHalfDesktopWidth; |
| 658 mDesktopCoordinates = makeFloatBuffer(new float[] { | 589 mDesktopCoordinates = makeFloatBuffer(new float[] { |
| 659 // Desktop model coordinates. | 590 // Desktop model coordinates. |
| 660 -mHalfDesktopWidth, HALF_DESKTOP_HEIGHT, 0.0f, | 591 -mHalfDesktopWidth, HALF_DESKTOP_HEIGHT, 0.0f, |
| 661 -mHalfDesktopWidth, -HALF_DESKTOP_HEIGHT, 0.0f, | 592 -mHalfDesktopWidth, -HALF_DESKTOP_HEIGHT, 0.0f, |
| 662 mHalfDesktopWidth, HALF_DESKTOP_HEIGHT, 0.0f, | 593 mHalfDesktopWidth, HALF_DESKTOP_HEIGHT, 0.0f, |
| 663 -mHalfDesktopWidth, -HALF_DESKTOP_HEIGHT, 0.0f, | 594 -mHalfDesktopWidth, -HALF_DESKTOP_HEIGHT, 0.0f, |
| 664 mHalfDesktopWidth, -HALF_DESKTOP_HEIGHT, 0.0f, | 595 mHalfDesktopWidth, -HALF_DESKTOP_HEIGHT, 0.0f, |
| 665 mHalfDesktopWidth, HALF_DESKTOP_HEIGHT, 0.0f | 596 mHalfDesktopWidth, HALF_DESKTOP_HEIGHT, 0.0f |
| 666 }); | 597 }); |
| 598 mDesktop.setPosition(mDesktopCoordinates); | |
| 667 } | 599 } |
| 668 } | 600 } |
| 669 | 601 |
| 670 /** | 602 /** |
| 671 * Decode all skybox images to Bitmap files and return them. | 603 * Decode all skybox images to Bitmap files and return them. |
| 672 * Only call this method when we have complete skybox images. | 604 * Only call this method when we have complete skybox images. |
| 673 * @throws DecodeFileException if BitmapFactory fails to decode file. | 605 * @throws DecodeFileException if BitmapFactory fails to decode file. |
| 674 */ | 606 */ |
| 675 private Bitmap[] decodeSkyboxImages() throws DecodeFileException { | 607 private Bitmap[] decodeSkyboxImages() throws DecodeFileException { |
| 676 Bitmap[] result = new Bitmap[SKYBOX_IMAGE_NAMES.length]; | 608 Bitmap[] result = new Bitmap[SKYBOX_IMAGE_NAMES.length]; |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 709 image.recycle(); | 641 image.recycle(); |
| 710 } | 642 } |
| 711 } | 643 } |
| 712 | 644 |
| 713 /** | 645 /** |
| 714 * Exception when BitmapFactory fails to decode file. | 646 * Exception when BitmapFactory fails to decode file. |
| 715 */ | 647 */ |
| 716 private static class DecodeFileException extends Exception { | 648 private static class DecodeFileException extends Exception { |
| 717 } | 649 } |
| 718 } | 650 } |
| OLD | NEW |