diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/MdgaApp.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/MdgaApp.java index 184695c1..f7e17132 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/MdgaApp.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/MdgaApp.java @@ -54,16 +54,38 @@ public void simpleInitApp() { UUID test0 = UUID.randomUUID(); UUID test1 = UUID.randomUUID(); List testList = new ArrayList<>(); - testList.add(test0); + testList.add(UUID.randomUUID()); + testList.add(UUID.randomUUID()); testList.add(test1); - testList.add(UUID.randomUUID()); - testList.add(UUID.randomUUID()); + testList.add(test0); + + UUID test0_1 = UUID.randomUUID(); + UUID test1_1 = UUID.randomUUID(); + List testList_1 = new ArrayList<>(); + testList_1.add(UUID.randomUUID()); + testList_1.add(UUID.randomUUID()); + testList_1.add(test1_1); + testList_1.add(test0_1); + + boardView.addPlayer(Color.AIRFORCE, testList); boardView.movePieceStart(test0, 0); - boardView.movePiece(test0, 38); - boardView.movePiece(test0, 39); - boardView.moveHomePiece(test0, Color.AIRFORCE,0); + boardView.movePiece(test0, 0, 1); + boardView.movePiece(test0, 1, 6); +// boardView.throwPiece(test0); + boardView.shieldPiece(test0); + + boardView.addPlayer(Color.CYBER, testList_1); + boardView.movePieceStart(test0_1, 10); + boardView.movePiece(test0_1, 10,14); + boardView.movePiece(test0_1, 14,15); + +// boardView.test(test0); + + +// boardView.moveHomePiece(test0, Color.AIRFORCE, 0); +// boardView.moveHomePiece(test0, Color.AIRFORCE,0); diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/board/BoardAsset.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/board/BoardAsset.java index c8198fe0..01625263 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/board/BoardAsset.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/board/BoardAsset.java @@ -28,6 +28,7 @@ enum BoardAsset { turboCard, // world(1.2f), world("./world_new/world_new.obj", "./world_new/world_new_diff.png", 1.2f), + shield_ring("./shield_ring/shield_ring.obj", null), tree_small("./tree_small/tree_small.obj", "./tree_small/tree_small_diff.png"), tree_big("./tree_big/tree_big.obj", "./tree_big/tree_big_diff.png"); diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/board/BoardHandler.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/board/BoardHandler.java index a44d383c..e0ea5398 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/board/BoardHandler.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/board/BoardHandler.java @@ -1,14 +1,10 @@ package pp.mdga.client.board; -import com.jme3.light.AmbientLight; -import com.jme3.light.DirectionalLight; import com.jme3.material.Material; -import com.jme3.math.ColorRGBA; import com.jme3.math.Vector3f; import com.jme3.renderer.queue.RenderQueue; import com.jme3.scene.Spatial; import com.jme3.scene.control.AbstractControl; -import com.jme3.shadow.DirectionalLightShadowRenderer; import pp.mdga.client.MdgaApp; import pp.mdga.game.Color; @@ -30,6 +26,8 @@ public class BoardHandler { private Map> colorAssetsMap; private Map> homeNodesMap; private Map> waitingNodesMap; + private Map> waitingPiecesMap; + private Map pieceColor; public BoardHandler(MdgaApp app) { assert (app != null) : "app is null"; @@ -41,17 +39,16 @@ public BoardHandler(MdgaApp app) { this.infield = new ArrayList<>(40); this.homeNodesMap = new HashMap<>(); this.waitingNodesMap = new HashMap<>(); + this.waitingPiecesMap = new HashMap<>(); + this.pieceColor = new HashMap<>(); initMap(); + } private void addFigureToPlayerMap(Color col, AssetOnMap assetOnMap) { - List inMap = colorAssetsMap.getOrDefault(col, new ArrayList<>()); - inMap.add(assetOnMap); - + List inMap = addItemToMapList(colorAssetsMap, col, assetOnMap); assert (inMap.size() <= 4) : "BoardView: to many assets for " + col; - - colorAssetsMap.put(col, inMap); } private void initMap() { @@ -108,16 +105,6 @@ private static Vector3f gridToWorld(int x, int y) { return new Vector3f(GRID_SIZE * x, GRID_SIZE * y, GRID_ELEVATION); } - public void addPlayer(Color color, List uuid) { - List playerAssets = colorAssetsMap.get(color); - assert (playerAssets != null) : "Assets for Player color are not defined"; - assert (uuid.size() == playerAssets.size()) : "UUID array and playerAssets are not the same size"; - - for (int i = 0; i < playerAssets.size(); i++){ - pieces.put(uuid.get(i), displayAndControl(playerAssets.get(i), new PieceControl())); - } - } - private Spatial displayAsset(AssetOnMap assetOnMap) { int x = assetOnMap.x(); int y = assetOnMap.y(); @@ -135,44 +122,160 @@ private void movePieceToNode(PieceControl pieceControl, NodeControl nodeControl) } private void addHomeNode(Map> map, Color color, AssetOnMap assetOnMap){ - List homeNodes = map.getOrDefault(color, new ArrayList<>()); - homeNodes.add(displayAndControl(assetOnMap, new NodeControl())); - map.put(color, homeNodes); + List homeNodes = addItemToMapList(map, color, displayAndControl(assetOnMap, new NodeControl())); assert(homeNodes.size() <= 4) : "BoardView: too many homeNodes for " + color; } - private float getRotationMove(Vector3f prev, Vector3f next, float rotation) { - if(prev == null) return rotation; - - // Calculate the direction vector from prev to next + private float getRotationMove(Vector3f prev, Vector3f next) { Vector3f direction = next.subtract(prev).normalizeLocal(); + //I had to reverse dir.y, because then it worked. + return (float) Math.toDegrees(Math.atan2(direction.x, -direction.y)); + } - // Determine the target angle based on the direction vector (we only care about movement on the X and Z axes) - float targetAngle = (float) Math.toDegrees(Math.atan2(direction.x, direction.y)); + private void movePiece_rek(UUID uuid, int curIndex, int moveIndex){ + if (curIndex == moveIndex) return; + curIndex = (curIndex + 1) % 40; - float angleDifference = targetAngle - rotation; + PieceControl pieceControl = pieces.get(uuid); + NodeControl nodeControl = infield.get(curIndex); - return angleDifference; + pieceControl.setRotation(getRotationMove(pieceControl.getLocation(),nodeControl.getLocation())); + + movePieceToNode(pieceControl, nodeControl); + + movePiece_rek(uuid, curIndex, moveIndex); + } + + private List addItemToMapList(Map> map, E key, T item){ + List list = map.getOrDefault(key, new ArrayList<>()); + list.add(item); + map.put(key, list); + return list; + } + + private List removeItemFromMapList(Map> map, E key, T item){ + List list = map.getOrDefault(key, new ArrayList<>()); + list.remove(item); + map.put(key, list); + return list; } //public methods**************************************************************************************************** - public void moveHomePiece(UUID uuid, Color color, int index){ + public void addPlayer(Color color, List uuid) { + List playerAssets = colorAssetsMap.get(color); + assert (playerAssets != null) : "Assets for Player color are not defined"; + assert (uuid.size() == playerAssets.size()) : "UUID array and playerAssets are not the same size"; + + List waitNodes = waitingNodesMap.get(color); + assert(waitNodes.size() == playerAssets.size()) : "BoardHandler: waitNodes size does not match playerAssets size"; + + + for (int i = 0; i < playerAssets.size(); i++){ + AssetOnMap assetOnMap = playerAssets.get(i); + PieceControl pieceControl = displayAndControl(assetOnMap, new PieceControl(assetOnMap.rot(), app.getAssetManager(), app.getRootNode())); + movePieceToNode(pieceControl, waitNodes.get(i)); + + pieces.put(uuid.get(i), pieceControl); + + pieceColor.put(uuid.get(i), color); + + addItemToMapList(waitingPiecesMap, color, pieceControl); + } + } + + public void moveHomePiece(UUID uuid, int index){ + Color color = pieceColor.get(uuid); + assert(color != null) : "BoardHandler: uuid is not mapped to a color"; + + List homeNodes = homeNodesMap.get(color); + assert(homeNodesMap.size() == 4) : "BoardView: HomeNodes for " + color + " are not defined"; - movePieceToNode(pieces.get(uuid), homeNodes.get(index)); + + PieceControl pieceControl = pieces.get(uuid); + NodeControl nodeControl = homeNodes.get(index); + movePieceToNode(pieceControl, nodeControl); + + //rotate piece in direction of homeNodes + NodeControl firstHomeNode = homeNodes.get(0); + NodeControl lastHomeNode = homeNodes.get(homeNodes.size()-1); + + pieceControl.setRotation(getRotationMove(firstHomeNode.getLocation(), lastHomeNode.getLocation())); } public void movePieceStart(UUID uuid, int nodeIndex){ - movePieceToNode(pieces.get(uuid), infield.get(nodeIndex)); + Color color = pieceColor.get(uuid); + assert(color != null) : "BoardHandler: uuid is not mapped to a color"; + + PieceControl pieceControl = pieces.get(uuid); + movePieceToNode(pieceControl, infield.get(nodeIndex)); + + removeItemFromMapList(waitingPiecesMap, color, pieceControl); } - public void movePiece(UUID uuid, int nodeIndex){ + public void movePiece(UUID uuid, int curIndex, int moveIndex){ + movePiece_rek(uuid, curIndex, moveIndex); + } + + public void throwPiece(UUID uuid){ + Color color = pieceColor.get(uuid); + assert(color != null) : "BoardHandler: uuid is not mapped to a color"; + PieceControl pieceControl = pieces.get(uuid); - System.out.println(pieceControl.getRotation()); - NodeControl nodeControl = infield.get(nodeIndex); - pieceControl.rotate(getRotationMove(pieceControl.getLocation(),nodeControl.getLocation(),pieceControl.getRotation())); - System.out.println(pieceControl.getRotation()); - movePieceToNode(pieceControl, nodeControl); + List waitNodes = waitingNodesMap.get(color); + List waitPieces = waitingPiecesMap.get(color); + + movePieceToNode(pieceControl, waitNodes.get(waitPieces.size())); + pieceControl.rotateInit(); + } + + public void shieldPiece(UUID uuid){ + pieces.get(uuid).activateShield(); + } + + public void unshieldPiece(UUID uuid){ + pieces.get(uuid).deactivateShield(); + } + + public void suppressShield(UUID uuid){ + pieces.get(uuid).suppressShield(); + } + + public void swapPieces(UUID piece1, UUID piece2){ + PieceControl piece1_control = pieces.get(piece1); + PieceControl piece2_control = pieces.get(piece2); + + assert(piece1_control != null) : "BoardHandler: swap: piece1 UUID is not valid"; + assert(piece2_control != null) : "BoardHandler: swap: piece2 UUID is not valid"; + + float rot1 = piece1_control.getRotation(); + float rot2 = piece2_control.getRotation(); + + piece1_control.setRotation(rot2); + piece2_control.setRotation(rot1); + + Vector3f pos1 = piece1_control.getLocation(); + Vector3f pos2 = piece2_control.getLocation(); + + piece1_control.setLocation(pos2); + piece2_control.setLocation(pos1); + } + + public void test(UUID uuid){ + System.out.println((float) Math.toDegrees(Math.atan2(1,0))); + System.out.println((float) Math.toDegrees(Math.atan2(-1,0))); + System.out.println((float) Math.toDegrees(Math.atan2(0,1))); + System.out.println((float) Math.toDegrees(Math.atan2(0,-1))); + + + + + System.out.println(pieces.get(uuid).getRotation()); + + pieces.get(uuid).setRotation(-90); + + System.out.println(pieces.get(uuid).getRotation()); + } } diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/board/PieceControl.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/board/PieceControl.java index d1d15d90..15ba84fd 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/board/PieceControl.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/board/PieceControl.java @@ -1,26 +1,58 @@ package pp.mdga.client.board; +import com.jme3.asset.AssetManager; +import com.jme3.material.Material; +import com.jme3.material.RenderState; +import com.jme3.math.ColorRGBA; import com.jme3.math.Quaternion; import com.jme3.math.Vector3f; import com.jme3.renderer.RenderManager; import com.jme3.renderer.ViewPort; +import com.jme3.renderer.queue.RenderQueue; +import com.jme3.scene.Node; import com.jme3.scene.Spatial; import com.jme3.scene.control.AbstractControl; public class PieceControl extends AbstractControl { private float rotation; + private final float initRotation; + private AssetManager assetManager; + private Spatial shieldRing; + private Node rootNode; + private Material shield_mat; - public PieceControl(){ + private static final float SHIELD_SPEED = 1f; + private static final float SHIELD_TRANSPARENCY = 0.6f; + private static final ColorRGBA SHIELD_COLOR = new ColorRGBA(0, 0.9f, 1, SHIELD_TRANSPARENCY); + private static final ColorRGBA SHIELD_SUPPRESSED_COLOR = new ColorRGBA(1f, 0.5f, 0, SHIELD_TRANSPARENCY); + private static final float SHIELD_Z = 0f; + + public PieceControl(float initRotation, AssetManager assetManager, Node rootNode){ super(); + this.initRotation = initRotation; + this.assetManager = assetManager; + this.shieldRing = null; + this.rootNode = rootNode; + + + this.shield_mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); + this.shield_mat.getAdditionalRenderState().setBlendMode(RenderState.BlendMode.Alpha); } public float getRotation() { - return rotation; + return (float) Math.toDegrees(this.spatial.getLocalRotation().toAngleAxis(new Vector3f(0,0,1))); +// return rotation; } - public void rotate(float rot){ - this.rotation = this.rotation + rot; - this.getSpatial().rotate(0, 0, (float) Math.toRadians(-rot)); + public void setRotation(float rot){ + Quaternion quaternion = new Quaternion(); + quaternion.fromAngleAxis((float) Math.toRadians(rot), new Vector3f(0,0,1)); + + this.spatial.setLocalRotation(quaternion); + + + +// this.getSpatial().rotate(0, 0, (float) Math.toRadians(rot)); } public Vector3f getLocation(){ @@ -28,8 +60,10 @@ public Vector3f getLocation(){ } @Override - protected void controlUpdate(float v) { - + protected void controlUpdate(float delta) { + if(shieldRing != null){ + shieldRing.rotate(0, 0, delta * SHIELD_SPEED); + } } @Override @@ -45,8 +79,35 @@ public void setLocation(Vector3f loc){ public void setSpatial(Spatial spatial){ super.setSpatial(spatial); if(spatial != null){ - Quaternion rot = spatial.getLocalRotation(); - this.rotation = (float) Math.toDegrees(rot.toAngleAxis(new Vector3f(Vector3f.UNIT_Z))); + setRotation(this.initRotation); } } + + public void rotateInit() { +// rotate(rotation - initRotation); + } + + public void activateShield(){ + shieldRing = assetManager.loadModel(BoardAsset.shield_ring.getModelPath()); + shieldRing.scale(1f); + shieldRing.rotate((float) Math.toRadians(0), 0, (float) Math.toRadians(0)); + shieldRing.setLocalTranslation(spatial.getLocalTranslation().add(new Vector3f(0,0,SHIELD_Z))); + + + shieldRing.setQueueBucket(RenderQueue.Bucket.Transparent); // Render in the transparent bucket + shield_mat.setColor("Color", SHIELD_COLOR); + shieldRing.setMaterial(shield_mat); + + rootNode.attachChild(shieldRing); + } + + public void deactivateShield(){ + rootNode.detachChild(shieldRing); + shieldRing = null; + } + + public void suppressShield(){ + assert(shieldRing != null) : "PieceControl: shieldRing is not set"; + shield_mat.setColor("Color", SHIELD_SUPPRESSED_COLOR); + } } diff --git a/Projekte/mdga/client/src/main/resources/map.mdga b/Projekte/mdga/client/src/main/resources/map.mdga index c8e4acf1..a68781ab 100644 --- a/Projekte/mdga/client/src/main/resources/map.mdga +++ b/Projekte/mdga/client/src/main/resources/map.mdga @@ -1,14 +1,13 @@ world 0,0 90 -tree_small 1,1 0 -tree_big 0,0 0 - +#tree_small 1,1 0 +#tree_big 0,0 0 #Marine Pos -marine 4,-5 270 -marine 4,-4 270 -marine 5,-4 270 -marine 5,-5 270 +marine 4,-5 -90 +marine 4,-4 -90 +marine 5,-4 -90 +marine 5,-5 -90 #Blue (Marine) wait Node node_wait_blue 4,-5 0 diff --git a/Projekte/mdga/client/src/main/resources/shield_ring/shield_ring.obj b/Projekte/mdga/client/src/main/resources/shield_ring/shield_ring.obj new file mode 100644 index 00000000..fa1ede49 --- /dev/null +++ b/Projekte/mdga/client/src/main/resources/shield_ring/shield_ring.obj @@ -0,0 +1,616 @@ +# Blender 3.6.5 +# www.blender.org +o shield +v 0.329363 -0.615745 1.151866 +v -0.000000 -0.615745 0.415793 +v -0.000000 -0.615745 1.151866 +v 0.329363 -0.615745 1.092511 +v -0.000000 -0.615745 0.415793 +v 0.326010 -0.615745 0.996204 +v 0.316022 -0.615745 0.901858 +v 0.299600 -0.615745 0.811392 +v 0.277080 -0.615745 0.726650 +v 0.248920 -0.615745 0.649355 +v 0.215692 -0.615745 0.581082 +v 0.178074 -0.615745 0.523220 +v 0.136832 -0.615745 0.476947 +v 0.092804 -0.615745 0.443205 +v 0.046887 -0.615745 0.422681 +v -0.329363 -0.615745 1.151866 +v -0.329363 -0.615745 1.092511 +v -0.326010 -0.615745 0.996204 +v -0.316022 -0.615745 0.901858 +v -0.299600 -0.615745 0.811392 +v -0.277080 -0.615745 0.726650 +v -0.248920 -0.615745 0.649355 +v -0.215692 -0.615745 0.581082 +v -0.178075 -0.615745 0.523220 +v -0.136832 -0.615745 0.476947 +v -0.092804 -0.615745 0.443205 +v -0.046887 -0.615745 0.422681 +v 0.329363 -0.590929 1.151866 +v -0.000000 -0.590929 1.151866 +v -0.000000 -0.590929 0.415793 +v -0.000000 -0.590929 0.415793 +v 0.046887 -0.590929 0.422681 +v 0.092804 -0.590929 0.443205 +v 0.136832 -0.590929 0.476947 +v 0.178074 -0.590929 0.523220 +v 0.215692 -0.590929 0.581082 +v 0.248920 -0.590929 0.649355 +v 0.277080 -0.590929 0.726650 +v 0.299600 -0.590929 0.811392 +v 0.316022 -0.590929 0.901858 +v 0.326010 -0.590929 0.996204 +v 0.329363 -0.590929 1.092511 +v -0.329363 -0.590929 1.151866 +v -0.046887 -0.590929 0.422681 +v -0.092804 -0.590929 0.443205 +v -0.136832 -0.590929 0.476947 +v -0.178075 -0.590929 0.523220 +v -0.215692 -0.590929 0.581082 +v -0.248920 -0.590929 0.649355 +v -0.277080 -0.590929 0.726650 +v -0.299600 -0.590929 0.811392 +v -0.316022 -0.590929 0.901858 +v -0.326010 -0.590929 0.996204 +v -0.329363 -0.590929 1.092511 +v -0.000000 0.740870 0.678108 +v -0.000000 0.740870 1.005550 +v 0.144537 0.726635 0.678108 +v 0.144537 0.726635 1.005550 +v 0.283519 0.684475 0.678108 +v 0.283519 0.684475 1.005550 +v 0.411605 0.616011 0.678108 +v 0.411605 0.616011 1.005550 +v 0.523874 0.523875 0.678108 +v 0.523874 0.523874 1.005550 +v 0.616011 0.411606 0.678108 +v 0.616011 0.411606 1.005550 +v 0.684475 0.283519 0.678108 +v 0.684475 0.283519 1.005550 +v 0.726635 0.144537 0.678108 +v 0.726635 0.144537 1.005550 +v 0.740870 0.000000 0.678108 +v 0.740870 0.000000 1.005550 +v 0.726635 -0.144537 0.678108 +v 0.726635 -0.144537 1.005550 +v 0.684475 -0.283519 0.678108 +v 0.684475 -0.283519 1.005550 +v 0.616011 -0.411605 0.678108 +v 0.616011 -0.411605 1.005550 +v 0.523874 -0.523874 0.678108 +v 0.523874 -0.523874 1.005550 +v 0.411605 -0.616011 0.678108 +v 0.411605 -0.616011 1.005550 +v -0.411606 -0.616011 0.678108 +v -0.411606 -0.616011 1.005550 +v -0.523875 -0.523874 0.678108 +v -0.523875 -0.523875 1.005550 +v -0.616011 -0.411606 0.678108 +v -0.616011 -0.411606 1.005550 +v -0.684475 -0.283519 0.678108 +v -0.684475 -0.283519 1.005550 +v -0.726635 -0.144537 0.678108 +v -0.726635 -0.144537 1.005550 +v -0.740870 -0.000000 0.678108 +v -0.740870 -0.000000 1.005550 +v -0.726635 0.144537 0.678108 +v -0.726635 0.144537 1.005550 +v -0.684475 0.283519 0.678108 +v -0.684475 0.283519 1.005550 +v -0.616011 0.411606 0.678108 +v -0.616011 0.411606 1.005550 +v -0.523875 0.523874 0.678108 +v -0.523875 0.523874 1.005550 +v -0.411606 0.616011 0.678108 +v -0.411606 0.616011 1.005550 +v -0.283519 0.684475 0.678108 +v -0.283519 0.684475 1.005550 +v -0.144537 0.726635 0.678108 +v -0.144537 0.726635 1.005550 +v -0.142275 0.717330 1.005550 +v -0.142275 0.717330 0.678108 +v -0.279082 0.675829 1.005550 +v -0.279082 0.675829 0.678108 +v -0.405165 0.608437 1.005550 +v -0.405165 0.608437 0.678108 +v -0.515677 0.517742 1.005550 +v -0.515677 0.517742 0.678108 +v -0.606372 0.407230 1.005550 +v -0.606372 0.407230 0.678108 +v -0.673764 0.281147 1.005550 +v -0.673764 0.281147 0.678108 +v -0.715265 0.144340 1.005550 +v -0.715265 0.144340 0.678108 +v -0.729277 0.002065 1.005550 +v -0.729277 0.002065 0.678108 +v -0.715265 -0.140210 1.005550 +v -0.715265 -0.140210 0.678108 +v -0.673764 -0.277017 1.005550 +v -0.673764 -0.277017 0.678108 +v -0.606372 -0.403100 1.005550 +v -0.606372 -0.403100 0.678108 +v -0.515677 -0.513612 1.005550 +v -0.515677 -0.513612 0.678108 +v -0.405165 -0.604307 0.678108 +v -0.405165 -0.604307 1.005550 +v 0.405165 -0.604307 1.005550 +v 0.405165 -0.604307 0.678108 +v 0.515677 -0.513612 1.005550 +v 0.515677 -0.513612 0.678108 +v 0.606372 -0.403100 1.005550 +v 0.606372 -0.403100 0.678108 +v 0.673764 -0.277017 1.005550 +v 0.673764 -0.277017 0.678108 +v 0.715264 -0.140210 1.005550 +v 0.715264 -0.140210 0.678108 +v 0.729277 0.002065 1.005550 +v 0.729277 0.002065 0.678108 +v 0.715264 0.144340 1.005550 +v 0.715264 0.144340 0.678108 +v 0.673764 0.281147 1.005550 +v 0.673764 0.281147 0.678108 +v 0.606372 0.407230 1.005550 +v 0.606372 0.407230 0.678108 +v 0.515677 0.517742 1.005550 +v 0.515677 0.517742 0.678108 +v 0.405165 0.608437 1.005550 +v 0.405165 0.608437 0.678108 +v 0.279082 0.675829 1.005550 +v 0.279082 0.675829 0.678108 +v -0.000000 0.731342 1.005550 +v 0.142275 0.717330 1.005550 +v 0.142275 0.717330 0.678108 +v -0.000000 0.731342 0.678108 +vn -0.0000 -0.0000 1.0000 +vn -0.9839 -0.0000 0.1786 +vn 0.9994 -0.0000 0.0348 +vn -0.4081 -0.0000 0.9130 +vn 0.7465 -0.0000 0.6654 +vn -0.9944 -0.0000 0.1053 +vn 1.0000 -0.0000 -0.0000 +vn -0.6083 -0.0000 0.7937 +vn 0.8384 -0.0000 0.5451 +vn -0.9994 -0.0000 0.0348 +vn -0.7465 -0.0000 0.6654 +vn 0.8992 -0.0000 0.4376 +vn -1.0000 -0.0000 -0.0000 +vn -0.8384 -0.0000 0.5451 +vn 0.9396 -0.0000 0.3423 +vn -0.0000 -0.0000 -1.0000 +vn -0.8992 -0.0000 0.4376 +vn 0.9665 -0.0000 0.2568 +vn 0.1453 -0.0000 0.9894 +vn -0.9396 -0.0000 0.3423 +vn 0.9839 -0.0000 0.1786 +vn 0.4081 -0.0000 0.9130 +vn -0.9665 -0.0000 0.2568 +vn 0.9944 -0.0000 0.1053 +vn -0.1453 -0.0000 0.9894 +vn 0.6083 -0.0000 0.7937 +vn 0.0980 0.9952 -0.0000 +vn 0.2903 0.9569 -0.0000 +vn 0.4714 0.8819 -0.0000 +vn 0.6344 0.7730 -0.0000 +vn 0.7730 0.6344 -0.0000 +vn 0.8819 0.4714 -0.0000 +vn 0.9569 0.2903 -0.0000 +vn 0.9952 0.0980 -0.0000 +vn 0.9952 -0.0980 -0.0000 +vn 0.9569 -0.2903 -0.0000 +vn 0.8819 -0.4714 -0.0000 +vn 0.7730 -0.6344 -0.0000 +vn 0.6344 -0.7730 -0.0000 +vn -0.6344 -0.7730 -0.0000 +vn -0.7730 -0.6344 -0.0000 +vn -0.8819 -0.4714 -0.0000 +vn -0.9569 -0.2903 -0.0000 +vn -0.9952 -0.0980 -0.0000 +vn -0.9952 0.0980 -0.0000 +vn -0.9569 0.2903 -0.0000 +vn -0.8819 0.4714 -0.0000 +vn -0.7730 0.6344 -0.0000 +vn -0.6344 0.7730 -0.0000 +vn -0.4714 0.8819 -0.0000 +vn -0.2903 0.9569 -0.0000 +vn -0.0980 0.9952 -0.0000 +vn -0.8761 -0.4821 -0.0000 +vn 0.4714 -0.8819 -0.0000 +vn -0.4714 -0.8819 -0.0000 +vn 0.8761 -0.4821 -0.0000 +vn -0.2903 -0.9569 -0.0000 +vn -0.0980 -0.9952 -0.0000 +vn 0.0980 -0.9952 -0.0000 +vn 0.2903 -0.9569 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vn -0.4081 -0.0000 0.9129 +vn 0.4081 -0.0000 0.9129 +vt 0.500025 0.000000 +vt 0.500000 0.000000 +vt 0.500000 1.000000 +vt 0.571179 0.009358 +vt 0.979748 0.660349 +vt 0.954818 0.537446 +vt 0.994911 0.788524 +vt 1.000000 0.919363 +vt 0.640884 0.037241 +vt 0.707722 0.083081 +vt 0.770332 0.145946 +vt 1.000000 1.000000 +vt 0.827439 0.224555 +vt 0.877881 0.317308 +vt 0.920631 0.422318 +vt 0.968750 0.500000 +vt 1.000000 0.500000 +vt 0.968750 1.000000 +vt 0.937500 0.500000 +vt 0.937500 1.000000 +vt 0.906250 0.500000 +vt 0.906250 1.000000 +vt 0.875000 0.500000 +vt 0.875000 1.000000 +vt 0.843750 0.500000 +vt 0.843750 1.000000 +vt 0.812500 0.500000 +vt 0.781250 1.000000 +vt 0.781250 0.500000 +vt 0.750000 1.000000 +vt 0.750000 0.500000 +vt 0.718750 0.500000 +vt 0.687500 1.000000 +vt 0.687500 0.500000 +vt 0.656250 0.500000 +vt 0.656250 1.000000 +vt 0.625000 0.500000 +vt 0.625000 1.000000 +vt 0.593750 0.500000 +vt 0.406250 0.500000 +vt 0.375000 1.000000 +vt 0.375000 0.500000 +vt 0.343750 1.000000 +vt 0.343750 0.500000 +vt 0.312500 0.500000 +vt 0.312500 1.000000 +vt 0.281250 0.500000 +vt 0.250000 1.000000 +vt 0.250000 0.500000 +vt 0.218750 0.500000 +vt 0.218750 1.000000 +vt 0.187500 0.500000 +vt 0.187500 1.000000 +vt 0.156250 0.500000 +vt 0.125000 1.000000 +vt 0.125000 0.500000 +vt 0.093750 0.500000 +vt 0.093750 1.000000 +vt 0.062500 0.500000 +vt 0.000000 1.000000 +vt 0.031250 1.000000 +vt 0.062500 1.000000 +vt 0.031250 0.500000 +vt 0.000000 0.500000 +vt 0.281250 1.000000 +vt 0.593750 1.000000 +vt 0.156250 1.000000 +vt 0.718750 1.000000 +vt 0.812500 1.000000 +vt 0.406250 1.000000 +s 0 +f 5/1/1 2/2/1 3/3/1 +f 2/2/1 5/1/1 27/4/1 +f 30/2/1 31/1/1 32/4/1 +f 31/1/1 30/2/1 29/3/1 +f 7/5/2 39/6/2 8/6/2 +f 18/7/3 54/8/3 17/8/3 +f 15/4/4 33/9/4 32/4/4 +f 25/10/5 47/11/5 24/11/5 +f 6/7/6 40/5/6 7/5/6 +f 17/8/7 43/12/7 16/12/7 +f 14/9/8 34/10/8 33/9/8 +f 24/11/9 48/13/9 23/13/9 +f 4/8/10 41/7/10 6/7/10 +f 12/11/11 34/10/11 13/10/11 +f 23/13/12 49/14/12 22/14/12 +f 1/12/13 42/8/13 4/8/13 +f 11/13/14 35/11/14 12/11/14 +f 22/14/15 50/15/15 21/15/15 +f 3/3/16 28/12/16 1/12/16 +f 16/12/16 29/3/16 3/3/16 +f 10/14/17 36/13/17 11/13/17 +f 21/15/18 51/6/18 20/6/18 +f 5/1/19 44/4/19 27/4/19 +f 9/15/20 37/14/20 10/14/20 +f 20/6/21 52/5/21 19/5/21 +f 26/9/22 44/4/22 45/9/22 +f 8/6/23 38/15/23 9/15/23 +f 19/5/24 53/7/24 18/7/24 +f 15/4/25 31/1/25 5/1/25 +f 25/10/26 45/9/26 46/10/26 +f 56/12/27 57/16/27 55/17/27 +f 58/18/28 59/19/28 57/16/28 +f 60/20/29 61/21/29 59/19/29 +f 62/22/30 63/23/30 61/21/30 +f 64/24/31 65/25/31 63/23/31 +f 66/26/32 67/27/32 65/25/32 +f 67/27/33 70/28/33 69/29/33 +f 69/29/34 72/30/34 71/31/34 +f 72/30/35 73/32/35 71/31/35 +f 73/32/36 76/33/36 75/34/36 +f 76/33/37 77/35/37 75/34/37 +f 78/36/38 79/37/38 77/35/38 +f 80/38/39 81/39/39 79/37/39 +f 83/40/40 86/41/40 85/42/40 +f 85/42/41 88/43/41 87/44/41 +f 88/43/42 89/45/42 87/44/42 +f 90/46/43 91/47/43 89/45/43 +f 91/47/44 94/48/44 93/49/44 +f 94/48/45 95/50/45 93/49/45 +f 96/51/46 97/52/46 95/50/46 +f 98/53/47 99/54/47 97/52/47 +f 99/54/48 102/55/48 101/56/48 +f 102/55/49 103/57/49 101/56/49 +f 104/58/50 105/59/50 103/57/50 +f 56/60/1 109/61/1 159/60/1 +f 106/62/51 107/63/51 105/59/51 +f 108/61/52 55/64/52 107/63/52 +f 94/48/1 125/65/1 123/48/1 +f 64/24/1 151/26/1 66/26/1 +f 82/66/53 136/39/53 81/39/53 +f 80/38/1 135/66/1 82/66/1 +f 79/37/16 136/39/16 138/37/16 +f 88/43/1 131/41/1 129/43/1 +f 87/44/16 132/42/16 85/42/16 +f 104/58/1 115/55/1 113/58/1 +f 103/57/16 116/56/16 101/56/16 +f 58/18/1 157/20/1 60/20/1 +f 102/55/1 117/67/1 115/55/1 +f 74/68/1 141/33/1 76/33/1 +f 95/50/16 124/49/16 93/49/16 +f 68/69/1 147/28/1 70/28/1 +f 56/12/1 160/18/1 58/18/1 +f 72/30/1 143/68/1 74/68/1 +f 97/52/16 122/50/16 95/50/16 +f 96/51/1 123/48/1 121/51/1 +f 112/59/54 113/58/54 114/57/54 +f 118/54/37 119/53/37 120/52/37 +f 126/47/34 123/48/34 125/65/34 +f 130/44/31 131/41/31 132/42/31 +f 138/37/48 139/36/48 140/35/48 +f 144/32/45 145/30/45 146/31/45 +f 150/27/42 151/26/42 152/25/42 +f 156/21/55 157/20/55 158/19/55 +f 93/49/16 126/47/16 91/47/16 +f 60/20/1 155/22/1 62/22/1 +f 77/35/16 138/37/16 140/35/16 +f 126/47/33 127/46/33 128/45/33 +f 128/45/32 129/43/32 130/44/32 +f 59/19/16 156/21/16 158/19/16 +f 86/41/1 134/70/1 131/41/1 +f 67/27/16 148/29/16 150/27/16 +f 132/42/30 134/70/30 133/40/30 +f 92/65/1 127/46/1 125/65/1 +f 136/39/49 137/38/49 138/37/49 +f 76/33/1 139/36/1 78/36/1 +f 85/42/16 133/40/16 83/40/16 +f 140/35/47 141/33/47 142/34/47 +f 65/25/16 150/27/16 152/25/16 +f 144/32/46 141/33/46 143/68/46 +f 75/34/16 140/35/16 142/34/16 +f 55/64/16 110/63/16 107/63/16 +f 99/54/16 120/52/16 97/52/16 +f 83/40/56 134/70/56 84/70/56 +f 146/31/44 147/28/44 148/29/44 +f 55/17/16 161/16/16 162/17/16 +f 108/61/1 111/62/1 109/61/1 +f 148/29/43 149/69/43 150/27/43 +f 57/16/16 158/19/16 161/16/16 +f 63/23/16 152/25/16 154/23/16 +f 71/31/16 144/32/16 146/31/16 +f 101/56/16 118/54/16 99/54/16 +f 152/25/41 153/24/41 154/23/41 +f 98/53/1 121/51/1 119/53/1 +f 90/46/1 129/43/1 127/46/1 +f 154/23/40 155/22/40 156/21/40 +f 73/32/16 142/34/16 144/32/16 +f 107/63/16 112/59/16 105/59/16 +f 70/28/1 145/30/1 72/30/1 +f 100/67/1 119/53/1 117/67/1 +f 158/19/57 160/18/57 161/16/57 +f 69/29/16 146/31/16 148/29/16 +f 89/45/16 130/44/16 87/44/16 +f 161/16/58 159/12/58 162/17/58 +f 62/22/1 153/24/1 64/24/1 +f 162/64/59 109/61/59 110/63/59 +f 66/26/1 149/69/1 68/69/1 +f 110/63/60 111/62/60 112/59/60 +f 106/62/1 113/58/1 111/62/1 +f 91/47/16 128/45/16 89/45/16 +f 61/21/16 154/23/16 156/21/16 +f 114/57/39 115/55/39 116/56/39 +f 116/56/38 117/67/38 118/54/38 +f 105/59/16 114/57/16 103/57/16 +f 78/36/1 137/38/1 80/38/1 +f 120/52/36 121/51/36 122/50/36 +f 122/50/35 123/48/35 124/49/35 +f 3/3/61 1/12/61 4/8/61 +f 4/8/61 6/7/61 3/3/61 +f 6/7/61 7/5/61 3/3/61 +f 7/5/61 8/6/61 3/3/61 +f 8/6/61 9/15/61 3/3/61 +f 9/15/61 10/14/61 3/3/61 +f 10/14/61 11/13/61 5/1/61 +f 3/3/61 10/14/61 5/1/61 +f 11/13/61 12/11/61 5/1/61 +f 12/11/61 13/10/61 5/1/61 +f 13/10/61 14/9/61 5/1/61 +f 14/9/61 15/4/61 5/1/61 +f 27/4/61 26/9/61 2/2/61 +f 26/9/61 25/10/61 2/2/61 +f 25/10/61 24/11/61 2/2/61 +f 24/11/61 23/13/61 2/2/61 +f 23/13/61 22/14/61 2/2/61 +f 22/14/61 21/15/61 3/3/61 +f 21/15/61 20/6/61 3/3/61 +f 20/6/61 19/5/61 3/3/61 +f 19/5/61 18/7/61 3/3/61 +f 18/7/61 17/8/61 3/3/61 +f 17/8/61 16/12/61 3/3/61 +f 22/14/61 3/3/61 2/2/61 +f 32/4/62 33/9/62 30/2/62 +f 33/9/62 34/10/62 30/2/62 +f 34/10/62 35/11/62 30/2/62 +f 35/11/62 36/13/62 30/2/62 +f 36/13/62 37/14/62 30/2/62 +f 37/14/62 38/15/62 29/3/62 +f 38/15/62 39/6/62 29/3/62 +f 39/6/62 40/5/62 29/3/62 +f 40/5/62 41/7/62 29/3/62 +f 41/7/62 42/8/62 29/3/62 +f 42/8/62 28/12/62 29/3/62 +f 37/14/62 29/3/62 30/2/62 +f 29/3/62 43/12/62 54/8/62 +f 54/8/62 53/7/62 29/3/62 +f 53/7/62 52/5/62 29/3/62 +f 52/5/62 51/6/62 29/3/62 +f 51/6/62 50/15/62 29/3/62 +f 50/15/62 49/14/62 29/3/62 +f 49/14/62 48/13/62 31/1/62 +f 29/3/62 49/14/62 31/1/62 +f 48/13/62 47/11/62 31/1/62 +f 47/11/62 46/10/62 31/1/62 +f 46/10/62 45/9/62 31/1/62 +f 45/9/62 44/4/62 31/1/62 +f 7/5/2 40/5/2 39/6/2 +f 18/7/3 53/7/3 54/8/3 +f 15/4/63 14/9/63 33/9/63 +f 25/10/5 46/10/5 47/11/5 +f 6/7/6 41/7/6 40/5/6 +f 17/8/7 54/8/7 43/12/7 +f 14/9/8 13/10/8 34/10/8 +f 24/11/9 47/11/9 48/13/9 +f 4/8/10 42/8/10 41/7/10 +f 12/11/11 35/11/11 34/10/11 +f 23/13/12 48/13/12 49/14/12 +f 1/12/13 28/12/13 42/8/13 +f 11/13/14 36/13/14 35/11/14 +f 22/14/15 49/14/15 50/15/15 +f 3/3/16 29/3/16 28/12/16 +f 16/12/16 43/12/16 29/3/16 +f 10/14/17 37/14/17 36/13/17 +f 21/15/18 50/15/18 51/6/18 +f 5/1/19 31/1/19 44/4/19 +f 9/15/20 38/15/20 37/14/20 +f 20/6/21 51/6/21 52/5/21 +f 26/9/64 27/4/64 44/4/64 +f 8/6/23 39/6/23 38/15/23 +f 19/5/24 52/5/24 53/7/24 +f 15/4/25 32/4/25 31/1/25 +f 25/10/26 26/9/26 45/9/26 +f 56/12/27 58/18/27 57/16/27 +f 58/18/28 60/20/28 59/19/28 +f 60/20/29 62/22/29 61/21/29 +f 62/22/30 64/24/30 63/23/30 +f 64/24/31 66/26/31 65/25/31 +f 66/26/32 68/69/32 67/27/32 +f 67/27/33 68/69/33 70/28/33 +f 69/29/34 70/28/34 72/30/34 +f 72/30/35 74/68/35 73/32/35 +f 73/32/36 74/68/36 76/33/36 +f 76/33/37 78/36/37 77/35/37 +f 78/36/38 80/38/38 79/37/38 +f 80/38/39 82/66/39 81/39/39 +f 83/40/40 84/70/40 86/41/40 +f 85/42/41 86/41/41 88/43/41 +f 88/43/42 90/46/42 89/45/42 +f 90/46/43 92/65/43 91/47/43 +f 91/47/44 92/65/44 94/48/44 +f 94/48/45 96/51/45 95/50/45 +f 96/51/46 98/53/46 97/52/46 +f 98/53/47 100/67/47 99/54/47 +f 99/54/48 100/67/48 102/55/48 +f 102/55/49 104/58/49 103/57/49 +f 104/58/50 106/62/50 105/59/50 +f 56/60/1 108/61/1 109/61/1 +f 106/62/51 108/61/51 107/63/51 +f 108/61/52 56/60/52 55/64/52 +f 94/48/1 92/65/1 125/65/1 +f 64/24/1 153/24/1 151/26/1 +f 82/66/53 135/66/53 136/39/53 +f 80/38/1 137/38/1 135/66/1 +f 79/37/16 81/39/16 136/39/16 +f 88/43/1 86/41/1 131/41/1 +f 87/44/16 130/44/16 132/42/16 +f 104/58/1 102/55/1 115/55/1 +f 103/57/16 114/57/16 116/56/16 +f 58/18/1 160/18/1 157/20/1 +f 102/55/1 100/67/1 117/67/1 +f 74/68/1 143/68/1 141/33/1 +f 95/50/16 122/50/16 124/49/16 +f 68/69/1 149/69/1 147/28/1 +f 56/12/1 159/12/1 160/18/1 +f 72/30/1 145/30/1 143/68/1 +f 97/52/16 120/52/16 122/50/16 +f 96/51/1 94/48/1 123/48/1 +f 112/59/54 111/62/54 113/58/54 +f 118/54/37 117/67/37 119/53/37 +f 126/47/34 124/49/34 123/48/34 +f 130/44/31 129/43/31 131/41/31 +f 138/37/48 137/38/48 139/36/48 +f 144/32/45 143/68/45 145/30/45 +f 150/27/42 149/69/42 151/26/42 +f 156/21/55 155/22/55 157/20/55 +f 93/49/16 124/49/16 126/47/16 +f 60/20/1 157/20/1 155/22/1 +f 77/35/16 79/37/16 138/37/16 +f 126/47/33 125/65/33 127/46/33 +f 128/45/32 127/46/32 129/43/32 +f 59/19/16 61/21/16 156/21/16 +f 86/41/1 84/70/1 134/70/1 +f 67/27/16 69/29/16 148/29/16 +f 132/42/30 131/41/30 134/70/30 +f 92/65/1 90/46/1 127/46/1 +f 136/39/49 135/66/49 137/38/49 +f 76/33/1 141/33/1 139/36/1 +f 85/42/16 132/42/16 133/40/16 +f 140/35/47 139/36/47 141/33/47 +f 65/25/16 67/27/16 150/27/16 +f 144/32/46 142/34/46 141/33/46 +f 75/34/16 77/35/16 140/35/16 +f 55/64/16 162/64/16 110/63/16 +f 99/54/16 118/54/16 120/52/16 +f 83/40/56 133/40/56 134/70/56 +f 146/31/44 145/30/44 147/28/44 +f 55/17/16 57/16/16 161/16/16 +f 108/61/1 106/62/1 111/62/1 +f 148/29/43 147/28/43 149/69/43 +f 57/16/16 59/19/16 158/19/16 +f 63/23/16 65/25/16 152/25/16 +f 71/31/16 73/32/16 144/32/16 +f 101/56/16 116/56/16 118/54/16 +f 152/25/41 151/26/41 153/24/41 +f 98/53/1 96/51/1 121/51/1 +f 90/46/1 88/43/1 129/43/1 +f 154/23/40 153/24/40 155/22/40 +f 73/32/16 75/34/16 142/34/16 +f 107/63/16 110/63/16 112/59/16 +f 70/28/1 147/28/1 145/30/1 +f 100/67/1 98/53/1 119/53/1 +f 158/19/57 157/20/57 160/18/57 +f 69/29/16 71/31/16 146/31/16 +f 89/45/16 128/45/16 130/44/16 +f 161/16/58 160/18/58 159/12/58 +f 62/22/1 155/22/1 153/24/1 +f 162/64/59 159/60/59 109/61/59 +f 66/26/1 151/26/1 149/69/1 +f 110/63/60 109/61/60 111/62/60 +f 106/62/1 104/58/1 113/58/1 +f 91/47/16 126/47/16 128/45/16 +f 61/21/16 63/23/16 154/23/16 +f 114/57/39 113/58/39 115/55/39 +f 116/56/38 115/55/38 117/67/38 +f 105/59/16 112/59/16 114/57/16 +f 78/36/1 139/36/1 137/38/1 +f 120/52/36 119/53/36 121/51/36 +f 122/50/35 121/51/35 123/48/35