Merge pull request #5 from jMonkeyEngine/master
Merge jMonkeyEngine/master into scenecomposer/masterexperimental
commit
a457b81d13
@ -1,152 +1,152 @@ |
|||||||
/* |
/* |
||||||
* Copyright (c) 2009-2012 jMonkeyEngine |
* Copyright (c) 2009-2012 jMonkeyEngine |
||||||
* All rights reserved. |
* All rights reserved. |
||||||
* |
* |
||||||
* Redistribution and use in source and binary forms, with or without |
* Redistribution and use in source and binary forms, with or without |
||||||
* modification, are permitted provided that the following conditions are |
* modification, are permitted provided that the following conditions are |
||||||
* met: |
* met: |
||||||
* |
* |
||||||
* * Redistributions of source code must retain the above copyright |
* * Redistributions of source code must retain the above copyright |
||||||
* notice, this list of conditions and the following disclaimer. |
* notice, this list of conditions and the following disclaimer. |
||||||
* |
* |
||||||
* * Redistributions in binary form must reproduce the above copyright |
* * Redistributions in binary form must reproduce the above copyright |
||||||
* notice, this list of conditions and the following disclaimer in the |
* notice, this list of conditions and the following disclaimer in the |
||||||
* documentation and/or other materials provided with the distribution. |
* documentation and/or other materials provided with the distribution. |
||||||
* |
* |
||||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||||
* may be used to endorse or promote products derived from this software |
* may be used to endorse or promote products derived from this software |
||||||
* without specific prior written permission. |
* without specific prior written permission. |
||||||
* |
* |
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
*/ |
*/ |
||||||
package jme3test.bullet; |
package jme3test.bullet; |
||||||
|
|
||||||
import com.jme3.app.SimpleApplication; |
import com.jme3.app.SimpleApplication; |
||||||
import com.jme3.bullet.BulletAppState; |
import com.jme3.bullet.BulletAppState; |
||||||
import com.jme3.bullet.PhysicsSpace; |
import com.jme3.bullet.PhysicsSpace; |
||||||
import com.jme3.bullet.collision.shapes.BoxCollisionShape; |
import com.jme3.bullet.collision.shapes.BoxCollisionShape; |
||||||
import com.jme3.bullet.collision.shapes.MeshCollisionShape; |
import com.jme3.bullet.collision.shapes.MeshCollisionShape; |
||||||
import com.jme3.bullet.collision.shapes.SphereCollisionShape; |
import com.jme3.bullet.collision.shapes.SphereCollisionShape; |
||||||
import com.jme3.bullet.control.RigidBodyControl; |
import com.jme3.bullet.control.RigidBodyControl; |
||||||
import com.jme3.input.MouseInput; |
import com.jme3.input.MouseInput; |
||||||
import com.jme3.input.controls.ActionListener; |
import com.jme3.input.controls.ActionListener; |
||||||
import com.jme3.input.controls.MouseButtonTrigger; |
import com.jme3.input.controls.MouseButtonTrigger; |
||||||
import com.jme3.material.Material; |
import com.jme3.material.Material; |
||||||
import com.jme3.math.ColorRGBA; |
import com.jme3.math.ColorRGBA; |
||||||
import com.jme3.math.Vector3f; |
import com.jme3.math.Vector3f; |
||||||
import com.jme3.renderer.RenderManager; |
import com.jme3.renderer.RenderManager; |
||||||
import com.jme3.renderer.queue.RenderQueue.ShadowMode; |
import com.jme3.renderer.queue.RenderQueue.ShadowMode; |
||||||
import com.jme3.scene.Geometry; |
import com.jme3.scene.Geometry; |
||||||
import com.jme3.scene.Node; |
import com.jme3.scene.Node; |
||||||
import com.jme3.scene.shape.Box; |
import com.jme3.scene.shape.Box; |
||||||
import com.jme3.scene.shape.Sphere; |
import com.jme3.scene.shape.Sphere; |
||||||
import com.jme3.scene.shape.Sphere.TextureMode; |
import com.jme3.scene.shape.Sphere.TextureMode; |
||||||
|
|
||||||
/** |
/** |
||||||
* |
* |
||||||
* @author normenhansen |
* @author normenhansen |
||||||
*/ |
*/ |
||||||
public class TestCcd extends SimpleApplication implements ActionListener { |
public class TestCcd extends SimpleApplication implements ActionListener { |
||||||
|
|
||||||
private Material mat; |
private Material mat; |
||||||
private Material mat2; |
private Material mat2; |
||||||
private Sphere bullet; |
private Sphere bullet; |
||||||
private SphereCollisionShape bulletCollisionShape; |
private SphereCollisionShape bulletCollisionShape; |
||||||
private BulletAppState bulletAppState; |
private BulletAppState bulletAppState; |
||||||
|
|
||||||
public static void main(String[] args) { |
public static void main(String[] args) { |
||||||
TestCcd app = new TestCcd(); |
TestCcd app = new TestCcd(); |
||||||
app.start(); |
app.start(); |
||||||
} |
} |
||||||
|
|
||||||
private void setupKeys() { |
private void setupKeys() { |
||||||
inputManager.addMapping("shoot", new MouseButtonTrigger(MouseInput.BUTTON_LEFT)); |
inputManager.addMapping("shoot", new MouseButtonTrigger(MouseInput.BUTTON_LEFT)); |
||||||
inputManager.addMapping("shoot2", new MouseButtonTrigger(MouseInput.BUTTON_RIGHT)); |
inputManager.addMapping("shoot2", new MouseButtonTrigger(MouseInput.BUTTON_RIGHT)); |
||||||
inputManager.addListener(this, "shoot"); |
inputManager.addListener(this, "shoot"); |
||||||
inputManager.addListener(this, "shoot2"); |
inputManager.addListener(this, "shoot2"); |
||||||
} |
} |
||||||
|
|
||||||
@Override |
@Override |
||||||
public void simpleInitApp() { |
public void simpleInitApp() { |
||||||
bulletAppState = new BulletAppState(); |
bulletAppState = new BulletAppState(); |
||||||
stateManager.attach(bulletAppState); |
stateManager.attach(bulletAppState); |
||||||
bulletAppState.getPhysicsSpace().enableDebug(assetManager); |
bulletAppState.setDebugEnabled(true); |
||||||
bullet = new Sphere(32, 32, 0.4f, true, false); |
bullet = new Sphere(32, 32, 0.4f, true, false); |
||||||
bullet.setTextureMode(TextureMode.Projected); |
bullet.setTextureMode(TextureMode.Projected); |
||||||
bulletCollisionShape = new SphereCollisionShape(0.1f); |
bulletCollisionShape = new SphereCollisionShape(0.1f); |
||||||
setupKeys(); |
setupKeys(); |
||||||
|
|
||||||
mat = new Material(getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md"); |
mat = new Material(getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md"); |
||||||
mat.getAdditionalRenderState().setWireframe(true); |
mat.getAdditionalRenderState().setWireframe(true); |
||||||
mat.setColor("Color", ColorRGBA.Green); |
mat.setColor("Color", ColorRGBA.Green); |
||||||
|
|
||||||
mat2 = new Material(getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md"); |
mat2 = new Material(getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md"); |
||||||
mat2.getAdditionalRenderState().setWireframe(true); |
mat2.getAdditionalRenderState().setWireframe(true); |
||||||
mat2.setColor("Color", ColorRGBA.Red); |
mat2.setColor("Color", ColorRGBA.Red); |
||||||
|
|
||||||
// An obstacle mesh, does not move (mass=0)
|
// An obstacle mesh, does not move (mass=0)
|
||||||
Node node2 = new Node(); |
Node node2 = new Node(); |
||||||
node2.setName("mesh"); |
node2.setName("mesh"); |
||||||
node2.setLocalTranslation(new Vector3f(2.5f, 0, 0f)); |
node2.setLocalTranslation(new Vector3f(2.5f, 0, 0f)); |
||||||
node2.addControl(new RigidBodyControl(new MeshCollisionShape(new Box(Vector3f.ZERO, 4, 4, 0.1f)), 0)); |
node2.addControl(new RigidBodyControl(new MeshCollisionShape(new Box(Vector3f.ZERO, 4, 4, 0.1f)), 0)); |
||||||
rootNode.attachChild(node2); |
rootNode.attachChild(node2); |
||||||
getPhysicsSpace().add(node2); |
getPhysicsSpace().add(node2); |
||||||
|
|
||||||
// The floor, does not move (mass=0)
|
// The floor, does not move (mass=0)
|
||||||
Node node3 = new Node(); |
Node node3 = new Node(); |
||||||
node3.setLocalTranslation(new Vector3f(0f, -6, 0f)); |
node3.setLocalTranslation(new Vector3f(0f, -6, 0f)); |
||||||
node3.addControl(new RigidBodyControl(new BoxCollisionShape(new Vector3f(100, 1, 100)), 0)); |
node3.addControl(new RigidBodyControl(new BoxCollisionShape(new Vector3f(100, 1, 100)), 0)); |
||||||
rootNode.attachChild(node3); |
rootNode.attachChild(node3); |
||||||
getPhysicsSpace().add(node3); |
getPhysicsSpace().add(node3); |
||||||
|
|
||||||
} |
} |
||||||
|
|
||||||
private PhysicsSpace getPhysicsSpace() { |
private PhysicsSpace getPhysicsSpace() { |
||||||
return bulletAppState.getPhysicsSpace(); |
return bulletAppState.getPhysicsSpace(); |
||||||
} |
} |
||||||
|
|
||||||
@Override |
@Override |
||||||
public void simpleUpdate(float tpf) { |
public void simpleUpdate(float tpf) { |
||||||
//TODO: add update code
|
//TODO: add update code
|
||||||
} |
} |
||||||
|
|
||||||
@Override |
@Override |
||||||
public void simpleRender(RenderManager rm) { |
public void simpleRender(RenderManager rm) { |
||||||
//TODO: add render code
|
//TODO: add render code
|
||||||
} |
} |
||||||
|
|
||||||
public void onAction(String binding, boolean value, float tpf) { |
public void onAction(String binding, boolean value, float tpf) { |
||||||
if (binding.equals("shoot") && !value) { |
if (binding.equals("shoot") && !value) { |
||||||
Geometry bulletg = new Geometry("bullet", bullet); |
Geometry bulletg = new Geometry("bullet", bullet); |
||||||
bulletg.setMaterial(mat); |
bulletg.setMaterial(mat); |
||||||
bulletg.setName("bullet"); |
bulletg.setName("bullet"); |
||||||
bulletg.setLocalTranslation(cam.getLocation()); |
bulletg.setLocalTranslation(cam.getLocation()); |
||||||
bulletg.setShadowMode(ShadowMode.CastAndReceive); |
bulletg.setShadowMode(ShadowMode.CastAndReceive); |
||||||
bulletg.addControl(new RigidBodyControl(bulletCollisionShape, 1)); |
bulletg.addControl(new RigidBodyControl(bulletCollisionShape, 1)); |
||||||
bulletg.getControl(RigidBodyControl.class).setCcdMotionThreshold(0.1f); |
bulletg.getControl(RigidBodyControl.class).setCcdMotionThreshold(0.1f); |
||||||
bulletg.getControl(RigidBodyControl.class).setLinearVelocity(cam.getDirection().mult(40)); |
bulletg.getControl(RigidBodyControl.class).setLinearVelocity(cam.getDirection().mult(40)); |
||||||
rootNode.attachChild(bulletg); |
rootNode.attachChild(bulletg); |
||||||
getPhysicsSpace().add(bulletg); |
getPhysicsSpace().add(bulletg); |
||||||
} else if (binding.equals("shoot2") && !value) { |
} else if (binding.equals("shoot2") && !value) { |
||||||
Geometry bulletg = new Geometry("bullet", bullet); |
Geometry bulletg = new Geometry("bullet", bullet); |
||||||
bulletg.setMaterial(mat2); |
bulletg.setMaterial(mat2); |
||||||
bulletg.setName("bullet"); |
bulletg.setName("bullet"); |
||||||
bulletg.setLocalTranslation(cam.getLocation()); |
bulletg.setLocalTranslation(cam.getLocation()); |
||||||
bulletg.setShadowMode(ShadowMode.CastAndReceive); |
bulletg.setShadowMode(ShadowMode.CastAndReceive); |
||||||
bulletg.addControl(new RigidBodyControl(bulletCollisionShape, 1)); |
bulletg.addControl(new RigidBodyControl(bulletCollisionShape, 1)); |
||||||
bulletg.getControl(RigidBodyControl.class).setLinearVelocity(cam.getDirection().mult(40)); |
bulletg.getControl(RigidBodyControl.class).setLinearVelocity(cam.getDirection().mult(40)); |
||||||
rootNode.attachChild(bulletg); |
rootNode.attachChild(bulletg); |
||||||
getPhysicsSpace().add(bulletg); |
getPhysicsSpace().add(bulletg); |
||||||
} |
} |
||||||
} |
} |
||||||
} |
} |
||||||
|
@ -1,98 +1,98 @@ |
|||||||
/* |
/* |
||||||
* Copyright (c) 2009-2012 jMonkeyEngine |
* Copyright (c) 2009-2012 jMonkeyEngine |
||||||
* All rights reserved. |
* All rights reserved. |
||||||
* |
* |
||||||
* Redistribution and use in source and binary forms, with or without |
* Redistribution and use in source and binary forms, with or without |
||||||
* modification, are permitted provided that the following conditions are |
* modification, are permitted provided that the following conditions are |
||||||
* met: |
* met: |
||||||
* |
* |
||||||
* * Redistributions of source code must retain the above copyright |
* * Redistributions of source code must retain the above copyright |
||||||
* notice, this list of conditions and the following disclaimer. |
* notice, this list of conditions and the following disclaimer. |
||||||
* |
* |
||||||
* * Redistributions in binary form must reproduce the above copyright |
* * Redistributions in binary form must reproduce the above copyright |
||||||
* notice, this list of conditions and the following disclaimer in the |
* notice, this list of conditions and the following disclaimer in the |
||||||
* documentation and/or other materials provided with the distribution. |
* documentation and/or other materials provided with the distribution. |
||||||
* |
* |
||||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||||
* may be used to endorse or promote products derived from this software |
* may be used to endorse or promote products derived from this software |
||||||
* without specific prior written permission. |
* without specific prior written permission. |
||||||
* |
* |
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
*/ |
*/ |
||||||
|
|
||||||
package jme3test.bullet; |
package jme3test.bullet; |
||||||
|
|
||||||
import com.jme3.app.SimpleApplication; |
import com.jme3.app.SimpleApplication; |
||||||
import com.jme3.bullet.BulletAppState; |
import com.jme3.bullet.BulletAppState; |
||||||
import com.jme3.bullet.PhysicsSpace; |
import com.jme3.bullet.PhysicsSpace; |
||||||
import com.jme3.bullet.collision.PhysicsCollisionEvent; |
import com.jme3.bullet.collision.PhysicsCollisionEvent; |
||||||
import com.jme3.bullet.collision.PhysicsCollisionListener; |
import com.jme3.bullet.collision.PhysicsCollisionListener; |
||||||
import com.jme3.bullet.collision.shapes.SphereCollisionShape; |
import com.jme3.bullet.collision.shapes.SphereCollisionShape; |
||||||
import com.jme3.renderer.RenderManager; |
import com.jme3.renderer.RenderManager; |
||||||
import com.jme3.scene.shape.Sphere; |
import com.jme3.scene.shape.Sphere; |
||||||
import com.jme3.scene.shape.Sphere.TextureMode; |
import com.jme3.scene.shape.Sphere.TextureMode; |
||||||
|
|
||||||
/** |
/** |
||||||
* |
* |
||||||
* @author normenhansen |
* @author normenhansen |
||||||
*/ |
*/ |
||||||
public class TestCollisionListener extends SimpleApplication implements PhysicsCollisionListener { |
public class TestCollisionListener extends SimpleApplication implements PhysicsCollisionListener { |
||||||
|
|
||||||
private BulletAppState bulletAppState; |
private BulletAppState bulletAppState; |
||||||
private Sphere bullet; |
private Sphere bullet; |
||||||
private SphereCollisionShape bulletCollisionShape; |
private SphereCollisionShape bulletCollisionShape; |
||||||
|
|
||||||
public static void main(String[] args) { |
public static void main(String[] args) { |
||||||
TestCollisionListener app = new TestCollisionListener(); |
TestCollisionListener app = new TestCollisionListener(); |
||||||
app.start(); |
app.start(); |
||||||
} |
} |
||||||
|
|
||||||
@Override |
@Override |
||||||
public void simpleInitApp() { |
public void simpleInitApp() { |
||||||
bulletAppState = new BulletAppState(); |
bulletAppState = new BulletAppState(); |
||||||
stateManager.attach(bulletAppState); |
stateManager.attach(bulletAppState); |
||||||
bulletAppState.getPhysicsSpace().enableDebug(assetManager); |
bulletAppState.setDebugEnabled(true); |
||||||
bullet = new Sphere(32, 32, 0.4f, true, false); |
bullet = new Sphere(32, 32, 0.4f, true, false); |
||||||
bullet.setTextureMode(TextureMode.Projected); |
bullet.setTextureMode(TextureMode.Projected); |
||||||
bulletCollisionShape = new SphereCollisionShape(0.4f); |
bulletCollisionShape = new SphereCollisionShape(0.4f); |
||||||
|
|
||||||
PhysicsTestHelper.createPhysicsTestWorld(rootNode, assetManager, bulletAppState.getPhysicsSpace()); |
PhysicsTestHelper.createPhysicsTestWorld(rootNode, assetManager, bulletAppState.getPhysicsSpace()); |
||||||
PhysicsTestHelper.createBallShooter(this, rootNode, bulletAppState.getPhysicsSpace()); |
PhysicsTestHelper.createBallShooter(this, rootNode, bulletAppState.getPhysicsSpace()); |
||||||
|
|
||||||
// add ourselves as collision listener
|
// add ourselves as collision listener
|
||||||
getPhysicsSpace().addCollisionListener(this); |
getPhysicsSpace().addCollisionListener(this); |
||||||
} |
} |
||||||
|
|
||||||
private PhysicsSpace getPhysicsSpace(){ |
private PhysicsSpace getPhysicsSpace(){ |
||||||
return bulletAppState.getPhysicsSpace(); |
return bulletAppState.getPhysicsSpace(); |
||||||
} |
} |
||||||
|
|
||||||
@Override |
@Override |
||||||
public void simpleUpdate(float tpf) { |
public void simpleUpdate(float tpf) { |
||||||
//TODO: add update code
|
//TODO: add update code
|
||||||
} |
} |
||||||
|
|
||||||
@Override |
@Override |
||||||
public void simpleRender(RenderManager rm) { |
public void simpleRender(RenderManager rm) { |
||||||
//TODO: add render code
|
//TODO: add render code
|
||||||
} |
} |
||||||
|
|
||||||
public void collision(PhysicsCollisionEvent event) { |
public void collision(PhysicsCollisionEvent event) { |
||||||
if ("Box".equals(event.getNodeA().getName()) || "Box".equals(event.getNodeB().getName())) { |
if ("Box".equals(event.getNodeA().getName()) || "Box".equals(event.getNodeB().getName())) { |
||||||
if ("bullet".equals(event.getNodeA().getName()) || "bullet".equals(event.getNodeB().getName())) { |
if ("bullet".equals(event.getNodeA().getName()) || "bullet".equals(event.getNodeB().getName())) { |
||||||
fpsText.setText("You hit the box!"); |
fpsText.setText("You hit the box!"); |
||||||
} |
} |
||||||
} |
} |
||||||
} |
} |
||||||
|
|
||||||
} |
} |
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,576 +0,0 @@ |
|||||||
package com.jme3.renderer.ios; |
|
||||||
|
|
||||||
//import android.graphics.Bitmap;
|
|
||||||
//import android.opengl.ETC1;
|
|
||||||
//import android.opengl.ETC1Util.ETC1Texture;
|
|
||||||
//import android.opengl.JmeIosGLES;
|
|
||||||
//import android.opengl.GLUtils;
|
|
||||||
//import com.jme3.asset.AndroidImageInfo;
|
|
||||||
import com.jme3.renderer.ios.JmeIosGLES; |
|
||||||
import com.jme3.math.FastMath; |
|
||||||
import com.jme3.renderer.RendererException; |
|
||||||
import com.jme3.texture.Image; |
|
||||||
import com.jme3.texture.Image.Format; |
|
||||||
import com.jme3.util.BufferUtils; |
|
||||||
import java.nio.ByteBuffer; |
|
||||||
import java.util.logging.Level; |
|
||||||
import java.util.logging.Logger; |
|
||||||
|
|
||||||
public class TextureUtil { |
|
||||||
|
|
||||||
private static final Logger logger = Logger.getLogger(TextureUtil.class.getName()); |
|
||||||
//TODO Make this configurable through appSettings
|
|
||||||
public static boolean ENABLE_COMPRESSION = true; |
|
||||||
private static boolean NPOT = false; |
|
||||||
private static boolean ETC1support = false; |
|
||||||
private static boolean DXT1 = false; |
|
||||||
private static boolean PVRTC = false; |
|
||||||
private static boolean DEPTH24_STENCIL8 = false; |
|
||||||
private static boolean DEPTH_TEXTURE = false; |
|
||||||
private static boolean RGBA8 = false; |
|
||||||
|
|
||||||
// Same constant used by both GL_ARM_rgba8 and GL_OES_rgb8_rgba8.
|
|
||||||
private static final int GL_RGBA8 = 0x8058; |
|
||||||
|
|
||||||
private static final int GL_DXT1 = 0x83F0; |
|
||||||
private static final int GL_DXT1A = 0x83F1; |
|
||||||
|
|
||||||
private static final int GL_DEPTH_STENCIL_OES = 0x84F9; |
|
||||||
private static final int GL_UNSIGNED_INT_24_8_OES = 0x84FA; |
|
||||||
private static final int GL_DEPTH24_STENCIL8_OES = 0x88F0; |
|
||||||
|
|
||||||
public static void loadTextureFeatures(String extensionString) { |
|
||||||
ETC1support = extensionString.contains("GL_OES_compressed_ETC1_RGB8_texture"); |
|
||||||
DEPTH24_STENCIL8 = extensionString.contains("GL_OES_packed_depth_stencil"); |
|
||||||
NPOT = extensionString.contains("GL_IMG_texture_npot") |
|
||||||
|| extensionString.contains("GL_OES_texture_npot") |
|
||||||
|| extensionString.contains("GL_NV_texture_npot_2D_mipmap"); |
|
||||||
|
|
||||||
PVRTC = extensionString.contains("GL_IMG_texture_compression_pvrtc"); |
|
||||||
|
|
||||||
DXT1 = extensionString.contains("GL_EXT_texture_compression_dxt1"); |
|
||||||
DEPTH_TEXTURE = extensionString.contains("GL_OES_depth_texture"); |
|
||||||
|
|
||||||
RGBA8 = extensionString.contains("GL_ARM_rgba8") || |
|
||||||
extensionString.contains("GL_OES_rgb8_rgba8"); |
|
||||||
|
|
||||||
logger.log(Level.FINE, "Supports ETC1? {0}", ETC1support); |
|
||||||
logger.log(Level.FINE, "Supports DEPTH24_STENCIL8? {0}", DEPTH24_STENCIL8); |
|
||||||
logger.log(Level.FINE, "Supports NPOT? {0}", NPOT); |
|
||||||
logger.log(Level.FINE, "Supports PVRTC? {0}", PVRTC); |
|
||||||
logger.log(Level.FINE, "Supports DXT1? {0}", DXT1); |
|
||||||
logger.log(Level.FINE, "Supports DEPTH_TEXTURE? {0}", DEPTH_TEXTURE); |
|
||||||
logger.log(Level.FINE, "Supports RGBA8? {0}", RGBA8); |
|
||||||
} |
|
||||||
|
|
||||||
/* |
|
||||||
private static void buildMipmap(Bitmap bitmap, boolean compress) { |
|
||||||
int level = 0; |
|
||||||
int height = bitmap.getHeight(); |
|
||||||
int width = bitmap.getWidth(); |
|
||||||
|
|
||||||
logger.log(Level.FINEST, " - Generating mipmaps for bitmap using SOFTWARE"); |
|
||||||
|
|
||||||
JmeIosGLES.glPixelStorei(JmeIosGLES.GL_UNPACK_ALIGNMENT, 1); |
|
||||||
|
|
||||||
while (height >= 1 || width >= 1) { |
|
||||||
//First of all, generate the texture from our bitmap and set it to the according level
|
|
||||||
if (compress) { |
|
||||||
logger.log(Level.FINEST, " - Uploading LOD level {0} ({1}x{2}) with compression.", new Object[]{level, width, height}); |
|
||||||
uploadBitmapAsCompressed(JmeIosGLES.GL_TEXTURE_2D, level, bitmap, false, 0, 0); |
|
||||||
} else { |
|
||||||
logger.log(Level.FINEST, " - Uploading LOD level {0} ({1}x{2}) directly.", new Object[]{level, width, height}); |
|
||||||
GLUtils.texImage2D(JmeIosGLES.GL_TEXTURE_2D, level, bitmap, 0); |
|
||||||
} |
|
||||||
|
|
||||||
if (height == 1 || width == 1) { |
|
||||||
break; |
|
||||||
} |
|
||||||
|
|
||||||
//Increase the mipmap level
|
|
||||||
height /= 2; |
|
||||||
width /= 2; |
|
||||||
Bitmap bitmap2 = Bitmap.createScaledBitmap(bitmap, width, height, true); |
|
||||||
|
|
||||||
// Recycle any bitmaps created as a result of scaling the bitmap.
|
|
||||||
// Do not recycle the original image (mipmap level 0)
|
|
||||||
if (level != 0) { |
|
||||||
bitmap.recycle(); |
|
||||||
} |
|
||||||
|
|
||||||
bitmap = bitmap2; |
|
||||||
|
|
||||||
level++; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
private static void uploadBitmapAsCompressed(int target, int level, Bitmap bitmap, boolean subTexture, int x, int y) { |
|
||||||
if (bitmap.hasAlpha()) { |
|
||||||
logger.log(Level.FINEST, " - Uploading bitmap directly. Cannot compress as alpha present."); |
|
||||||
if (subTexture) { |
|
||||||
GLUtils.texSubImage2D(target, level, x, y, bitmap); |
|
||||||
JmeIosGLES.checkGLError(); |
|
||||||
} else { |
|
||||||
GLUtils.texImage2D(target, level, bitmap, 0); |
|
||||||
JmeIosGLES.checkGLError(); |
|
||||||
} |
|
||||||
} else { |
|
||||||
// Convert to RGB565
|
|
||||||
int bytesPerPixel = 2; |
|
||||||
Bitmap rgb565 = bitmap.copy(Bitmap.Config.RGB_565, true); |
|
||||||
|
|
||||||
// Put texture data into ByteBuffer
|
|
||||||
ByteBuffer inputImage = BufferUtils.createByteBuffer(bitmap.getRowBytes() * bitmap.getHeight()); |
|
||||||
rgb565.copyPixelsToBuffer(inputImage); |
|
||||||
inputImage.position(0); |
|
||||||
|
|
||||||
// Delete the copied RGB565 image
|
|
||||||
rgb565.recycle(); |
|
||||||
|
|
||||||
// Encode the image into the output bytebuffer
|
|
||||||
int encodedImageSize = ETC1.getEncodedDataSize(bitmap.getWidth(), bitmap.getHeight()); |
|
||||||
ByteBuffer compressedImage = BufferUtils.createByteBuffer(encodedImageSize); |
|
||||||
ETC1.encodeImage(inputImage, bitmap.getWidth(), |
|
||||||
bitmap.getHeight(), |
|
||||||
bytesPerPixel, |
|
||||||
bytesPerPixel * bitmap.getWidth(), |
|
||||||
compressedImage); |
|
||||||
|
|
||||||
// Delete the input image buffer
|
|
||||||
BufferUtils.destroyDirectBuffer(inputImage); |
|
||||||
|
|
||||||
// Create an ETC1Texture from the compressed image data
|
|
||||||
ETC1Texture etc1tex = new ETC1Texture(bitmap.getWidth(), bitmap.getHeight(), compressedImage); |
|
||||||
|
|
||||||
// Upload the ETC1Texture
|
|
||||||
if (bytesPerPixel == 2) { |
|
||||||
int oldSize = (bitmap.getRowBytes() * bitmap.getHeight()); |
|
||||||
int newSize = compressedImage.capacity(); |
|
||||||
logger.log(Level.FINEST, " - Uploading compressed image to GL, oldSize = {0}, newSize = {1}, ratio = {2}", new Object[]{oldSize, newSize, (float) oldSize / newSize}); |
|
||||||
if (subTexture) { |
|
||||||
JmeIosGLES.glCompressedTexSubImage2D(target, |
|
||||||
level, |
|
||||||
x, y, |
|
||||||
bitmap.getWidth(), |
|
||||||
bitmap.getHeight(), |
|
||||||
ETC1.ETC1_RGB8_OES, |
|
||||||
etc1tex.getData().capacity(), |
|
||||||
etc1tex.getData()); |
|
||||||
|
|
||||||
JmeIosGLES.checkGLError(); |
|
||||||
} else { |
|
||||||
JmeIosGLES.glCompressedTexImage2D(target, |
|
||||||
level, |
|
||||||
ETC1.ETC1_RGB8_OES, |
|
||||||
bitmap.getWidth(), |
|
||||||
bitmap.getHeight(), |
|
||||||
0, |
|
||||||
etc1tex.getData().capacity(), |
|
||||||
etc1tex.getData()); |
|
||||||
|
|
||||||
JmeIosGLES.checkGLError(); |
|
||||||
} |
|
||||||
|
|
||||||
// ETC1Util.loadTexture(target, level, 0, JmeIosGLES.GL_RGB,
|
|
||||||
// JmeIosGLES.GL_UNSIGNED_SHORT_5_6_5, etc1Texture);
|
|
||||||
// } else if (bytesPerPixel == 3) {
|
|
||||||
// ETC1Util.loadTexture(target, level, 0, JmeIosGLES.GL_RGB,
|
|
||||||
// JmeIosGLES.GL_UNSIGNED_BYTE, etc1Texture);
|
|
||||||
} |
|
||||||
|
|
||||||
BufferUtils.destroyDirectBuffer(compressedImage); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* <code>uploadTextureBitmap</code> uploads a native android bitmap |
|
||||||
*/ |
|
||||||
/* |
|
||||||
public static void uploadTextureBitmap(final int target, Bitmap bitmap, boolean needMips) { |
|
||||||
uploadTextureBitmap(target, bitmap, needMips, false, 0, 0); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* <code>uploadTextureBitmap</code> uploads a native android bitmap |
|
||||||
*/ |
|
||||||
/* |
|
||||||
public static void uploadTextureBitmap(final int target, Bitmap bitmap, boolean needMips, boolean subTexture, int x, int y) { |
|
||||||
boolean recycleBitmap = false; |
|
||||||
//TODO, maybe this should raise an exception when NPOT is not supported
|
|
||||||
|
|
||||||
boolean willCompress = ENABLE_COMPRESSION && ETC1support && !bitmap.hasAlpha(); |
|
||||||
if (needMips && willCompress) { |
|
||||||
// Image is compressed and mipmaps are desired, generate them
|
|
||||||
// using software.
|
|
||||||
buildMipmap(bitmap, willCompress); |
|
||||||
} else { |
|
||||||
if (willCompress) { |
|
||||||
// Image is compressed but mipmaps are not desired, upload directly.
|
|
||||||
logger.log(Level.FINEST, " - Uploading compressed bitmap. Mipmaps are not generated."); |
|
||||||
uploadBitmapAsCompressed(target, 0, bitmap, subTexture, x, y); |
|
||||||
|
|
||||||
} else { |
|
||||||
// Image is not compressed, mipmaps may or may not be desired.
|
|
||||||
logger.log(Level.FINEST, " - Uploading bitmap directly.{0}", |
|
||||||
(needMips |
|
||||||
? " Mipmaps will be generated in HARDWARE" |
|
||||||
: " Mipmaps are not generated.")); |
|
||||||
if (subTexture) { |
|
||||||
System.err.println("x : " + x + " y :" + y + " , " + bitmap.getWidth() + "/" + bitmap.getHeight()); |
|
||||||
GLUtils.texSubImage2D(target, 0, x, y, bitmap); |
|
||||||
JmeIosGLES.checkGLError(); |
|
||||||
} else { |
|
||||||
GLUtils.texImage2D(target, 0, bitmap, 0); |
|
||||||
JmeIosGLES.checkGLError(); |
|
||||||
} |
|
||||||
|
|
||||||
if (needMips) { |
|
||||||
// No pregenerated mips available,
|
|
||||||
// generate from base level if required
|
|
||||||
JmeIosGLES.glGenerateMipmap(target); |
|
||||||
JmeIosGLES.checkGLError(); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
if (recycleBitmap) { |
|
||||||
bitmap.recycle(); |
|
||||||
} |
|
||||||
} |
|
||||||
*/ |
|
||||||
|
|
||||||
public static void uploadTextureAny(Image img, int target, int index, boolean needMips) { |
|
||||||
/* |
|
||||||
if (img.getEfficentData() instanceof AndroidImageInfo) { |
|
||||||
logger.log(Level.FINEST, " === Uploading image {0}. Using BITMAP PATH === ", img); |
|
||||||
// If image was loaded from asset manager, use fast path
|
|
||||||
AndroidImageInfo imageInfo = (AndroidImageInfo) img.getEfficentData(); |
|
||||||
uploadTextureBitmap(target, imageInfo.getBitmap(), needMips); |
|
||||||
} else { |
|
||||||
*/ |
|
||||||
logger.log(Level.FINEST, " === Uploading image {0}. Using BUFFER PATH === ", img); |
|
||||||
boolean wantGeneratedMips = needMips && !img.hasMipmaps(); |
|
||||||
if (wantGeneratedMips && img.getFormat().isCompressed()) { |
|
||||||
logger.log(Level.WARNING, "Generating mipmaps is only" |
|
||||||
+ " supported for Bitmap based or non-compressed images!"); |
|
||||||
} |
|
||||||
|
|
||||||
// Upload using slower path
|
|
||||||
logger.log(Level.FINEST, " - Uploading bitmap directly.{0}", |
|
||||||
(wantGeneratedMips |
|
||||||
? " Mipmaps will be generated in HARDWARE" |
|
||||||
: " Mipmaps are not generated.")); |
|
||||||
|
|
||||||
uploadTexture(img, target, index); |
|
||||||
|
|
||||||
// Image was uploaded using slower path, since it is not compressed,
|
|
||||||
// then compress it
|
|
||||||
if (wantGeneratedMips) { |
|
||||||
// No pregenerated mips available,
|
|
||||||
// generate from base level if required
|
|
||||||
JmeIosGLES.glGenerateMipmap(target); |
|
||||||
JmeIosGLES.checkGLError(); |
|
||||||
} |
|
||||||
//}
|
|
||||||
} |
|
||||||
|
|
||||||
private static void unsupportedFormat(Format fmt) { |
|
||||||
throw new UnsupportedOperationException("The image format '" + fmt + "' is unsupported by the video hardware."); |
|
||||||
} |
|
||||||
|
|
||||||
public static IosGLImageFormat getImageFormat(Format fmt) throws UnsupportedOperationException { |
|
||||||
IosGLImageFormat imageFormat = new IosGLImageFormat(); |
|
||||||
switch (fmt) { |
|
||||||
case Depth32: |
|
||||||
case Depth32F: |
|
||||||
throw new UnsupportedOperationException("The image format '" |
|
||||||
+ fmt + "' is not supported by OpenGL ES 2.0 specification."); |
|
||||||
case Alpha8: |
|
||||||
imageFormat.format = JmeIosGLES.GL_ALPHA; |
|
||||||
imageFormat.dataType = JmeIosGLES.GL_UNSIGNED_BYTE; |
|
||||||
if (RGBA8) { |
|
||||||
imageFormat.renderBufferStorageFormat = GL_RGBA8; |
|
||||||
} else { |
|
||||||
// Highest precision alpha supported by vanilla OGLES2
|
|
||||||
imageFormat.renderBufferStorageFormat = JmeIosGLES.GL_RGBA4; |
|
||||||
} |
|
||||||
break; |
|
||||||
case Luminance8: |
|
||||||
imageFormat.format = JmeIosGLES.GL_LUMINANCE; |
|
||||||
imageFormat.dataType = JmeIosGLES.GL_UNSIGNED_BYTE; |
|
||||||
if (RGBA8) { |
|
||||||
imageFormat.renderBufferStorageFormat = GL_RGBA8; |
|
||||||
} else { |
|
||||||
// Highest precision luminance supported by vanilla OGLES2
|
|
||||||
imageFormat.renderBufferStorageFormat = JmeIosGLES.GL_RGB565; |
|
||||||
} |
|
||||||
break; |
|
||||||
case Luminance8Alpha8: |
|
||||||
imageFormat.format = JmeIosGLES.GL_LUMINANCE_ALPHA; |
|
||||||
imageFormat.dataType = JmeIosGLES.GL_UNSIGNED_BYTE; |
|
||||||
if (RGBA8) { |
|
||||||
imageFormat.renderBufferStorageFormat = GL_RGBA8; |
|
||||||
} else { |
|
||||||
imageFormat.renderBufferStorageFormat = JmeIosGLES.GL_RGBA4; |
|
||||||
} |
|
||||||
break; |
|
||||||
case RGB565: |
|
||||||
imageFormat.format = JmeIosGLES.GL_RGB; |
|
||||||
imageFormat.dataType = JmeIosGLES.GL_UNSIGNED_SHORT_5_6_5; |
|
||||||
imageFormat.renderBufferStorageFormat = JmeIosGLES.GL_RGB565; |
|
||||||
break; |
|
||||||
case RGB5A1: |
|
||||||
imageFormat.format = JmeIosGLES.GL_RGBA; |
|
||||||
imageFormat.dataType = JmeIosGLES.GL_UNSIGNED_SHORT_5_5_5_1; |
|
||||||
imageFormat.renderBufferStorageFormat = JmeIosGLES.GL_RGB5_A1; |
|
||||||
break; |
|
||||||
case RGB8: |
|
||||||
imageFormat.format = JmeIosGLES.GL_RGB; |
|
||||||
imageFormat.dataType = JmeIosGLES.GL_UNSIGNED_BYTE; |
|
||||||
if (RGBA8) { |
|
||||||
imageFormat.renderBufferStorageFormat = GL_RGBA8; |
|
||||||
} else { |
|
||||||
// Fallback: Use RGB565 if RGBA8 is not available.
|
|
||||||
imageFormat.renderBufferStorageFormat = JmeIosGLES.GL_RGB565; |
|
||||||
} |
|
||||||
break; |
|
||||||
case BGR8: |
|
||||||
imageFormat.format = JmeIosGLES.GL_RGB; |
|
||||||
imageFormat.dataType = JmeIosGLES.GL_UNSIGNED_BYTE; |
|
||||||
if (RGBA8) { |
|
||||||
imageFormat.renderBufferStorageFormat = GL_RGBA8; |
|
||||||
} else { |
|
||||||
imageFormat.renderBufferStorageFormat = JmeIosGLES.GL_RGB565; |
|
||||||
} |
|
||||||
break; |
|
||||||
case RGBA8: |
|
||||||
imageFormat.format = JmeIosGLES.GL_RGBA; |
|
||||||
imageFormat.dataType = JmeIosGLES.GL_UNSIGNED_BYTE; |
|
||||||
if (RGBA8) { |
|
||||||
imageFormat.renderBufferStorageFormat = GL_RGBA8; |
|
||||||
} else { |
|
||||||
imageFormat.renderBufferStorageFormat = JmeIosGLES.GL_RGBA4; |
|
||||||
} |
|
||||||
break; |
|
||||||
case Depth: |
|
||||||
case Depth16: |
|
||||||
if (!DEPTH_TEXTURE) { |
|
||||||
unsupportedFormat(fmt); |
|
||||||
} |
|
||||||
imageFormat.format = JmeIosGLES.GL_DEPTH_COMPONENT; |
|
||||||
imageFormat.dataType = JmeIosGLES.GL_UNSIGNED_SHORT; |
|
||||||
imageFormat.renderBufferStorageFormat = JmeIosGLES.GL_DEPTH_COMPONENT16; |
|
||||||
break; |
|
||||||
case Depth24: |
|
||||||
case Depth24Stencil8: |
|
||||||
if (!DEPTH_TEXTURE) { |
|
||||||
unsupportedFormat(fmt); |
|
||||||
} |
|
||||||
if (DEPTH24_STENCIL8) { |
|
||||||
// NEW: True Depth24 + Stencil8 format.
|
|
||||||
imageFormat.format = GL_DEPTH_STENCIL_OES; |
|
||||||
imageFormat.dataType = GL_UNSIGNED_INT_24_8_OES; |
|
||||||
imageFormat.renderBufferStorageFormat = GL_DEPTH24_STENCIL8_OES; |
|
||||||
} else { |
|
||||||
// Vanilla OGLES2, only Depth16 available.
|
|
||||||
imageFormat.format = JmeIosGLES.GL_DEPTH_COMPONENT; |
|
||||||
imageFormat.dataType = JmeIosGLES.GL_UNSIGNED_SHORT; |
|
||||||
imageFormat.renderBufferStorageFormat = JmeIosGLES.GL_DEPTH_COMPONENT16; |
|
||||||
} |
|
||||||
break; |
|
||||||
case DXT1: |
|
||||||
if (!DXT1) { |
|
||||||
unsupportedFormat(fmt); |
|
||||||
} |
|
||||||
imageFormat.format = GL_DXT1; |
|
||||||
imageFormat.dataType = JmeIosGLES.GL_UNSIGNED_BYTE; |
|
||||||
imageFormat.compress = true; |
|
||||||
break; |
|
||||||
case DXT1A: |
|
||||||
if (!DXT1) { |
|
||||||
unsupportedFormat(fmt); |
|
||||||
} |
|
||||||
imageFormat.format = GL_DXT1A; |
|
||||||
imageFormat.dataType = JmeIosGLES.GL_UNSIGNED_BYTE; |
|
||||||
imageFormat.compress = true; |
|
||||||
break; |
|
||||||
default: |
|
||||||
throw new UnsupportedOperationException("Unrecognized format: " + fmt); |
|
||||||
} |
|
||||||
return imageFormat; |
|
||||||
} |
|
||||||
|
|
||||||
public static class IosGLImageFormat { |
|
||||||
|
|
||||||
boolean compress = false; |
|
||||||
int format = -1; |
|
||||||
int renderBufferStorageFormat = -1; |
|
||||||
int dataType = -1; |
|
||||||
} |
|
||||||
|
|
||||||
private static void uploadTexture(Image img, |
|
||||||
int target, |
|
||||||
int index) { |
|
||||||
|
|
||||||
/* |
|
||||||
if (img.getEfficentData() instanceof AndroidImageInfo) { |
|
||||||
throw new RendererException("This image uses efficient data. " |
|
||||||
+ "Use uploadTextureBitmap instead."); |
|
||||||
} |
|
||||||
*/ |
|
||||||
|
|
||||||
// Otherwise upload image directly.
|
|
||||||
// Prefer to only use power of 2 textures here to avoid errors.
|
|
||||||
Image.Format fmt = img.getFormat(); |
|
||||||
ByteBuffer data; |
|
||||||
if (index >= 0 || img.getData() != null && img.getData().size() > 0) { |
|
||||||
data = img.getData(index); |
|
||||||
} else { |
|
||||||
data = null; |
|
||||||
} |
|
||||||
|
|
||||||
int width = img.getWidth(); |
|
||||||
int height = img.getHeight(); |
|
||||||
|
|
||||||
if (!NPOT && img.isNPOT()) { |
|
||||||
// Check if texture is POT
|
|
||||||
throw new RendererException("Non-power-of-2 textures " |
|
||||||
+ "are not supported by the video hardware " |
|
||||||
+ "and no scaling path available for image: " + img); |
|
||||||
} |
|
||||||
IosGLImageFormat imageFormat = getImageFormat(fmt); |
|
||||||
|
|
||||||
if (data != null) { |
|
||||||
JmeIosGLES.glPixelStorei(JmeIosGLES.GL_UNPACK_ALIGNMENT, 1); |
|
||||||
JmeIosGLES.checkGLError(); |
|
||||||
} |
|
||||||
|
|
||||||
int[] mipSizes = img.getMipMapSizes(); |
|
||||||
int pos = 0; |
|
||||||
if (mipSizes == null) { |
|
||||||
if (data != null) { |
|
||||||
mipSizes = new int[]{data.capacity()}; |
|
||||||
} else { |
|
||||||
mipSizes = new int[]{width * height * fmt.getBitsPerPixel() / 8}; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
for (int i = 0; i < mipSizes.length; i++) { |
|
||||||
int mipWidth = Math.max(1, width >> i); |
|
||||||
int mipHeight = Math.max(1, height >> i); |
|
||||||
|
|
||||||
if (data != null) { |
|
||||||
data.position(pos); |
|
||||||
data.limit(pos + mipSizes[i]); |
|
||||||
} |
|
||||||
|
|
||||||
if (imageFormat.compress && data != null) { |
|
||||||
JmeIosGLES.glCompressedTexImage2D(target, |
|
||||||
i, |
|
||||||
imageFormat.format, |
|
||||||
mipWidth, |
|
||||||
mipHeight, |
|
||||||
0, |
|
||||||
data.remaining(), |
|
||||||
data); |
|
||||||
} else { |
|
||||||
JmeIosGLES.glTexImage2D(target, |
|
||||||
i, |
|
||||||
imageFormat.format, |
|
||||||
mipWidth, |
|
||||||
mipHeight, |
|
||||||
0, |
|
||||||
imageFormat.format, |
|
||||||
imageFormat.dataType, |
|
||||||
data); |
|
||||||
} |
|
||||||
JmeIosGLES.checkGLError(); |
|
||||||
|
|
||||||
pos += mipSizes[i]; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Update the texture currently bound to target at with data from the given |
|
||||||
* Image at position x and y. The parameter index is used as the zoffset in |
|
||||||
* case a 3d texture or texture 2d array is being updated. |
|
||||||
* |
|
||||||
* @param image Image with the source data (this data will be put into the |
|
||||||
* texture) |
|
||||||
* @param target the target texture |
|
||||||
* @param index the mipmap level to update |
|
||||||
* @param x the x position where to put the image in the texture |
|
||||||
* @param y the y position where to put the image in the texture |
|
||||||
*/ |
|
||||||
public static void uploadSubTexture( |
|
||||||
Image img, |
|
||||||
int target, |
|
||||||
int index, |
|
||||||
int x, |
|
||||||
int y) { |
|
||||||
//TODO:
|
|
||||||
/* |
|
||||||
if (img.getEfficentData() instanceof AndroidImageInfo) { |
|
||||||
AndroidImageInfo imageInfo = (AndroidImageInfo) img.getEfficentData(); |
|
||||||
uploadTextureBitmap(target, imageInfo.getBitmap(), true, true, x, y); |
|
||||||
return; |
|
||||||
} |
|
||||||
*/ |
|
||||||
|
|
||||||
// Otherwise upload image directly.
|
|
||||||
// Prefer to only use power of 2 textures here to avoid errors.
|
|
||||||
Image.Format fmt = img.getFormat(); |
|
||||||
ByteBuffer data; |
|
||||||
if (index >= 0 || img.getData() != null && img.getData().size() > 0) { |
|
||||||
data = img.getData(index); |
|
||||||
} else { |
|
||||||
data = null; |
|
||||||
} |
|
||||||
|
|
||||||
int width = img.getWidth(); |
|
||||||
int height = img.getHeight(); |
|
||||||
|
|
||||||
if (!NPOT && img.isNPOT()) { |
|
||||||
// Check if texture is POT
|
|
||||||
throw new RendererException("Non-power-of-2 textures " |
|
||||||
+ "are not supported by the video hardware " |
|
||||||
+ "and no scaling path available for image: " + img); |
|
||||||
} |
|
||||||
IosGLImageFormat imageFormat = getImageFormat(fmt); |
|
||||||
|
|
||||||
if (data != null) { |
|
||||||
JmeIosGLES.glPixelStorei(JmeIosGLES.GL_UNPACK_ALIGNMENT, 1); |
|
||||||
JmeIosGLES.checkGLError(); |
|
||||||
} |
|
||||||
|
|
||||||
int[] mipSizes = img.getMipMapSizes(); |
|
||||||
int pos = 0; |
|
||||||
if (mipSizes == null) { |
|
||||||
if (data != null) { |
|
||||||
mipSizes = new int[]{data.capacity()}; |
|
||||||
} else { |
|
||||||
mipSizes = new int[]{width * height * fmt.getBitsPerPixel() / 8}; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
for (int i = 0; i < mipSizes.length; i++) { |
|
||||||
int mipWidth = Math.max(1, width >> i); |
|
||||||
int mipHeight = Math.max(1, height >> i); |
|
||||||
|
|
||||||
if (data != null) { |
|
||||||
data.position(pos); |
|
||||||
data.limit(pos + mipSizes[i]); |
|
||||||
} |
|
||||||
|
|
||||||
if (imageFormat.compress && data != null) { |
|
||||||
JmeIosGLES.glCompressedTexSubImage2D(target, i, x, y, mipWidth, mipHeight, imageFormat.format, data.remaining(), data); |
|
||||||
JmeIosGLES.checkGLError(); |
|
||||||
} else { |
|
||||||
JmeIosGLES.glTexSubImage2D(target, i, x, y, mipWidth, mipHeight, imageFormat.format, imageFormat.dataType, data); |
|
||||||
JmeIosGLES.checkGLError(); |
|
||||||
} |
|
||||||
|
|
||||||
pos += mipSizes[i]; |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
Loading…
Reference in new issue