fixed rotation and added functionality für BoardHandler; added shiel visual

This commit is contained in:
Cedric Beck
2024-11-18 21:30:30 +01:00
parent 2399bf2678
commit 56256fb9c0
6 changed files with 863 additions and 61 deletions

View File

@@ -54,16 +54,38 @@ public void simpleInitApp() {
UUID test0 = UUID.randomUUID();
UUID test1 = UUID.randomUUID();
List<UUID> 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<UUID> 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);

View File

@@ -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");

View File

@@ -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<Color, List<AssetOnMap>> colorAssetsMap;
private Map<Color, List<NodeControl>> homeNodesMap;
private Map<Color, List<NodeControl>> waitingNodesMap;
private Map<Color, List<PieceControl>> waitingPiecesMap;
private Map<UUID, Color> 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<AssetOnMap> inMap = colorAssetsMap.getOrDefault(col, new ArrayList<>());
inMap.add(assetOnMap);
List<AssetOnMap> 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> uuid) {
List<AssetOnMap> 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<Color, List<NodeControl>> map, Color color, AssetOnMap assetOnMap){
List<NodeControl> homeNodes = map.getOrDefault(color, new ArrayList<>());
homeNodes.add(displayAndControl(assetOnMap, new NodeControl()));
map.put(color, homeNodes);
List<NodeControl> 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 <T, E> List<T> addItemToMapList(Map<E,List<T>> map, E key, T item){
List<T> list = map.getOrDefault(key, new ArrayList<>());
list.add(item);
map.put(key, list);
return list;
}
private <T, E> List<T> removeItemFromMapList(Map<E,List<T>> map, E key, T item){
List<T> 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> uuid) {
List<AssetOnMap> 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<NodeControl> 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<NodeControl> 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<NodeControl> waitNodes = waitingNodesMap.get(color);
List<PieceControl> 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());
}
}

View File

@@ -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);
}
}

View File

@@ -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

View File

@@ -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