aboutsummaryrefslogtreecommitdiffstats
path: root/ardor3d-core
diff options
context:
space:
mode:
authorRenanse <[email protected]>2013-03-14 21:52:41 -0500
committerRenanse <[email protected]>2013-03-14 21:52:41 -0500
commit19bd8d8e1e5de5d31fab60bf2a3dedc9778782d0 (patch)
treef14c233f6181afaf91d00f83d5e078af27c3cafd /ardor3d-core
parentaedbc04cc0c605496fc5aa12ba074643ef16d6d9 (diff)
parentc81013c8f8bec5588be7e762a254c509286cbb46 (diff)
Merge remote-tracking branch 'origin/master'
Conflicts: ardor3d-collada/src/main/java/com/ardor3d/extension/model/collada/jdom/data/DataCache.java
Diffstat (limited to 'ardor3d-core')
-rw-r--r--ardor3d-core/.classpath15
-rw-r--r--ardor3d-core/.project17
-rw-r--r--ardor3d-core/.settings/org.eclipse.core.resources.prefs3
-rw-r--r--ardor3d-core/.settings/org.eclipse.jdt.core.prefs2
-rw-r--r--ardor3d-core/.settings/org.eclipse.jdt.ui.prefs227
-rw-r--r--ardor3d-core/buildjar.jardesc34
-rw-r--r--ardor3d-core/lib/google/guava-13.0.1.jarbin1891110 -> 0 bytes
-rw-r--r--ardor3d-core/lib/unittests/cglib-nodep-2.2.jarbin322362 -> 0 bytes
-rw-r--r--ardor3d-core/lib/unittests/easymock.jarbin78815 -> 0 bytes
-rw-r--r--ardor3d-core/lib/unittests/easymockclassextension.jarbin56010 -> 0 bytes
-rw-r--r--ardor3d-core/lib/unittests/junit-4.5.jarbin198945 -> 0 bytes
-rw-r--r--ardor3d-core/pom.xml108
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/annotation/GuardedBy.java50
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/annotation/Immutable.java48
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/annotation/MainThread.java70
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/annotation/ThreadSafe.java44
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/bounding/BoundingSphere.java2
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/framework/Canvas.java86
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/framework/CanvasRenderer.java198
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/framework/NativeCanvas.java164
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/framework/Scene.java76
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/framework/Updater.java50
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/image/util/TextureProjector.java86
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/input/ButtonState.java36
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/input/ControllerEvent.java94
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/input/ControllerInfo.java106
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/input/ControllerState.java278
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/input/ControllerWrapper.java62
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/input/FocusWrapper.java40
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/input/InputState.java150
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/input/Key.java1522
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/input/KeyNotFoundException.java46
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/input/KeyState.java36
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/input/KeyboardWrapper.java62
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/input/MouseButton.java74
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/input/MouseWrapper.java60
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/input/logical/AnyControllerCondition.java52
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/input/logical/ControllerComponentActiveCondition.java114
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/input/logical/ControllerComponentCondition.java120
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/input/logical/ControllerCondition.java102
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/input/logical/DummyControllerWrapper.java106
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/input/logical/InputTrigger.java170
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/input/logical/KeyHeldCondition.java86
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/input/logical/KeyPressedCondition.java94
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/input/logical/KeyReleasedCondition.java92
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/input/logical/MouseButtonClickedCondition.java94
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/input/logical/MouseButtonCondition.java124
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/input/logical/MouseButtonPressedCondition.java106
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/input/logical/MouseButtonReleasedCondition.java106
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/input/logical/MouseMovedCondition.java72
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/input/logical/MouseWheelMovedCondition.java72
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/input/logical/TriggerAction.java66
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/input/logical/TriggerConditions.java242
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/renderer/ContextCapabilities.java16
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/renderer/ContextManager.java162
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/renderer/IndexMode.java244
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/renderer/TextureRendererFactory.java206
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/renderer/TextureRendererProvider.java68
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/renderer/effect/EffectManager.java6
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/renderer/queue/OpaqueRenderBucket.java192
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/renderer/queue/OrthoRenderBucket.java102
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/renderer/queue/RenderBucket.java62
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/scenegraph/ByteBufferData.java14
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/scenegraph/FloatBufferDataUtil.java132
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/scenegraph/IndexBufferData.java34
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/scenegraph/IntBufferData.java10
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/scenegraph/Mesh.java4
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/scenegraph/MeshData.java7
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/scenegraph/Renderable.java50
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/scenegraph/ShortBufferData.java14
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/scenegraph/controller/interpolation/CurveLookAtController.java278
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/scenegraph/controller/interpolation/DefaultColorInterpolationController.java104
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/scenegraph/controller/interpolation/LinearVector3InterpolationController.java72
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/scenegraph/controller/interpolation/QuaternionInterpolationController.java140
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/scenegraph/event/DirtyEventListener.java68
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/scenegraph/event/DirtyType.java36
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/scenegraph/event/SceneGraphManager.java126
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/scenegraph/extension/SwitchNode.java284
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/scenegraph/hint/NormalsMode.java78
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/Box.java2
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/Capsule.java2
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/Cylinder.java2
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/Dodecahedron.java76
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/Extrusion.java4
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/Hexagon.java2
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/OrientedBox.java2
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/RoundedBox.java2
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/StripBox.java2
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/Tube.java2
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/scenegraph/visitor/DeleteVBOsVisitor.java80
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/scenegraph/visitor/UpdateModelBoundVisitor.java44
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/scenegraph/visitor/Visitor.java46
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/spline/Spline.java124
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/ui/text/BMFont.java1908
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/ui/text/BMText.java1522
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/util/export/xml/DOM_PrettyPrint.java52
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/util/geom/BufferUtils.java25
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/util/geom/CopyLogic.java44
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/util/geom/MeshCombiner.java6
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/util/geom/SharedCopyLogic.java192
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/util/shader/uniformtypes/ShaderVariablePointerFloatMatrix.java136
-rw-r--r--ardor3d-core/src/main/java/com/ardor3d/util/stat/graph/TimedAreaGrapher.java7
-rw-r--r--ardor3d-core/src/main/resources/com/ardor3d/ui/text/arial-24-bold-regular.fnt2806
-rw-r--r--ardor3d-core/src/test/java/com/ardor3d/bounding/TestBounding.java80
-rw-r--r--ardor3d-core/src/test/java/com/ardor3d/bounding/TestRayBounding.java188
-rw-r--r--ardor3d-core/src/test/java/com/ardor3d/input/TestKeyboardState.java162
-rw-r--r--ardor3d-core/src/test/java/com/ardor3d/input/TestPhysicalLayer.java744
-rw-r--r--ardor3d-core/src/test/java/com/ardor3d/input/logical/TestLogicalLayer.java498
-rw-r--r--ardor3d-core/src/test/java/com/ardor3d/input/logical/TestStandardConditions.java404
109 files changed, 8705 insertions, 8632 deletions
diff --git a/ardor3d-core/.classpath b/ardor3d-core/.classpath
deleted file mode 100644
index b30d97b..0000000
--- a/ardor3d-core/.classpath
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
- <classpathentry kind="src" path="src/main/resources"/>
- <classpathentry kind="src" path="src/main/java"/>
- <classpathentry kind="src" path="src/test/java"/>
- <classpathentry combineaccessrules="false" exported="true" kind="src" path="/ardor3d-savable"/>
- <classpathentry combineaccessrules="false" exported="true" kind="src" path="/ardor3d-math"/>
- <classpathentry exported="true" kind="lib" path="lib/unittests/cglib-nodep-2.2.jar"/>
- <classpathentry exported="true" kind="lib" path="lib/unittests/easymock.jar"/>
- <classpathentry exported="true" kind="lib" path="lib/unittests/easymockclassextension.jar"/>
- <classpathentry exported="true" kind="lib" path="lib/unittests/junit-4.5.jar"/>
- <classpathentry exported="true" kind="lib" path="lib/google/guava-13.0.1.jar"/>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
- <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/ardor3d-core/.project b/ardor3d-core/.project
deleted file mode 100644
index d426d9d..0000000
--- a/ardor3d-core/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
- <name>ardor3d-core</name>
- <comment></comment>
- <projects>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.jdt.core.javanature</nature>
- </natures>
-</projectDescription>
diff --git a/ardor3d-core/.settings/org.eclipse.core.resources.prefs b/ardor3d-core/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index 82a25eb..0000000
--- a/ardor3d-core/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Tue Jan 06 12:48:37 PST 2009
-eclipse.preferences.version=1
-encoding/src=UTF-8
diff --git a/ardor3d-core/.settings/org.eclipse.jdt.core.prefs b/ardor3d-core/.settings/org.eclipse.jdt.core.prefs
index 10a0c88..b861883 100644
--- a/ardor3d-core/.settings/org.eclipse.jdt.core.prefs
+++ b/ardor3d-core/.settings/org.eclipse.jdt.core.prefs
@@ -1,4 +1,3 @@
-#Tue Apr 06 11:24:38 CDT 2010
eclipse.preferences.version=1
org.eclipse.jdt.core.codeComplete.argumentPrefixes=
org.eclipse.jdt.core.codeComplete.argumentSuffixes=
@@ -19,6 +18,7 @@ org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
org.eclipse.jdt.core.compiler.source=1.6
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
diff --git a/ardor3d-core/.settings/org.eclipse.jdt.ui.prefs b/ardor3d-core/.settings/org.eclipse.jdt.ui.prefs
index 8110121..231a894 100644
--- a/ardor3d-core/.settings/org.eclipse.jdt.ui.prefs
+++ b/ardor3d-core/.settings/org.eclipse.jdt.ui.prefs
@@ -1,114 +1,113 @@
-#Mon Jan 02 22:40:01 CST 2012
-cleanup.add_default_serial_version_id=true
-cleanup.add_generated_serial_version_id=false
-cleanup.add_missing_annotations=true
-cleanup.add_missing_deprecated_annotations=true
-cleanup.add_missing_methods=true
-cleanup.add_missing_nls_tags=false
-cleanup.add_missing_override_annotations=true
-cleanup.add_serial_version_id=true
-cleanup.always_use_blocks=true
-cleanup.always_use_parentheses_in_expressions=true
-cleanup.always_use_this_for_non_static_field_access=false
-cleanup.always_use_this_for_non_static_method_access=false
-cleanup.convert_to_enhanced_for_loop=false
-cleanup.correct_indentation=true
-cleanup.format_source_code=true
-cleanup.format_source_code_changes_only=false
-cleanup.make_local_variable_final=true
-cleanup.make_parameters_final=true
-cleanup.make_private_fields_final=true
-cleanup.make_type_abstract_if_missing_method=false
-cleanup.make_variable_declarations_final=true
-cleanup.never_use_blocks=false
-cleanup.never_use_parentheses_in_expressions=false
-cleanup.organize_imports=true
-cleanup.qualify_static_field_accesses_with_declaring_class=false
-cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-cleanup.qualify_static_member_accesses_with_declaring_class=true
-cleanup.qualify_static_method_accesses_with_declaring_class=false
-cleanup.remove_private_constructors=true
-cleanup.remove_trailing_whitespaces=true
-cleanup.remove_trailing_whitespaces_all=true
-cleanup.remove_trailing_whitespaces_ignore_empty=false
-cleanup.remove_unnecessary_casts=true
-cleanup.remove_unnecessary_nls_tags=true
-cleanup.remove_unused_imports=true
-cleanup.remove_unused_local_variables=false
-cleanup.remove_unused_private_fields=true
-cleanup.remove_unused_private_members=false
-cleanup.remove_unused_private_methods=true
-cleanup.remove_unused_private_types=true
-cleanup.sort_members=false
-cleanup.sort_members_all=false
-cleanup.use_blocks=true
-cleanup.use_blocks_only_for_return_and_throw=false
-cleanup.use_parentheses_in_expressions=false
-cleanup.use_this_for_non_static_field_access=true
-cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-cleanup.use_this_for_non_static_method_access=true
-cleanup.use_this_for_non_static_method_access_only_if_necessary=true
-cleanup_profile=_ArdorLabs
-cleanup_settings_version=2
-eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
-formatter_profile=_ArdorLabs
-formatter_settings_version=11
-org.eclipse.jdt.ui.exception.name=ex
-org.eclipse.jdt.ui.gettersetter.use.is=true
-org.eclipse.jdt.ui.javadoc=false
-org.eclipse.jdt.ui.keywordthis=false
-org.eclipse.jdt.ui.overrideannotation=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/**\n * Copyright (c) 2008-2012 Ardor Labs, Inc.\n *\n * This file is part of Ardor3D.\n *\n * Ardor3D is free software\: you can redistribute it and/or modify it \n * under the terms of its license which may be found in the accompanying\n * LICENSE file or at &lt;http\://www.ardor3d.com/LICENSE&gt;.\n */\n\n${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=true
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_methods=false
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=true
-sp_cleanup.always_use_parentheses_in_expressions=false
-sp_cleanup.always_use_this_for_non_static_field_access=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.convert_to_enhanced_for_loop=false
-sp_cleanup.correct_indentation=true
-sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.make_local_variable_final=true
-sp_cleanup.make_parameters_final=true
-sp_cleanup.make_private_fields_final=true
-sp_cleanup.make_type_abstract_if_missing_method=false
-sp_cleanup.make_variable_declarations_final=true
-sp_cleanup.never_use_blocks=false
-sp_cleanup.never_use_parentheses_in_expressions=true
-sp_cleanup.on_save_use_additional_actions=true
-sp_cleanup.organize_imports=true
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_trailing_whitespaces=true
-sp_cleanup.remove_trailing_whitespaces_all=true
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-sp_cleanup.remove_unnecessary_casts=true
-sp_cleanup.remove_unnecessary_nls_tags=true
-sp_cleanup.remove_unused_imports=true
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=true
-sp_cleanup.remove_unused_private_types=true
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.use_blocks=true
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_parentheses_in_expressions=false
-sp_cleanup.use_this_for_non_static_field_access=true
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=true
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=true
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_serial_version_id=true
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=true
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.correct_indentation=true
+cleanup.format_source_code=true
+cleanup.format_source_code_changes_only=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=true
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=true
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=false
+cleanup.organize_imports=true
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=true
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.remove_private_constructors=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=true
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.use_blocks=true
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_this_for_non_static_field_access=true
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=true
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup_profile=_ArdorLabs
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_ArdorLabs
+formatter_settings_version=11
+org.eclipse.jdt.ui.exception.name=ex
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/**\n * Copyright (c) 2008-2012 Ardor Labs, Inc.\n *\n * This file is part of Ardor3D.\n *\n * Ardor3D is free software\: you can redistribute it and/or modify it \n * under the terms of its license which may be found in the accompanying\n * LICENSE file or at &lt;http\://www.ardor3d.com/LICENSE&gt;.\n */\n\n${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=true
+sp_cleanup.make_parameters_final=true
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=true
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=true
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=true
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/ardor3d-core/buildjar.jardesc b/ardor3d-core/buildjar.jardesc
index 2ea7295..05dc5da 100644
--- a/ardor3d-core/buildjar.jardesc
+++ b/ardor3d-core/buildjar.jardesc
@@ -1,17 +1,17 @@
-<?xml version="1.0" encoding="WINDOWS-1252" standalone="no"?>
-<jardesc>
- <jar path="C:/Users/Joshua Slack/Desktop/ardor3d-core.jar"/>
- <options buildIfNeeded="true" compress="true" descriptionLocation="/ardor3d-core/buildjar.jardesc" exportErrors="true" exportWarnings="true" includeDirectoryEntries="true" overwrite="false" saveDescription="true" storeRefactorings="false" useSourceFolders="false"/>
- <storedRefactorings deprecationInfo="true" structuralOnly="false"/>
- <selectedProjects/>
- <manifest generateManifest="true" manifestLocation="" manifestVersion="1.0" reuseManifest="false" saveManifest="false" usesManifest="true">
- <sealing sealJar="false">
- <packagesToSeal/>
- <packagesToUnSeal/>
- </sealing>
- </manifest>
- <selectedElements exportClassFiles="true" exportJavaFiles="false" exportOutputFolder="false">
- <javaElement handleIdentifier="=ardor3d-core/src\/main\/java"/>
- <javaElement handleIdentifier="=ardor3d-core/src\/main\/resources"/>
- </selectedElements>
-</jardesc>
+<?xml version="1.0" encoding="WINDOWS-1252" standalone="no"?>
+<jardesc>
+ <jar path="C:/Users/Joshua Slack/Desktop/ardor3d-core.jar"/>
+ <options buildIfNeeded="true" compress="true" descriptionLocation="/ardor3d-core/buildjar.jardesc" exportErrors="true" exportWarnings="true" includeDirectoryEntries="true" overwrite="false" saveDescription="true" storeRefactorings="false" useSourceFolders="false"/>
+ <storedRefactorings deprecationInfo="true" structuralOnly="false"/>
+ <selectedProjects/>
+ <manifest generateManifest="true" manifestLocation="" manifestVersion="1.0" reuseManifest="false" saveManifest="false" usesManifest="true">
+ <sealing sealJar="false">
+ <packagesToSeal/>
+ <packagesToUnSeal/>
+ </sealing>
+ </manifest>
+ <selectedElements exportClassFiles="true" exportJavaFiles="false" exportOutputFolder="false">
+ <javaElement handleIdentifier="=ardor3d-core/src\/main\/java"/>
+ <javaElement handleIdentifier="=ardor3d-core/src\/main\/resources"/>
+ </selectedElements>
+</jardesc>
diff --git a/ardor3d-core/lib/google/guava-13.0.1.jar b/ardor3d-core/lib/google/guava-13.0.1.jar
deleted file mode 100644
index 09c5449..0000000
--- a/ardor3d-core/lib/google/guava-13.0.1.jar
+++ /dev/null
Binary files differ
diff --git a/ardor3d-core/lib/unittests/cglib-nodep-2.2.jar b/ardor3d-core/lib/unittests/cglib-nodep-2.2.jar
deleted file mode 100644
index ed07cb5..0000000
--- a/ardor3d-core/lib/unittests/cglib-nodep-2.2.jar
+++ /dev/null
Binary files differ
diff --git a/ardor3d-core/lib/unittests/easymock.jar b/ardor3d-core/lib/unittests/easymock.jar
deleted file mode 100644
index de59168..0000000
--- a/ardor3d-core/lib/unittests/easymock.jar
+++ /dev/null
Binary files differ
diff --git a/ardor3d-core/lib/unittests/easymockclassextension.jar b/ardor3d-core/lib/unittests/easymockclassextension.jar
deleted file mode 100644
index 7d098a7..0000000
--- a/ardor3d-core/lib/unittests/easymockclassextension.jar
+++ /dev/null
Binary files differ
diff --git a/ardor3d-core/lib/unittests/junit-4.5.jar b/ardor3d-core/lib/unittests/junit-4.5.jar
deleted file mode 100644
index 7339216..0000000
--- a/ardor3d-core/lib/unittests/junit-4.5.jar
+++ /dev/null
Binary files differ
diff --git a/ardor3d-core/pom.xml b/ardor3d-core/pom.xml
index 0743df7..212dd0d 100644
--- a/ardor3d-core/pom.xml
+++ b/ardor3d-core/pom.xml
@@ -1,54 +1,54 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <groupId>com.ardor3d</groupId>
- <artifactId>ardor3d</artifactId>
- <version>0.9-SNAPSHOT</version>
- <relativePath>../pom.xml</relativePath>
- </parent>
-
- <artifactId>ardor3d-core</artifactId>
- <packaging>bundle</packaging>
- <name>Ardor 3D Core</name>
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>2.3.2</version>
- <configuration>
- <source>1.6</source>
- <target>1.6</target>
- <encoding>${project.build.sourceEncoding}</encoding>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-resources-plugin</artifactId>
- <version>2.6</version>
- <configuration>
- <encoding>${project.build.sourceEncoding}</encoding>
- </configuration>
- </plugin>
- </plugins>
- </build>
- <dependencies>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>ardor3d-math</artifactId>
- <version>${project.version}</version>
- </dependency>
- <dependency>
- <groupId>com.google.guava</groupId>
- <artifactId>guava</artifactId>
- </dependency>
- <dependency>
- <groupId>org.easymock</groupId>
- <artifactId>easymockclassextension</artifactId>
- </dependency>
- </dependencies>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- </properties>
-</project>
-
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>com.ardor3d</groupId>
+ <artifactId>ardor3d</artifactId>
+ <version>0.9-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>ardor3d-core</artifactId>
+ <packaging>bundle</packaging>
+ <name>Ardor 3D Core</name>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>2.3.2</version>
+ <configuration>
+ <source>1.6</source>
+ <target>1.6</target>
+ <encoding>${project.build.sourceEncoding}</encoding>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-resources-plugin</artifactId>
+ <version>2.6</version>
+ <configuration>
+ <encoding>${project.build.sourceEncoding}</encoding>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+ <dependencies>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>ardor3d-math</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.easymock</groupId>
+ <artifactId>easymockclassextension</artifactId>
+ </dependency>
+ </dependencies>
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ </properties>
+</project>
+
diff --git a/ardor3d-core/src/main/java/com/ardor3d/annotation/GuardedBy.java b/ardor3d-core/src/main/java/com/ardor3d/annotation/GuardedBy.java
index 636cc6b..fadc6b5 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/annotation/GuardedBy.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/annotation/GuardedBy.java
@@ -1,25 +1,25 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Documents which lock is used to guard a field, if the field is protected by a lock.
- */
-@Retention(RetentionPolicy.SOURCE)
-@Target(ElementType.FIELD)
-public @interface GuardedBy {
- String value();
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Documents which lock is used to guard a field, if the field is protected by a lock.
+ */
+@Retention(RetentionPolicy.SOURCE)
+@Target(ElementType.FIELD)
+public @interface GuardedBy {
+ String value();
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/annotation/Immutable.java b/ardor3d-core/src/main/java/com/ardor3d/annotation/Immutable.java
index e83a8ea..c5433f8 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/annotation/Immutable.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/annotation/Immutable.java
@@ -1,24 +1,24 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Indicates that a class is, or at least is intended to be, immutable in a strict sense. See
- * http://www.javaconcurrencyinpractice.com/ or the actual book for more information about immutability.
- */
-@Retention(RetentionPolicy.SOURCE)
-@Target(ElementType.TYPE)
-public @interface Immutable {}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Indicates that a class is, or at least is intended to be, immutable in a strict sense. See
+ * http://www.javaconcurrencyinpractice.com/ or the actual book for more information about immutability.
+ */
+@Retention(RetentionPolicy.SOURCE)
+@Target(ElementType.TYPE)
+public @interface Immutable {}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/annotation/MainThread.java b/ardor3d-core/src/main/java/com/ardor3d/annotation/MainThread.java
index 22efacf..6c596d1 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/annotation/MainThread.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/annotation/MainThread.java
@@ -1,35 +1,35 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Methods flagged with this annotation should only be run in the main thread, that is, the thread that handles the
- * OpenGL calls. It is possible, and good during development but possibly not during production, to use a method
- * interceptor that enforces this constraint, but in any case, the presence of the annotation should help programmers
- * when thinking about threading.
- *
- * This annotation should be used on any API method in the framework for which it is necessary to call it only from the
- * main thread. If it adds to clarity, it may be a good idea to use it for internal methods as well.
- *
- * Note that this annotation, when present on an interface method, does not get inherited, and it is therefore there
- * only for clarity purposes rather than as a way of getting method interception to work. It should always be added to
- * any class directly implementing an interface method that uses it.
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target( { ElementType.METHOD, ElementType.PARAMETER })
-@Inherited
-public @interface MainThread {}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Methods flagged with this annotation should only be run in the main thread, that is, the thread that handles the
+ * OpenGL calls. It is possible, and good during development but possibly not during production, to use a method
+ * interceptor that enforces this constraint, but in any case, the presence of the annotation should help programmers
+ * when thinking about threading.
+ *
+ * This annotation should be used on any API method in the framework for which it is necessary to call it only from the
+ * main thread. If it adds to clarity, it may be a good idea to use it for internal methods as well.
+ *
+ * Note that this annotation, when present on an interface method, does not get inherited, and it is therefore there
+ * only for clarity purposes rather than as a way of getting method interception to work. It should always be added to
+ * any class directly implementing an interface method that uses it.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target( { ElementType.METHOD, ElementType.PARAMETER })
+@Inherited
+public @interface MainThread {}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/annotation/ThreadSafe.java b/ardor3d-core/src/main/java/com/ardor3d/annotation/ThreadSafe.java
index 912e005..4be6bcc 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/annotation/ThreadSafe.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/annotation/ThreadSafe.java
@@ -1,23 +1,23 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Indicates that a class is, or at least is intended to be, thread safe.
- */
-@Retention(RetentionPolicy.SOURCE)
-@Target(ElementType.TYPE)
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Indicates that a class is, or at least is intended to be, thread safe.
+ */
+@Retention(RetentionPolicy.SOURCE)
+@Target(ElementType.TYPE)
public @interface ThreadSafe {} \ No newline at end of file
diff --git a/ardor3d-core/src/main/java/com/ardor3d/bounding/BoundingSphere.java b/ardor3d-core/src/main/java/com/ardor3d/bounding/BoundingSphere.java
index 675a53c..3c7b79a 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/bounding/BoundingSphere.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/bounding/BoundingSphere.java
@@ -83,7 +83,7 @@ public class BoundingSphere extends BoundingVolume {
transform.applyForward(_center, sphere._center);
if (!transform.isRotationMatrix()) {
- final Vector3 scale = new Vector3(1, 1, 1);
+ final Vector3 scale = _compVect3.set(1, 1, 1);
transform.applyForwardVector(scale);
sphere.setRadius(Math.abs(maxAxis(scale) * getRadius()) + radiusEpsilon - 1);
} else {
diff --git a/ardor3d-core/src/main/java/com/ardor3d/framework/Canvas.java b/ardor3d-core/src/main/java/com/ardor3d/framework/Canvas.java
index 8bab195..444a3ce 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/framework/Canvas.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/framework/Canvas.java
@@ -1,43 +1,43 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.framework;
-
-import java.util.concurrent.CountDownLatch;
-
-import com.ardor3d.annotation.MainThread;
-
-/**
- * This interface defines the View, and should maybe be called the ViewUpdater. It owns the rendering phase, and
- * controls all interactions with the Renderer.
- */
-public interface Canvas {
-
- /**
- * Do work to initialize this canvas, generally setting up the associated CanvasRenderer, etc.
- */
- @MainThread
- void init();
-
- /**
- * Ask the canvas to render itself. Note that this may occur in another thread and therefore a latch is given so the
- * caller may know when the draw has completed.
- *
- * @param latch
- * a counter that should be decremented once drawing has completed.
- */
- @MainThread
- void draw(CountDownLatch latch);
-
- /**
- * @return the CanvasRenderer associated with this Canvas.
- */
- CanvasRenderer getCanvasRenderer();
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.framework;
+
+import java.util.concurrent.CountDownLatch;
+
+import com.ardor3d.annotation.MainThread;
+
+/**
+ * This interface defines the View, and should maybe be called the ViewUpdater. It owns the rendering phase, and
+ * controls all interactions with the Renderer.
+ */
+public interface Canvas {
+
+ /**
+ * Do work to initialize this canvas, generally setting up the associated CanvasRenderer, etc.
+ */
+ @MainThread
+ void init();
+
+ /**
+ * Ask the canvas to render itself. Note that this may occur in another thread and therefore a latch is given so the
+ * caller may know when the draw has completed.
+ *
+ * @param latch
+ * a counter that should be decremented once drawing has completed.
+ */
+ @MainThread
+ void draw(CountDownLatch latch);
+
+ /**
+ * @return the CanvasRenderer associated with this Canvas.
+ */
+ CanvasRenderer getCanvasRenderer();
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/framework/CanvasRenderer.java b/ardor3d-core/src/main/java/com/ardor3d/framework/CanvasRenderer.java
index 5c5ba52..e6790df 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/framework/CanvasRenderer.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/framework/CanvasRenderer.java
@@ -1,100 +1,100 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.framework;
-
-import com.ardor3d.annotation.MainThread;
-import com.ardor3d.renderer.Camera;
-import com.ardor3d.renderer.RenderContext;
-import com.ardor3d.renderer.Renderer;
-import com.ardor3d.util.Ardor3dException;
-
-/**
- * Represents a class that knows how to render a scene using a specific Open GL implementation.
- */
-public interface CanvasRenderer {
- void init(DisplaySettings settings, boolean doSwap);
-
- /**
- * Draw the current state of the scene.
- */
- @MainThread
- boolean draw();
-
- /**
- * Returns the camera being used by this canvas renderer. Modifying the returned {@link Camera} instance effects the
- * view being rendered, so this method can be used to move the camera, etc.
- *
- * @return the camera used by this canvas renderer
- */
- Camera getCamera();
-
- /**
- * Replaces the camera being used by this canvas renderer.
- *
- * @param camera
- * the camera to use
- */
- void setCamera(Camera camera);
-
- /**
- * Returns the scene being used by this canvas renderer.
- *
- * @return the camera used by this canvas renderer
- */
- Scene getScene();
-
- /**
- * Replaces the scene being used by this canvas renderer.
- *
- * @param scene
- * the scene to use
- */
- void setScene(Scene scene);
-
- /**
- * Returns the renderer being used by this canvas renderer.
- *
- * @return the renderer used by this canvas renderer
- */
- Renderer getRenderer();
-
- /**
- * Have the CanvasRenderer claim the graphics context.
- *
- * @throws Ardor3dException
- * if we can not claim the context.
- */
- void makeCurrentContext() throws Ardor3dException;
-
- /**
- * Have the CanvasRenderer release the graphics context.
- */
- void releaseCurrentContext();
-
- /**
- * @return the Ardor3D RenderContext associated with this CanvasRenderer.
- */
- RenderContext getRenderContext();
-
- /**
- * @return an int representing the buffers to clear at the start of each frame. Default is
- * Renderer.BUFFER_COLOR_AND_DEPTH
- */
- int getFrameClear();
-
- /**
- * @param buffers
- * an int representing the buffers to clear at the start of each frame. Default is
- * Renderer.BUFFER_COLOR_AND_DEPTH
- */
- void setFrameClear(final int buffers);
-
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.framework;
+
+import com.ardor3d.annotation.MainThread;
+import com.ardor3d.renderer.Camera;
+import com.ardor3d.renderer.RenderContext;
+import com.ardor3d.renderer.Renderer;
+import com.ardor3d.util.Ardor3dException;
+
+/**
+ * Represents a class that knows how to render a scene using a specific Open GL implementation.
+ */
+public interface CanvasRenderer {
+ void init(DisplaySettings settings, boolean doSwap);
+
+ /**
+ * Draw the current state of the scene.
+ */
+ @MainThread
+ boolean draw();
+
+ /**
+ * Returns the camera being used by this canvas renderer. Modifying the returned {@link Camera} instance effects the
+ * view being rendered, so this method can be used to move the camera, etc.
+ *
+ * @return the camera used by this canvas renderer
+ */
+ Camera getCamera();
+
+ /**
+ * Replaces the camera being used by this canvas renderer.
+ *
+ * @param camera
+ * the camera to use
+ */
+ void setCamera(Camera camera);
+
+ /**
+ * Returns the scene being used by this canvas renderer.
+ *
+ * @return the camera used by this canvas renderer
+ */
+ Scene getScene();
+
+ /**
+ * Replaces the scene being used by this canvas renderer.
+ *
+ * @param scene
+ * the scene to use
+ */
+ void setScene(Scene scene);
+
+ /**
+ * Returns the renderer being used by this canvas renderer.
+ *
+ * @return the renderer used by this canvas renderer
+ */
+ Renderer getRenderer();
+
+ /**
+ * Have the CanvasRenderer claim the graphics context.
+ *
+ * @throws Ardor3dException
+ * if we can not claim the context.
+ */
+ void makeCurrentContext() throws Ardor3dException;
+
+ /**
+ * Have the CanvasRenderer release the graphics context.
+ */
+ void releaseCurrentContext();
+
+ /**
+ * @return the Ardor3D RenderContext associated with this CanvasRenderer.
+ */
+ RenderContext getRenderContext();
+
+ /**
+ * @return an int representing the buffers to clear at the start of each frame. Default is
+ * Renderer.BUFFER_COLOR_AND_DEPTH
+ */
+ int getFrameClear();
+
+ /**
+ * @param buffers
+ * an int representing the buffers to clear at the start of each frame. Default is
+ * Renderer.BUFFER_COLOR_AND_DEPTH
+ */
+ void setFrameClear(final int buffers);
+
} \ No newline at end of file
diff --git a/ardor3d-core/src/main/java/com/ardor3d/framework/NativeCanvas.java b/ardor3d-core/src/main/java/com/ardor3d/framework/NativeCanvas.java
index 5a0dc2d..1e912f6 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/framework/NativeCanvas.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/framework/NativeCanvas.java
@@ -1,82 +1,82 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.framework;
-
-import com.ardor3d.image.Image;
-
-public interface NativeCanvas extends Canvas {
-
- /**
- * <code>close</code> shutdowns and destroys any window contexts.
- */
- void close();
-
- /**
- * <code>isActive</code> returns true if the display is active.
- *
- * @return whether the display system is active.
- */
- boolean isActive();
-
- /**
- * <code>isClosing</code> notifies if the window is currently closing. This could be caused via the application
- * itself or external interrupts such as alt-f4 etc.
- *
- * @return true if the window is closing, false otherwise.
- */
- boolean isClosing();
-
- /**
- * <code>setVSyncEnabled</code> attempts to enable or disable monitor vertical synchronization. The method is a
- * "best attempt" to change the monitor vertical refresh synchronization, and is <b>not </b> guaranteed to be
- * successful. This is dependent on OS.
- *
- * @param enabled
- * <code>true</code> to synchronize, <code>false</code> to ignore synchronization
- */
- void setVSyncEnabled(boolean enabled);
-
- /**
- * Sets the title of the display system. This is usually reflected by the renderer as text in the menu bar.
- *
- * @param title
- * The new display title.
- */
- void setTitle(String title);
-
- /**
- * Sets one or more icons for the Canvas.
- * <p>
- * As a reference for usual platforms on number of icons and their sizes:
- * <ul>
- * <li>On Windows you should supply at least one 16x16 image and one 32x32.</li>
- * <li>Linux (and similar platforms) expect one 32x32 image.</li>
- * <li>Mac OS X should be supplied one 128x128 image.</li>
- * </ul>
- * </p>
- * <p>
- * Images should be in format RGBA8888. If they are not ardor3d will try to convert them using ImageUtils. If that
- * fails a <code>Ardor3dException</code> could be thrown.
- * </p>
- *
- * @param iconImages
- * Array of Images to be used as icons.
- */
- void setIcon(Image[] iconImages);
-
- /**
- * If running in windowed mode, move the window's position to the given display coordinates.
- *
- * @param locX
- * @param locY
- */
- void moveWindowTo(int locX, int locY);
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.framework;
+
+import com.ardor3d.image.Image;
+
+public interface NativeCanvas extends Canvas {
+
+ /**
+ * <code>close</code> shutdowns and destroys any window contexts.
+ */
+ void close();
+
+ /**
+ * <code>isActive</code> returns true if the display is active.
+ *
+ * @return whether the display system is active.
+ */
+ boolean isActive();
+
+ /**
+ * <code>isClosing</code> notifies if the window is currently closing. This could be caused via the application
+ * itself or external interrupts such as alt-f4 etc.
+ *
+ * @return true if the window is closing, false otherwise.
+ */
+ boolean isClosing();
+
+ /**
+ * <code>setVSyncEnabled</code> attempts to enable or disable monitor vertical synchronization. The method is a
+ * "best attempt" to change the monitor vertical refresh synchronization, and is <b>not </b> guaranteed to be
+ * successful. This is dependent on OS.
+ *
+ * @param enabled
+ * <code>true</code> to synchronize, <code>false</code> to ignore synchronization
+ */
+ void setVSyncEnabled(boolean enabled);
+
+ /**
+ * Sets the title of the display system. This is usually reflected by the renderer as text in the menu bar.
+ *
+ * @param title
+ * The new display title.
+ */
+ void setTitle(String title);
+
+ /**
+ * Sets one or more icons for the Canvas.
+ * <p>
+ * As a reference for usual platforms on number of icons and their sizes:
+ * <ul>
+ * <li>On Windows you should supply at least one 16x16 image and one 32x32.</li>
+ * <li>Linux (and similar platforms) expect one 32x32 image.</li>
+ * <li>Mac OS X should be supplied one 128x128 image.</li>
+ * </ul>
+ * </p>
+ * <p>
+ * Images should be in format RGBA8888. If they are not ardor3d will try to convert them using ImageUtils. If that
+ * fails a <code>Ardor3dException</code> could be thrown.
+ * </p>
+ *
+ * @param iconImages
+ * Array of Images to be used as icons.
+ */
+ void setIcon(Image[] iconImages);
+
+ /**
+ * If running in windowed mode, move the window's position to the given display coordinates.
+ *
+ * @param locX
+ * @param locY
+ */
+ void moveWindowTo(int locX, int locY);
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/framework/Scene.java b/ardor3d-core/src/main/java/com/ardor3d/framework/Scene.java
index bc7bc68..ba31d74 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/framework/Scene.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/framework/Scene.java
@@ -1,38 +1,38 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.framework;
-
-import com.ardor3d.annotation.MainThread;
-import com.ardor3d.intersection.PickResults;
-import com.ardor3d.math.Ray3;
-import com.ardor3d.renderer.Renderer;
-
-/**
- * Owns all the data that is related to the scene. This class should not really know anything about rendering or the
- * screen, it's just the scene data.
- */
-public interface Scene {
- /**
- *
- * @param renderer
- * @return true if a render occurred and we should swap the buffers.
- */
- @MainThread
- boolean renderUnto(Renderer renderer);
-
- /**
- * A scene should be able to handle a pick execution as it is the only thing that has a complete picture of the
- * scenegraph(s).
- *
- * @param pickRay
- */
- PickResults doPick(Ray3 pickRay);
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.framework;
+
+import com.ardor3d.annotation.MainThread;
+import com.ardor3d.intersection.PickResults;
+import com.ardor3d.math.Ray3;
+import com.ardor3d.renderer.Renderer;
+
+/**
+ * Owns all the data that is related to the scene. This class should not really know anything about rendering or the
+ * screen, it's just the scene data.
+ */
+public interface Scene {
+ /**
+ *
+ * @param renderer
+ * @return true if a render occurred and we should swap the buffers.
+ */
+ @MainThread
+ boolean renderUnto(Renderer renderer);
+
+ /**
+ * A scene should be able to handle a pick execution as it is the only thing that has a complete picture of the
+ * scenegraph(s).
+ *
+ * @param pickRay
+ */
+ PickResults doPick(Ray3 pickRay);
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/framework/Updater.java b/ardor3d-core/src/main/java/com/ardor3d/framework/Updater.java
index c984f51..5789ac0 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/framework/Updater.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/framework/Updater.java
@@ -1,25 +1,25 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.framework;
-
-import com.ardor3d.annotation.MainThread;
-import com.ardor3d.util.ReadOnlyTimer;
-
-/**
- * The purpose of this class is to own the update phase and separate update logic from the view.
- */
-public interface Updater {
- @MainThread
- public void init();
-
- @MainThread
- public void update(final ReadOnlyTimer timer);
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.framework;
+
+import com.ardor3d.annotation.MainThread;
+import com.ardor3d.util.ReadOnlyTimer;
+
+/**
+ * The purpose of this class is to own the update phase and separate update logic from the view.
+ */
+public interface Updater {
+ @MainThread
+ public void init();
+
+ @MainThread
+ public void update(final ReadOnlyTimer timer);
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/image/util/TextureProjector.java b/ardor3d-core/src/main/java/com/ardor3d/image/util/TextureProjector.java
index e39b826..b166cca 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/image/util/TextureProjector.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/image/util/TextureProjector.java
@@ -1,43 +1,43 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.image.util;
-
-import com.ardor3d.image.Texture;
-import com.ardor3d.math.Matrix4;
-import com.ardor3d.math.type.ReadOnlyMatrix4;
-import com.ardor3d.renderer.Camera;
-
-public class TextureProjector extends Camera {
-
- private final static ReadOnlyMatrix4 BIAS = new Matrix4( //
- 0.5, 0.0, 0.0, 0.0, //
- 0.0, 0.5, 0.0, 0.0, //
- 0.0, 0.0, 0.5, 0.0, //
- 0.5, 0.5, 0.5, 1.0);
-
- public TextureProjector() {
- super(1, 1);
- }
-
- public void updateTextureMatrix(final Texture texture) {
- final Matrix4 texMat = Matrix4.fetchTempInstance();
- updateTextureMatrix(texMat);
- texture.setTextureMatrix(texMat);
- Matrix4.releaseTempInstance(texMat);
- }
-
- public void updateTextureMatrix(final Matrix4 matrixStore) {
- update();
- final ReadOnlyMatrix4 projectorView = getModelViewMatrix();
- final ReadOnlyMatrix4 projectorProjection = getProjectionMatrix();
- matrixStore.set(projectorView).multiplyLocal(projectorProjection).multiplyLocal(BIAS);
- }
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.image.util;
+
+import com.ardor3d.image.Texture;
+import com.ardor3d.math.Matrix4;
+import com.ardor3d.math.type.ReadOnlyMatrix4;
+import com.ardor3d.renderer.Camera;
+
+public class TextureProjector extends Camera {
+
+ private final static ReadOnlyMatrix4 BIAS = new Matrix4( //
+ 0.5, 0.0, 0.0, 0.0, //
+ 0.0, 0.5, 0.0, 0.0, //
+ 0.0, 0.0, 0.5, 0.0, //
+ 0.5, 0.5, 0.5, 1.0);
+
+ public TextureProjector() {
+ super(1, 1);
+ }
+
+ public void updateTextureMatrix(final Texture texture) {
+ final Matrix4 texMat = Matrix4.fetchTempInstance();
+ updateTextureMatrix(texMat);
+ texture.setTextureMatrix(texMat);
+ Matrix4.releaseTempInstance(texMat);
+ }
+
+ public void updateTextureMatrix(final Matrix4 matrixStore) {
+ update();
+ final ReadOnlyMatrix4 projectorView = getModelViewMatrix();
+ final ReadOnlyMatrix4 projectorProjection = getProjectionMatrix();
+ matrixStore.set(projectorView).multiplyLocal(projectorProjection).multiplyLocal(BIAS);
+ }
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/input/ButtonState.java b/ardor3d-core/src/main/java/com/ardor3d/input/ButtonState.java
index 65150fc..9699db2 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/input/ButtonState.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/input/ButtonState.java
@@ -1,18 +1,18 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.input;
-
-/**
- * Enumerates the different states a mouse button can be in.
- */
-public enum ButtonState {
- UP, DOWN, UNDEFINED
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.input;
+
+/**
+ * Enumerates the different states a mouse button can be in.
+ */
+public enum ButtonState {
+ UP, DOWN, UNDEFINED
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/input/ControllerEvent.java b/ardor3d-core/src/main/java/com/ardor3d/input/ControllerEvent.java
index 0f7c895..c257b32 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/input/ControllerEvent.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/input/ControllerEvent.java
@@ -1,47 +1,47 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.input;
-
-public class ControllerEvent {
-
- private final long nanos;
- private final String controllerName;
- private final String componentName;
- private final float value;
-
- public ControllerEvent(final long nanos, final String controllerName, final String componentName, final float value) {
- this.nanos = nanos;
- this.controllerName = controllerName;
- this.componentName = componentName;
- this.value = value;
- }
-
- public long getNanos() {
- return nanos;
- }
-
- public String getControllerName() {
- return controllerName;
- }
-
- public String getComponentName() {
- return componentName;
- }
-
- public float getValue() {
- return value;
- }
-
- @Override
- public String toString() {
- return "ControllerEvent: " + controllerName + ", " + componentName + ", " + value + ", " + nanos;
- }
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.input;
+
+public class ControllerEvent {
+
+ private final long nanos;
+ private final String controllerName;
+ private final String componentName;
+ private final float value;
+
+ public ControllerEvent(final long nanos, final String controllerName, final String componentName, final float value) {
+ this.nanos = nanos;
+ this.controllerName = controllerName;
+ this.componentName = componentName;
+ this.value = value;
+ }
+
+ public long getNanos() {
+ return nanos;
+ }
+
+ public String getControllerName() {
+ return controllerName;
+ }
+
+ public String getComponentName() {
+ return componentName;
+ }
+
+ public float getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return "ControllerEvent: " + controllerName + ", " + componentName + ", " + value + ", " + nanos;
+ }
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/input/ControllerInfo.java b/ardor3d-core/src/main/java/com/ardor3d/input/ControllerInfo.java
index 5f6f205..a7e7c92 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/input/ControllerInfo.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/input/ControllerInfo.java
@@ -1,54 +1,54 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.input;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import com.google.common.collect.Lists;
-
-public class ControllerInfo {
-
- private final String _controllerName;
- private final ArrayList<String> _axisNames;
- private final ArrayList<String> _buttonNames;
-
- public ControllerInfo(final String controllerName, final List<String> axisNames, final List<String> buttonNames) {
- _controllerName = controllerName;
- _axisNames = Lists.newArrayList(axisNames);
- _buttonNames = Lists.newArrayList(buttonNames);
- }
-
- public String getControllerName() {
- return _controllerName;
- }
-
- public ArrayList<String> getAxisNames() {
- return _axisNames;
- }
-
- public ArrayList<String> getButtonNames() {
- return _buttonNames;
- }
-
- public int getAxisCount() {
- return _axisNames.size();
- }
-
- public int getButtonCount() {
- return _buttonNames.size();
- }
-
- @Override
- public String toString() {
- return "Controller '" + _controllerName + "' with Axis " + _axisNames + " and Buttons " + _buttonNames;
- }
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.input;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.google.common.collect.Lists;
+
+public class ControllerInfo {
+
+ private final String _controllerName;
+ private final ArrayList<String> _axisNames;
+ private final ArrayList<String> _buttonNames;
+
+ public ControllerInfo(final String controllerName, final List<String> axisNames, final List<String> buttonNames) {
+ _controllerName = controllerName;
+ _axisNames = Lists.newArrayList(axisNames);
+ _buttonNames = Lists.newArrayList(buttonNames);
+ }
+
+ public String getControllerName() {
+ return _controllerName;
+ }
+
+ public ArrayList<String> getAxisNames() {
+ return _axisNames;
+ }
+
+ public ArrayList<String> getButtonNames() {
+ return _buttonNames;
+ }
+
+ public int getAxisCount() {
+ return _axisNames.size();
+ }
+
+ public int getButtonCount() {
+ return _buttonNames.size();
+ }
+
+ @Override
+ public String toString() {
+ return "Controller '" + _controllerName + "' with Axis " + _axisNames + " and Buttons " + _buttonNames;
+ }
} \ No newline at end of file
diff --git a/ardor3d-core/src/main/java/com/ardor3d/input/ControllerState.java b/ardor3d-core/src/main/java/com/ardor3d/input/ControllerState.java
index 70e8c1c..15d3106 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/input/ControllerState.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/input/ControllerState.java
@@ -1,140 +1,140 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.input;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import com.ardor3d.annotation.Immutable;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-
-@Immutable
-public class ControllerState {
-
- public static final ControllerState NOTHING = new ControllerState(0);
-
- protected final Map<String, Map<String, Float>> _controllerStates = Maps.newLinkedHashMap();
- protected final List<ControllerEvent> _eventsSinceLastState = Lists.newArrayList();
-
- protected ControllerState(final int ignore) {}
-
- public ControllerState() {
- ControllerState.NOTHING.duplicateStates(_controllerStates);
- }
-
- public ControllerState(final ControllerState previous) {
- if (previous != null) {
- previous.duplicateStates(_controllerStates);
- } else {
- ControllerState.NOTHING.duplicateStates(_controllerStates);
- }
- }
-
- /**
- * Sets a components state
- */
- public void set(final String controllerName, final String componentName, final float value) {
- Map<String, Float> controllerState = null;
- if (_controllerStates.containsKey(controllerName)) {
- controllerState = _controllerStates.get(controllerName);
- } else {
- controllerState = new LinkedHashMap<String, Float>();
- _controllerStates.put(controllerName, controllerState);
- }
-
- controllerState.put(componentName, value);
- }
-
- @Override
- public boolean equals(final Object obj) {
- if (obj instanceof ControllerState) {
- final ControllerState other = (ControllerState) obj;
- return other._controllerStates.equals(_controllerStates);
- }
-
- return false;
- }
-
- @Override
- public String toString() {
- final StringBuilder stateString = new StringBuilder("ControllerState: ");
-
- for (final String controllerStateKey : _controllerStates.keySet()) {
- final Map<String, Float> state = _controllerStates.get(controllerStateKey);
- stateString.append('[').append(controllerStateKey);
- for (final String stateKey : state.keySet()) {
- stateString.append('[').append(stateKey).append(':').append(state.get(stateKey)).append(']');
- }
- stateString.append(']');
- }
-
- return stateString.toString();
- }
-
- public ControllerState snapshot() {
- final ControllerState snapshot = new ControllerState();
- duplicateStates(snapshot._controllerStates);
- snapshot._eventsSinceLastState.addAll(_eventsSinceLastState);
-
- return snapshot;
- }
-
- private void duplicateStates(final Map<String, Map<String, Float>> store) {
- store.clear();
- for (final Entry<String, Map<String, Float>> entry : _controllerStates.entrySet()) {
- store.put(entry.getKey(), Maps.newLinkedHashMap(entry.getValue()));
- }
- }
-
- public void addEvent(final ControllerEvent event) {
- _eventsSinceLastState.add(event);
- set(event.getControllerName(), event.getComponentName(), event.getValue());
- }
-
- public List<ControllerEvent> getEvents() {
- Collections.sort(_eventsSinceLastState, new Comparator<ControllerEvent>() {
- public int compare(final ControllerEvent o1, final ControllerEvent o2) {
- return (int) (o2.getNanos() - o1.getNanos());
- }
- });
-
- return Collections.unmodifiableList(_eventsSinceLastState);
- }
-
- public void clearEvents() {
- _eventsSinceLastState.clear();
- }
-
- public List<String> getControllerNames() {
- return new ArrayList<String>(_controllerStates.keySet());
- }
-
- public List<String> getControllerComponentNames(final String controller) {
- return new ArrayList<String>(_controllerStates.get(controller).keySet());
- }
-
- public Map<String, Float> getControllerComponentValues(final String controller) {
- return _controllerStates.get(controller);
- }
-
- public float getComponentValue(final String controller, final String component) {
- if (!_controllerStates.containsKey(controller) || !_controllerStates.get(controller).containsKey(component)) {
- return 0;
- }
- return _controllerStates.get(controller).get(component);
- }
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.input;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import com.ardor3d.annotation.Immutable;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
+@Immutable
+public class ControllerState {
+
+ public static final ControllerState NOTHING = new ControllerState(0);
+
+ protected final Map<String, Map<String, Float>> _controllerStates = Maps.newLinkedHashMap();
+ protected final List<ControllerEvent> _eventsSinceLastState = Lists.newArrayList();
+
+ protected ControllerState(final int ignore) {}
+
+ public ControllerState() {
+ ControllerState.NOTHING.duplicateStates(_controllerStates);
+ }
+
+ public ControllerState(final ControllerState previous) {
+ if (previous != null) {
+ previous.duplicateStates(_controllerStates);
+ } else {
+ ControllerState.NOTHING.duplicateStates(_controllerStates);
+ }
+ }
+
+ /**
+ * Sets a components state
+ */
+ public void set(final String controllerName, final String componentName, final float value) {
+ Map<String, Float> controllerState = null;
+ if (_controllerStates.containsKey(controllerName)) {
+ controllerState = _controllerStates.get(controllerName);
+ } else {
+ controllerState = new LinkedHashMap<String, Float>();
+ _controllerStates.put(controllerName, controllerState);
+ }
+
+ controllerState.put(componentName, value);
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ if (obj instanceof ControllerState) {
+ final ControllerState other = (ControllerState) obj;
+ return other._controllerStates.equals(_controllerStates);
+ }
+
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ final StringBuilder stateString = new StringBuilder("ControllerState: ");
+
+ for (final String controllerStateKey : _controllerStates.keySet()) {
+ final Map<String, Float> state = _controllerStates.get(controllerStateKey);
+ stateString.append('[').append(controllerStateKey);
+ for (final String stateKey : state.keySet()) {
+ stateString.append('[').append(stateKey).append(':').append(state.get(stateKey)).append(']');
+ }
+ stateString.append(']');
+ }
+
+ return stateString.toString();
+ }
+
+ public ControllerState snapshot() {
+ final ControllerState snapshot = new ControllerState();
+ duplicateStates(snapshot._controllerStates);
+ snapshot._eventsSinceLastState.addAll(_eventsSinceLastState);
+
+ return snapshot;
+ }
+
+ private void duplicateStates(final Map<String, Map<String, Float>> store) {
+ store.clear();
+ for (final Entry<String, Map<String, Float>> entry : _controllerStates.entrySet()) {
+ store.put(entry.getKey(), Maps.newLinkedHashMap(entry.getValue()));
+ }
+ }
+
+ public void addEvent(final ControllerEvent event) {
+ _eventsSinceLastState.add(event);
+ set(event.getControllerName(), event.getComponentName(), event.getValue());
+ }
+
+ public List<ControllerEvent> getEvents() {
+ Collections.sort(_eventsSinceLastState, new Comparator<ControllerEvent>() {
+ public int compare(final ControllerEvent o1, final ControllerEvent o2) {
+ return (int) (o2.getNanos() - o1.getNanos());
+ }
+ });
+
+ return Collections.unmodifiableList(_eventsSinceLastState);
+ }
+
+ public void clearEvents() {
+ _eventsSinceLastState.clear();
+ }
+
+ public List<String> getControllerNames() {
+ return new ArrayList<String>(_controllerStates.keySet());
+ }
+
+ public List<String> getControllerComponentNames(final String controller) {
+ return new ArrayList<String>(_controllerStates.get(controller).keySet());
+ }
+
+ public Map<String, Float> getControllerComponentValues(final String controller) {
+ return _controllerStates.get(controller);
+ }
+
+ public float getComponentValue(final String controller, final String component) {
+ if (!_controllerStates.containsKey(controller) || !_controllerStates.get(controller).containsKey(component)) {
+ return 0;
+ }
+ return _controllerStates.get(controller).get(component);
+ }
} \ No newline at end of file
diff --git a/ardor3d-core/src/main/java/com/ardor3d/input/ControllerWrapper.java b/ardor3d-core/src/main/java/com/ardor3d/input/ControllerWrapper.java
index e348ec7..ab4a408 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/input/ControllerWrapper.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/input/ControllerWrapper.java
@@ -1,32 +1,32 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.input;
-
-import com.google.common.collect.PeekingIterator;
-
-public interface ControllerWrapper {
- /**
- * Allows the controller wrapper implementation to initialize itself.
- */
- public void init();
-
- /**
- * Returns a peeking iterator that allows the client to loop through all controller events that have not yet been
- * handled.
- *
- * @return an iterator that allows the client to check which events have still not been handled
- */
- public PeekingIterator<ControllerEvent> getEvents();
-
- public int getControllerCount();
-
- public ControllerInfo getControllerInfo(int controllerIndex);
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.input;
+
+import com.google.common.collect.PeekingIterator;
+
+public interface ControllerWrapper {
+ /**
+ * Allows the controller wrapper implementation to initialize itself.
+ */
+ public void init();
+
+ /**
+ * Returns a peeking iterator that allows the client to loop through all controller events that have not yet been
+ * handled.
+ *
+ * @return an iterator that allows the client to check which events have still not been handled
+ */
+ public PeekingIterator<ControllerEvent> getEvents();
+
+ public int getControllerCount();
+
+ public ControllerInfo getControllerInfo(int controllerIndex);
} \ No newline at end of file
diff --git a/ardor3d-core/src/main/java/com/ardor3d/input/FocusWrapper.java b/ardor3d-core/src/main/java/com/ardor3d/input/FocusWrapper.java
index 6ac7b40..a0db729 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/input/FocusWrapper.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/input/FocusWrapper.java
@@ -1,20 +1,20 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.input;
-
-/**
- * Describes the interface to implement to keep track of focus changes.
- */
-public interface FocusWrapper {
- public boolean getAndClearFocusLost();
-
- void init();
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.input;
+
+/**
+ * Describes the interface to implement to keep track of focus changes.
+ */
+public interface FocusWrapper {
+ public boolean getAndClearFocusLost();
+
+ void init();
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/input/InputState.java b/ardor3d-core/src/main/java/com/ardor3d/input/InputState.java
index 7cfb58a..2b8e33e 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/input/InputState.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/input/InputState.java
@@ -1,75 +1,75 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.input;
-
-import com.ardor3d.annotation.Immutable;
-
-/**
- * The total input state of the devices that are being handled.
- */
-@Immutable
-public class InputState {
- public static final InputState LOST_FOCUS = new InputState(KeyboardState.NOTHING, MouseState.NOTHING,
- ControllerState.NOTHING);
- public static final InputState EMPTY = new InputState(KeyboardState.NOTHING, MouseState.NOTHING,
- ControllerState.NOTHING);
-
- private final KeyboardState keyboardState;
- private final MouseState mouseState;
- private final ControllerState controllerState;
-
- /**
- * Creates a new instance.
- *
- * @param keyboardState
- * a non-null KeyboardState instance
- * @param mouseState
- * a non-null MouseState instance
- * @throws NullPointerException
- * if either parameter is null
- */
- public InputState(final KeyboardState keyboardState, final MouseState mouseState,
- final ControllerState controllerState) {
- if (keyboardState == null) {
- throw new NullPointerException("Keyboard state");
- }
-
- if (mouseState == null) {
- throw new NullPointerException("Mouse state");
- }
-
- if (controllerState == null) {
- throw new NullPointerException("Controller state");
- }
-
- this.keyboardState = keyboardState;
- this.mouseState = mouseState;
- this.controllerState = controllerState;
- }
-
- public KeyboardState getKeyboardState() {
- return keyboardState;
- }
-
- public MouseState getMouseState() {
- return mouseState;
- }
-
- public ControllerState getControllerState() {
- return controllerState;
- }
-
- @Override
- public String toString() {
- return "InputState{" + "keyboardState=" + keyboardState + ", mouseState=" + mouseState + ", controllerState="
- + controllerState + '}';
- }
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.input;
+
+import com.ardor3d.annotation.Immutable;
+
+/**
+ * The total input state of the devices that are being handled.
+ */
+@Immutable
+public class InputState {
+ public static final InputState LOST_FOCUS = new InputState(KeyboardState.NOTHING, MouseState.NOTHING,
+ ControllerState.NOTHING);
+ public static final InputState EMPTY = new InputState(KeyboardState.NOTHING, MouseState.NOTHING,
+ ControllerState.NOTHING);
+
+ private final KeyboardState keyboardState;
+ private final MouseState mouseState;
+ private final ControllerState controllerState;
+
+ /**
+ * Creates a new instance.
+ *
+ * @param keyboardState
+ * a non-null KeyboardState instance
+ * @param mouseState
+ * a non-null MouseState instance
+ * @throws NullPointerException
+ * if either parameter is null
+ */
+ public InputState(final KeyboardState keyboardState, final MouseState mouseState,
+ final ControllerState controllerState) {
+ if (keyboardState == null) {
+ throw new NullPointerException("Keyboard state");
+ }
+
+ if (mouseState == null) {
+ throw new NullPointerException("Mouse state");
+ }
+
+ if (controllerState == null) {
+ throw new NullPointerException("Controller state");
+ }
+
+ this.keyboardState = keyboardState;
+ this.mouseState = mouseState;
+ this.controllerState = controllerState;
+ }
+
+ public KeyboardState getKeyboardState() {
+ return keyboardState;
+ }
+
+ public MouseState getMouseState() {
+ return mouseState;
+ }
+
+ public ControllerState getControllerState() {
+ return controllerState;
+ }
+
+ @Override
+ public String toString() {
+ return "InputState{" + "keyboardState=" + keyboardState + ", mouseState=" + mouseState + ", controllerState="
+ + controllerState + '}';
+ }
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/input/Key.java b/ardor3d-core/src/main/java/com/ardor3d/input/Key.java
index d9cad0d..d9a2c28 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/input/Key.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/input/Key.java
@@ -1,761 +1,761 @@
-/**
- * Copyright 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.input;
-
-/**
- * Keys supported by Ardor3D platforms. Note that all keys are not likely supported by any one platform.
- */
-public enum Key {
- /**
- * Returned when a key character is not supported.
- */
- UNKNOWN,
-
- /**
- * escape key.
- */
- ESCAPE,
-
- /**
- * 1 key.
- */
- ONE,
-
- /**
- * 2 key.
- */
- TWO,
-
- /**
- * 3 key.
- */
- THREE,
-
- /**
- * 4 key.
- */
- FOUR,
-
- /**
- * 5 key.
- */
- FIVE,
-
- /**
- * 6 key.
- */
- SIX,
-
- /**
- * 7 key.
- */
- SEVEN,
-
- /**
- * 8 key.
- */
- EIGHT,
-
- /**
- * 9 key.
- */
- NINE,
-
- /**
- * 0 key.
- */
- ZERO,
-
- /**
- * - key.
- */
- MINUS,
-
- /**
- * = key.
- */
- EQUALS,
-
- /**
- * back key.
- */
- BACK,
-
- /**
- * tab key.
- */
- TAB,
-
- /**
- * q key.
- */
- Q,
-
- /**
- * w key.
- */
- W,
-
- /**
- * e key.
- */
- E,
-
- /**
- * r key.
- */
- R,
-
- /**
- * t key.
- */
- T,
-
- /**
- * y key.
- */
- Y,
-
- /**
- * u key.
- */
- U,
-
- /**
- * i key.
- */
- I,
-
- /**
- * o key.
- */
- O,
-
- /**
- * p key.
- */
- P,
-
- /**
- * [ key.
- */
- LBRACKET,
-
- /**
- * ] key.
- */
- RBRACKET,
-
- /**
- * enter key.
- */
- RETURN,
-
- /**
- * left control key.
- */
- LCONTROL,
-
- /**
- * a key.
- */
- A,
-
- /**
- * s key.
- */
- S,
-
- /**
- * d key.
- */
- D,
-
- /**
- * f key.
- */
- F,
-
- /**
- * g key.
- */
- G,
-
- /**
- * h key.
- */
- H,
-
- /**
- * j key.
- */
- J,
-
- /**
- * k key.
- */
- K,
-
- /**
- * l key.
- */
- L,
-
- /**
- * ; key.
- */
- SEMICOLON,
-
- /**
- * ' key.
- */
- APOSTROPHE,
-
- /**
- * Applications key.
- */
- APPS,
-
- /**
- * ` key.
- */
- GRAVE,
-
- /**
- * left shift key.
- */
- LSHIFT,
-
- /**
- * \ key.
- */
- BACKSLASH,
-
- /**
- * z key.
- */
- Z,
-
- /**
- * x key.
- */
- X,
-
- /**
- * c key.
- */
- C,
-
- /**
- * v key.
- */
- V,
-
- /**
- * b key.
- */
- B,
-
- /**
- * n key.
- */
- N,
-
- /**
- * m key.
- */
- M,
-
- /**
- * , key.
- */
- COMMA,
-
- /**
- * . key .
- */
- PERIOD,
-
- /**
- * / key .
- */
- SLASH,
-
- /**
- * right shift key.
- */
- RSHIFT,
-
- /**
- * * key .
- */
- MULTIPLY,
-
- /**
- * left alt key.
- */
- LMENU,
-
- /**
- * space key.
- */
- SPACE,
-
- /**
- * caps lock key.
- */
- CAPITAL,
-
- /**
- * F1 key.
- */
- F1,
-
- /**
- * F2 key.
- */
- F2,
-
- /**
- * F3 key.
- */
- F3,
-
- /**
- * F4 key.
- */
- F4,
-
- /**
- * F5 key.
- */
- F5,
-
- /**
- * F6 key.
- */
- F6,
-
- /**
- * F7 key.
- */
- F7,
-
- /**
- * F8 key.
- */
- F8,
-
- /**
- * F9 key.
- */
- F9,
-
- /**
- * F10 key.
- */
- F10,
-
- /**
- * NumLK key.
- */
- NUMLOCK,
-
- /**
- * Scroll lock key.
- */
- SCROLL,
-
- /**
- * 7 key .
- */
- NUMPAD7,
-
- /**
- * 8 key .
- */
- NUMPAD8,
-
- /**
- * 9 key .
- */
- NUMPAD9,
-
- /**
- * - key .
- */
- NUMPADSUBTRACT,
-
- /**
- * 4 key .
- */
- NUMPAD4,
-
- /**
- * 5 key .
- */
- NUMPAD5,
-
- /**
- * 6 key .
- */
- NUMPAD6,
-
- /**
- * + key .
- */
- NUMPADADD,
-
- /**
- * 1 key .
- */
- NUMPAD1,
-
- /**
- * 2 key .
- */
- NUMPAD2,
-
- /**
- * 3 key .
- */
- NUMPAD3,
-
- /**
- * 0 key .
- */
- NUMPAD0,
-
- /**
- * . key .
- */
- DECIMAL,
-
- /**
- * F11 key.
- */
- F11,
-
- /**
- * F12 key.
- */
- F12,
-
- /**
- * F13 key.
- */
- F13,
-
- /**
- * F14 key.
- */
- F14,
-
- /**
- * F15 key.
- */
- F15,
-
- /**
- * kana key .
- */
- KANA,
-
- /**
- * convert key .
- */
- CONVERT,
-
- /**
- * noconvert key .
- */
- NOCONVERT,
-
- /**
- * yen key .
- */
- YEN,
-
- /**
- * = on num pad .
- */
- NUMPADEQUALS,
-
- /**
- * circum flex key .
- */
- CIRCUMFLEX,
-
- /**
- * &#064; key .
- */
- AT,
-
- /**
- * : key
- */
- COLON,
-
- /**
- * _ key .
- */
- UNDERLINE,
-
- /**
- * kanji key .
- */
- KANJI,
-
- /**
- * stop key .
- */
- STOP,
-
- /**
- * ax key .
- */
- AX,
-
- /**
- * .
- */
- UNLABELED,
-
- /**
- * Enter key .
- */
- NUMPADENTER,
-
- /**
- * right control key.
- */
- RCONTROL,
-
- /**
- * , key on num pad .
- */
- NUMPADCOMMA,
-
- /**
- * / key .
- */
- DIVIDE,
-
- /**
- * SysRq key.
- */
- SYSRQ,
-
- /**
- * right alt key.
- */
- RMENU,
-
- /**
- * pause key.
- */
- PAUSE,
-
- /**
- * home key.
- */
- HOME,
-
- /**
- * up arrow key.
- */
- UP,
-
- /**
- * PageUp/Prior key.
- */
- PAGEUP_PRIOR,
-
- /**
- * left arrow key.
- */
- LEFT,
-
- /**
- * right arrow key.
- */
- RIGHT,
-
- /**
- * end key.
- */
- END,
-
- /**
- * down arrow key.
- */
- DOWN,
-
- /**
- * PageDown/Next key.
- */
- PAGEDOWN_NEXT,
-
- /**
- * insert key.
- */
- INSERT,
-
- /**
- * delete key.
- */
- DELETE,
-
- /**
- * Left Windows/Option key
- */
- LMETA,
-
- /**
- * Right Windows/Option key
- */
- RMETA,
-
- /**
- * power key.
- */
- POWER,
-
- /**
- * sleep key.
- */
- SLEEP,
-
- /**
- * mobile call button
- */
- CALL,
-
- /**
- * mobile camera button
- */
- CAMERA,
-
- /**
- * mobile clear button
- */
- CLEAR,
-
- /**
- * dpad center button
- */
- CENTER,
-
- /**
- * mobile end call button
- */
- ENDCALL,
-
- /**
- * mobile envelope button
- */
- ENVELOPE,
-
- /**
- * mobile explorer button
- */
- EXPLORER,
-
- /**
- * mobile focus button
- */
- FOCUS,
-
- /**
- * mobile headsethook button
- */
- HEADSETHOOK,
-
- /**
- * mobile fast fwd button
- */
- MEDIA_FAST_FORWARD,
-
- /**
- * mobile next button
- */
- MEDIA_NEXT,
-
- /**
- * mobile play/pause button
- */
- PLAY_PAUSE,
-
- /**
- * mobile previous button
- */
- MEDIA_PREVIOUS,
-
- /**
- * mobile rewind button
- */
- MEDIA_REWIND,
-
- /**
- * mobile stop button
- */
- MEDIA_STOP,
-
- /**
- * mobile menu button
- */
- MENU,
-
- /**
- * mobile mute button
- */
- MUTE,
-
- /**
- * mobile notification button
- */
- NOTIFICATION,
-
- /**
- * plus key
- */
- PLUS,
-
- /**
- * pound key
- */
- POUND,
-
- /**
- * mobile call button
- */
- SEARCH,
-
- /**
- * mobile star button
- */
- STAR,
-
- /**
- * mobile # button
- */
- SYM,
-
- /**
- * volume down button
- */
- VOLUME_DOWN,
-
- /**
- * volume up button
- */
- VOLUME_UP;
-}
+/**
+ * Copyright 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.input;
+
+/**
+ * Keys supported by Ardor3D platforms. Note that all keys are not likely supported by any one platform.
+ */
+public enum Key {
+ /**
+ * Returned when a key character is not supported.
+ */
+ UNKNOWN,
+
+ /**
+ * escape key.
+ */
+ ESCAPE,
+
+ /**
+ * 1 key.
+ */
+ ONE,
+
+ /**
+ * 2 key.
+ */
+ TWO,
+
+ /**
+ * 3 key.
+ */
+ THREE,
+
+ /**
+ * 4 key.
+ */
+ FOUR,
+
+ /**
+ * 5 key.
+ */
+ FIVE,
+
+ /**
+ * 6 key.
+ */
+ SIX,
+
+ /**
+ * 7 key.
+ */
+ SEVEN,
+
+ /**
+ * 8 key.
+ */
+ EIGHT,
+
+ /**
+ * 9 key.
+ */
+ NINE,
+
+ /**
+ * 0 key.
+ */
+ ZERO,
+
+ /**
+ * - key.
+ */
+ MINUS,
+
+ /**
+ * = key.
+ */
+ EQUALS,
+
+ /**
+ * back key.
+ */
+ BACK,
+
+ /**
+ * tab key.
+ */
+ TAB,
+
+ /**
+ * q key.
+ */
+ Q,
+
+ /**
+ * w key.
+ */
+ W,
+
+ /**
+ * e key.
+ */
+ E,
+
+ /**
+ * r key.
+ */
+ R,
+
+ /**
+ * t key.
+ */
+ T,
+
+ /**
+ * y key.
+ */
+ Y,
+
+ /**
+ * u key.
+ */
+ U,
+
+ /**
+ * i key.
+ */
+ I,
+
+ /**
+ * o key.
+ */
+ O,
+
+ /**
+ * p key.
+ */
+ P,
+
+ /**
+ * [ key.
+ */
+ LBRACKET,
+
+ /**
+ * ] key.
+ */
+ RBRACKET,
+
+ /**
+ * enter key.
+ */
+ RETURN,
+
+ /**
+ * left control key.
+ */
+ LCONTROL,
+
+ /**
+ * a key.
+ */
+ A,
+
+ /**
+ * s key.
+ */
+ S,
+
+ /**
+ * d key.
+ */
+ D,
+
+ /**
+ * f key.
+ */
+ F,
+
+ /**
+ * g key.
+ */
+ G,
+
+ /**
+ * h key.
+ */
+ H,
+
+ /**
+ * j key.
+ */
+ J,
+
+ /**
+ * k key.
+ */
+ K,
+
+ /**
+ * l key.
+ */
+ L,
+
+ /**
+ * ; key.
+ */
+ SEMICOLON,
+
+ /**
+ * ' key.
+ */
+ APOSTROPHE,
+
+ /**
+ * Applications key.
+ */
+ APPS,
+
+ /**
+ * ` key.
+ */
+ GRAVE,
+
+ /**
+ * left shift key.
+ */
+ LSHIFT,
+
+ /**
+ * \ key.
+ */
+ BACKSLASH,
+
+ /**
+ * z key.
+ */
+ Z,
+
+ /**
+ * x key.
+ */
+ X,
+
+ /**
+ * c key.
+ */
+ C,
+
+ /**
+ * v key.
+ */
+ V,
+
+ /**
+ * b key.
+ */
+ B,
+
+ /**
+ * n key.
+ */
+ N,
+
+ /**
+ * m key.
+ */
+ M,
+
+ /**
+ * , key.
+ */
+ COMMA,
+
+ /**
+ * . key .
+ */
+ PERIOD,
+
+ /**
+ * / key .
+ */
+ SLASH,
+
+ /**
+ * right shift key.
+ */
+ RSHIFT,
+
+ /**
+ * * key .
+ */
+ MULTIPLY,
+
+ /**
+ * left alt key.
+ */
+ LMENU,
+
+ /**
+ * space key.
+ */
+ SPACE,
+
+ /**
+ * caps lock key.
+ */
+ CAPITAL,
+
+ /**
+ * F1 key.
+ */
+ F1,
+
+ /**
+ * F2 key.
+ */
+ F2,
+
+ /**
+ * F3 key.
+ */
+ F3,
+
+ /**
+ * F4 key.
+ */
+ F4,
+
+ /**
+ * F5 key.
+ */
+ F5,
+
+ /**
+ * F6 key.
+ */
+ F6,
+
+ /**
+ * F7 key.
+ */
+ F7,
+
+ /**
+ * F8 key.
+ */
+ F8,
+
+ /**
+ * F9 key.
+ */
+ F9,
+
+ /**
+ * F10 key.
+ */
+ F10,
+
+ /**
+ * NumLK key.
+ */
+ NUMLOCK,
+
+ /**
+ * Scroll lock key.
+ */
+ SCROLL,
+
+ /**
+ * 7 key .
+ */
+ NUMPAD7,
+
+ /**
+ * 8 key .
+ */
+ NUMPAD8,
+
+ /**
+ * 9 key .
+ */
+ NUMPAD9,
+
+ /**
+ * - key .
+ */
+ NUMPADSUBTRACT,
+
+ /**
+ * 4 key .
+ */
+ NUMPAD4,
+
+ /**
+ * 5 key .
+ */
+ NUMPAD5,
+
+ /**
+ * 6 key .
+ */
+ NUMPAD6,
+
+ /**
+ * + key .
+ */
+ NUMPADADD,
+
+ /**
+ * 1 key .
+ */
+ NUMPAD1,
+
+ /**
+ * 2 key .
+ */
+ NUMPAD2,
+
+ /**
+ * 3 key .
+ */
+ NUMPAD3,
+
+ /**
+ * 0 key .
+ */
+ NUMPAD0,
+
+ /**
+ * . key .
+ */
+ DECIMAL,
+
+ /**
+ * F11 key.
+ */
+ F11,
+
+ /**
+ * F12 key.
+ */
+ F12,
+
+ /**
+ * F13 key.
+ */
+ F13,
+
+ /**
+ * F14 key.
+ */
+ F14,
+
+ /**
+ * F15 key.
+ */
+ F15,
+
+ /**
+ * kana key .
+ */
+ KANA,
+
+ /**
+ * convert key .
+ */
+ CONVERT,
+
+ /**
+ * noconvert key .
+ */
+ NOCONVERT,
+
+ /**
+ * yen key .
+ */
+ YEN,
+
+ /**
+ * = on num pad .
+ */
+ NUMPADEQUALS,
+
+ /**
+ * circum flex key .
+ */
+ CIRCUMFLEX,
+
+ /**
+ * &#064; key .
+ */
+ AT,
+
+ /**
+ * : key
+ */
+ COLON,
+
+ /**
+ * _ key .
+ */
+ UNDERLINE,
+
+ /**
+ * kanji key .
+ */
+ KANJI,
+
+ /**
+ * stop key .
+ */
+ STOP,
+
+ /**
+ * ax key .
+ */
+ AX,
+
+ /**
+ * .
+ */
+ UNLABELED,
+
+ /**
+ * Enter key .
+ */
+ NUMPADENTER,
+
+ /**
+ * right control key.
+ */
+ RCONTROL,
+
+ /**
+ * , key on num pad .
+ */
+ NUMPADCOMMA,
+
+ /**
+ * / key .
+ */
+ DIVIDE,
+
+ /**
+ * SysRq key.
+ */
+ SYSRQ,
+
+ /**
+ * right alt key.
+ */
+ RMENU,
+
+ /**
+ * pause key.
+ */
+ PAUSE,
+
+ /**
+ * home key.
+ */
+ HOME,
+
+ /**
+ * up arrow key.
+ */
+ UP,
+
+ /**
+ * PageUp/Prior key.
+ */
+ PAGEUP_PRIOR,
+
+ /**
+ * left arrow key.
+ */
+ LEFT,
+
+ /**
+ * right arrow key.
+ */
+ RIGHT,
+
+ /**
+ * end key.
+ */
+ END,
+
+ /**
+ * down arrow key.
+ */
+ DOWN,
+
+ /**
+ * PageDown/Next key.
+ */
+ PAGEDOWN_NEXT,
+
+ /**
+ * insert key.
+ */
+ INSERT,
+
+ /**
+ * delete key.
+ */
+ DELETE,
+
+ /**
+ * Left Windows/Option key
+ */
+ LMETA,
+
+ /**
+ * Right Windows/Option key
+ */
+ RMETA,
+
+ /**
+ * power key.
+ */
+ POWER,
+
+ /**
+ * sleep key.
+ */
+ SLEEP,
+
+ /**
+ * mobile call button
+ */
+ CALL,
+
+ /**
+ * mobile camera button
+ */
+ CAMERA,
+
+ /**
+ * mobile clear button
+ */
+ CLEAR,
+
+ /**
+ * dpad center button
+ */
+ CENTER,
+
+ /**
+ * mobile end call button
+ */
+ ENDCALL,
+
+ /**
+ * mobile envelope button
+ */
+ ENVELOPE,
+
+ /**
+ * mobile explorer button
+ */
+ EXPLORER,
+
+ /**
+ * mobile focus button
+ */
+ FOCUS,
+
+ /**
+ * mobile headsethook button
+ */
+ HEADSETHOOK,
+
+ /**
+ * mobile fast fwd button
+ */
+ MEDIA_FAST_FORWARD,
+
+ /**
+ * mobile next button
+ */
+ MEDIA_NEXT,
+
+ /**
+ * mobile play/pause button
+ */
+ PLAY_PAUSE,
+
+ /**
+ * mobile previous button
+ */
+ MEDIA_PREVIOUS,
+
+ /**
+ * mobile rewind button
+ */
+ MEDIA_REWIND,
+
+ /**
+ * mobile stop button
+ */
+ MEDIA_STOP,
+
+ /**
+ * mobile menu button
+ */
+ MENU,
+
+ /**
+ * mobile mute button
+ */
+ MUTE,
+
+ /**
+ * mobile notification button
+ */
+ NOTIFICATION,
+
+ /**
+ * plus key
+ */
+ PLUS,
+
+ /**
+ * pound key
+ */
+ POUND,
+
+ /**
+ * mobile call button
+ */
+ SEARCH,
+
+ /**
+ * mobile star button
+ */
+ STAR,
+
+ /**
+ * mobile # button
+ */
+ SYM,
+
+ /**
+ * volume down button
+ */
+ VOLUME_DOWN,
+
+ /**
+ * volume up button
+ */
+ VOLUME_UP;
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/input/KeyNotFoundException.java b/ardor3d-core/src/main/java/com/ardor3d/input/KeyNotFoundException.java
index 4ca5df1..7a0383c 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/input/KeyNotFoundException.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/input/KeyNotFoundException.java
@@ -1,23 +1,23 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.input;
-
-/**
- * Thrown when an attempt at fetching a {@link Key} instance for an invalid/unknown key code is made.
- */
-public class KeyNotFoundException extends RuntimeException {
-
- private static final long serialVersionUID = 1L;
-
- public KeyNotFoundException(final int keyCode) {
- super("No Key enum value found for code: " + keyCode);
- }
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.input;
+
+/**
+ * Thrown when an attempt at fetching a {@link Key} instance for an invalid/unknown key code is made.
+ */
+public class KeyNotFoundException extends RuntimeException {
+
+ private static final long serialVersionUID = 1L;
+
+ public KeyNotFoundException(final int keyCode) {
+ super("No Key enum value found for code: " + keyCode);
+ }
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/input/KeyState.java b/ardor3d-core/src/main/java/com/ardor3d/input/KeyState.java
index 770e2f3..ffdac8c 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/input/KeyState.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/input/KeyState.java
@@ -1,18 +1,18 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.input;
-
-/**
- * Describes whether a key is down or up.
- */
-public enum KeyState {
- DOWN, UP
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.input;
+
+/**
+ * Describes whether a key is down or up.
+ */
+public enum KeyState {
+ DOWN, UP
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/input/KeyboardWrapper.java b/ardor3d-core/src/main/java/com/ardor3d/input/KeyboardWrapper.java
index 106db04..4d0d64b 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/input/KeyboardWrapper.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/input/KeyboardWrapper.java
@@ -1,31 +1,31 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.input;
-
-import com.google.common.collect.PeekingIterator;
-
-/**
- * Defines the API for keyboard wrappers.
- */
-public interface KeyboardWrapper {
- /**
- * Allows the keyboard wrapper implementation to initialise itself.
- */
- public void init();
-
- /**
- * Returns a peeking iterator that allows the client to loop through all keyboard events that have not yet been
- * handled.
- *
- * @return an iterator that allows the client to check which events have still not been handled
- */
- public PeekingIterator<KeyEvent> getEvents();
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.input;
+
+import com.google.common.collect.PeekingIterator;
+
+/**
+ * Defines the API for keyboard wrappers.
+ */
+public interface KeyboardWrapper {
+ /**
+ * Allows the keyboard wrapper implementation to initialise itself.
+ */
+ public void init();
+
+ /**
+ * Returns a peeking iterator that allows the client to loop through all keyboard events that have not yet been
+ * handled.
+ *
+ * @return an iterator that allows the client to check which events have still not been handled
+ */
+ public PeekingIterator<KeyEvent> getEvents();
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/input/MouseButton.java b/ardor3d-core/src/main/java/com/ardor3d/input/MouseButton.java
index 7c088a7..a99556e 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/input/MouseButton.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/input/MouseButton.java
@@ -1,37 +1,37 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.input;
-
-import java.util.EnumMap;
-
-import com.google.common.collect.Maps;
-
-public enum MouseButton {
- LEFT, RIGHT, MIDDLE;
-
- public static EnumMap<MouseButton, ButtonState> makeMap(final ButtonState left, final ButtonState right,
- final ButtonState middle) {
- if (left == null) {
- throw new NullPointerException("left");
- }
- if (right == null) {
- throw new NullPointerException("right");
- }
- if (middle == null) {
- throw new NullPointerException("middle");
- }
- final EnumMap<MouseButton, ButtonState> map = Maps.newEnumMap(MouseButton.class);
- map.put(LEFT, left);
- map.put(RIGHT, right);
- map.put(MIDDLE, middle);
- return map;
- }
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.input;
+
+import java.util.EnumMap;
+
+import com.google.common.collect.Maps;
+
+public enum MouseButton {
+ LEFT, RIGHT, MIDDLE;
+
+ public static EnumMap<MouseButton, ButtonState> makeMap(final ButtonState left, final ButtonState right,
+ final ButtonState middle) {
+ if (left == null) {
+ throw new NullPointerException("left");
+ }
+ if (right == null) {
+ throw new NullPointerException("right");
+ }
+ if (middle == null) {
+ throw new NullPointerException("middle");
+ }
+ final EnumMap<MouseButton, ButtonState> map = Maps.newEnumMap(MouseButton.class);
+ map.put(LEFT, left);
+ map.put(RIGHT, right);
+ map.put(MIDDLE, middle);
+ return map;
+ }
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/input/MouseWrapper.java b/ardor3d-core/src/main/java/com/ardor3d/input/MouseWrapper.java
index c44ef28..bc8d663 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/input/MouseWrapper.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/input/MouseWrapper.java
@@ -1,31 +1,31 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.input;
-
-import com.google.common.collect.PeekingIterator;
-
-/**
- * Defines the API for mouse wrappers.
- */
-public interface MouseWrapper {
- /**
- * Allows the mouse wrapper implementation to initialize itself.
- */
- public void init();
-
- /**
- * Returns a peeking iterator that allows the client to loop through all mouse events that have not yet been
- * handled.
- *
- * @return an iterator that allows the client to check which events have still not been handled
- */
- public PeekingIterator<MouseState> getEvents();
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.input;
+
+import com.google.common.collect.PeekingIterator;
+
+/**
+ * Defines the API for mouse wrappers.
+ */
+public interface MouseWrapper {
+ /**
+ * Allows the mouse wrapper implementation to initialize itself.
+ */
+ public void init();
+
+ /**
+ * Returns a peeking iterator that allows the client to loop through all mouse events that have not yet been
+ * handled.
+ *
+ * @return an iterator that allows the client to check which events have still not been handled
+ */
+ public PeekingIterator<MouseState> getEvents();
} \ No newline at end of file
diff --git a/ardor3d-core/src/main/java/com/ardor3d/input/logical/AnyControllerCondition.java b/ardor3d-core/src/main/java/com/ardor3d/input/logical/AnyControllerCondition.java
index ae3dcc1..8626a5f 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/input/logical/AnyControllerCondition.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/input/logical/AnyControllerCondition.java
@@ -1,26 +1,26 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.input.logical;
-
-import com.ardor3d.input.ControllerState;
-import com.google.common.base.Predicate;
-
-public final class AnyControllerCondition implements Predicate<TwoInputStates> {
-
- public boolean apply(final TwoInputStates states) {
- final ControllerState oldState = states.getPrevious().getControllerState();
- final ControllerState currentState = states.getCurrent().getControllerState();
-
- final boolean apply = !oldState.equals(currentState);
- return apply;
- }
-
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.input.logical;
+
+import com.ardor3d.input.ControllerState;
+import com.google.common.base.Predicate;
+
+public final class AnyControllerCondition implements Predicate<TwoInputStates> {
+
+ public boolean apply(final TwoInputStates states) {
+ final ControllerState oldState = states.getPrevious().getControllerState();
+ final ControllerState currentState = states.getCurrent().getControllerState();
+
+ final boolean apply = !oldState.equals(currentState);
+ return apply;
+ }
+
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/input/logical/ControllerComponentActiveCondition.java b/ardor3d-core/src/main/java/com/ardor3d/input/logical/ControllerComponentActiveCondition.java
index 4937a74..6289c88 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/input/logical/ControllerComponentActiveCondition.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/input/logical/ControllerComponentActiveCondition.java
@@ -1,58 +1,58 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.input.logical;
-
-import java.util.Map;
-
-import com.google.common.base.Predicate;
-
-public final class ControllerComponentActiveCondition implements Predicate<TwoInputStates> {
-
- private final String controllerName;
- private final String[] componentNames;
-
- public ControllerComponentActiveCondition(final String controller, final String... components) {
- controllerName = controller;
- componentNames = components;
- }
-
- public boolean apply(final TwoInputStates states) {
- final Map<String, Float> currentStates = states.getCurrent().getControllerState()
- .getControllerComponentValues(controllerName);
- final Map<String, Float> previousStates = states.getPrevious().getControllerState()
- .getControllerComponentValues(controllerName);
-
- if (currentStates == null) {
- return false;
- }
-
- Float prev, curr;
- for (final String component : componentNames) {
- curr = currentStates.get(component);
- if (curr == null) {
- continue;
- }
- if (curr.floatValue() != 0) {
- return true;
- }
-
- if (previousStates != null) {
- prev = previousStates.get(component);
-
- if (prev != null && curr.floatValue() != prev.floatValue()) {
- return true;
- }
- }
- }
-
- return false;
- }
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.input.logical;
+
+import java.util.Map;
+
+import com.google.common.base.Predicate;
+
+public final class ControllerComponentActiveCondition implements Predicate<TwoInputStates> {
+
+ private final String controllerName;
+ private final String[] componentNames;
+
+ public ControllerComponentActiveCondition(final String controller, final String... components) {
+ controllerName = controller;
+ componentNames = components;
+ }
+
+ public boolean apply(final TwoInputStates states) {
+ final Map<String, Float> currentStates = states.getCurrent().getControllerState()
+ .getControllerComponentValues(controllerName);
+ final Map<String, Float> previousStates = states.getPrevious().getControllerState()
+ .getControllerComponentValues(controllerName);
+
+ if (currentStates == null) {
+ return false;
+ }
+
+ Float prev, curr;
+ for (final String component : componentNames) {
+ curr = currentStates.get(component);
+ if (curr == null) {
+ continue;
+ }
+ if (curr.floatValue() != 0) {
+ return true;
+ }
+
+ if (previousStates != null) {
+ prev = previousStates.get(component);
+
+ if (prev != null && curr.floatValue() != prev.floatValue()) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
} \ No newline at end of file
diff --git a/ardor3d-core/src/main/java/com/ardor3d/input/logical/ControllerComponentCondition.java b/ardor3d-core/src/main/java/com/ardor3d/input/logical/ControllerComponentCondition.java
index 9f76c6a..a088149 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/input/logical/ControllerComponentCondition.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/input/logical/ControllerComponentCondition.java
@@ -1,60 +1,60 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.input.logical;
-
-import java.util.List;
-
-import com.ardor3d.input.ControllerEvent;
-import com.ardor3d.input.ControllerState;
-import com.google.common.base.Predicate;
-
-public final class ControllerComponentCondition implements Predicate<TwoInputStates> {
-
- private int controllerIndex = -1;
- private int componentIndex = -1;
- private String controllerName = null;
- private String componentName = null;
-
- public ControllerComponentCondition(final int controller, final int component) {
- controllerIndex = controller;
- componentIndex = component;
- }
-
- public ControllerComponentCondition(final String controller, final String component) {
- controllerName = controller;
- componentName = component;
- }
-
- public boolean apply(final TwoInputStates states) {
- boolean apply = false;
- final ControllerState currentState = states.getCurrent().getControllerState();
- final ControllerState previousState = states.getPrevious().getControllerState();
-
- if (!previousState.equals(currentState)) {
-
- if (controllerName == null) {
- controllerName = currentState.getControllerNames().get(controllerIndex);
- }
- if (componentName == null) {
- componentName = currentState.getControllerComponentNames(controllerName).get(componentIndex);
- }
-
- final List<ControllerEvent> events = currentState.getEvents();
- for (final ControllerEvent event : events) {
- if (event.getControllerName().equals(controllerName) && event.getComponentName().equals(componentName)) {
- apply = true;
- }
- }
- }
- return apply;
- }
-
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.input.logical;
+
+import java.util.List;
+
+import com.ardor3d.input.ControllerEvent;
+import com.ardor3d.input.ControllerState;
+import com.google.common.base.Predicate;
+
+public final class ControllerComponentCondition implements Predicate<TwoInputStates> {
+
+ private int controllerIndex = -1;
+ private int componentIndex = -1;
+ private String controllerName = null;
+ private String componentName = null;
+
+ public ControllerComponentCondition(final int controller, final int component) {
+ controllerIndex = controller;
+ componentIndex = component;
+ }
+
+ public ControllerComponentCondition(final String controller, final String component) {
+ controllerName = controller;
+ componentName = component;
+ }
+
+ public boolean apply(final TwoInputStates states) {
+ boolean apply = false;
+ final ControllerState currentState = states.getCurrent().getControllerState();
+ final ControllerState previousState = states.getPrevious().getControllerState();
+
+ if (!previousState.equals(currentState)) {
+
+ if (controllerName == null) {
+ controllerName = currentState.getControllerNames().get(controllerIndex);
+ }
+ if (componentName == null) {
+ componentName = currentState.getControllerComponentNames(controllerName).get(componentIndex);
+ }
+
+ final List<ControllerEvent> events = currentState.getEvents();
+ for (final ControllerEvent event : events) {
+ if (event.getControllerName().equals(controllerName) && event.getComponentName().equals(componentName)) {
+ apply = true;
+ }
+ }
+ }
+ return apply;
+ }
+
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/input/logical/ControllerCondition.java b/ardor3d-core/src/main/java/com/ardor3d/input/logical/ControllerCondition.java
index 79a4a02..757b2b6 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/input/logical/ControllerCondition.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/input/logical/ControllerCondition.java
@@ -1,51 +1,51 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.input.logical;
-
-import java.util.List;
-
-import com.ardor3d.input.ControllerEvent;
-import com.ardor3d.input.ControllerState;
-import com.google.common.base.Predicate;
-
-public final class ControllerCondition implements Predicate<TwoInputStates> {
-
- private int controllerIndex = -1;
- private String controllerName = null;
-
- public ControllerCondition(final int controller) {
- controllerIndex = controller;
- }
-
- public ControllerCondition(final String controller) {
- controllerName = controller;
- }
-
- public boolean apply(final TwoInputStates states) {
- boolean apply = false;
- final ControllerState currentState = states.getCurrent().getControllerState();
- final ControllerState previousState = states.getPrevious().getControllerState();
-
- if (!previousState.equals(currentState)) {
- if (controllerName == null) {
- controllerName = currentState.getControllerNames().get(controllerIndex);
- }
- final List<ControllerEvent> events = currentState.getEvents();
- for (final ControllerEvent event : events) {
- if (event.getControllerName().equals(controllerName)) {
- apply = true;
- }
- }
- }
- return apply;
- }
-
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.input.logical;
+
+import java.util.List;
+
+import com.ardor3d.input.ControllerEvent;
+import com.ardor3d.input.ControllerState;
+import com.google.common.base.Predicate;
+
+public final class ControllerCondition implements Predicate<TwoInputStates> {
+
+ private int controllerIndex = -1;
+ private String controllerName = null;
+
+ public ControllerCondition(final int controller) {
+ controllerIndex = controller;
+ }
+
+ public ControllerCondition(final String controller) {
+ controllerName = controller;
+ }
+
+ public boolean apply(final TwoInputStates states) {
+ boolean apply = false;
+ final ControllerState currentState = states.getCurrent().getControllerState();
+ final ControllerState previousState = states.getPrevious().getControllerState();
+
+ if (!previousState.equals(currentState)) {
+ if (controllerName == null) {
+ controllerName = currentState.getControllerNames().get(controllerIndex);
+ }
+ final List<ControllerEvent> events = currentState.getEvents();
+ for (final ControllerEvent event : events) {
+ if (event.getControllerName().equals(controllerName)) {
+ apply = true;
+ }
+ }
+ }
+ return apply;
+ }
+
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/input/logical/DummyControllerWrapper.java b/ardor3d-core/src/main/java/com/ardor3d/input/logical/DummyControllerWrapper.java
index eda4351..2194704 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/input/logical/DummyControllerWrapper.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/input/logical/DummyControllerWrapper.java
@@ -1,54 +1,54 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.input.logical;
-
-import com.ardor3d.input.ControllerEvent;
-import com.ardor3d.input.ControllerInfo;
-import com.ardor3d.input.ControllerWrapper;
-import com.google.common.collect.PeekingIterator;
-
-public class DummyControllerWrapper implements ControllerWrapper {
- public static final DummyControllerWrapper INSTANCE = new DummyControllerWrapper();
-
- PeekingIterator<ControllerEvent> empty = new PeekingIterator<ControllerEvent>() {
- public boolean hasNext() {
- return false;
- }
-
- public void remove() {}
-
- public ControllerEvent peek() {
- return null;
- }
-
- public ControllerEvent next() {
- return null;
- }
- };
-
- public PeekingIterator<ControllerEvent> getEvents() {
- return empty;
- }
-
- public void init() {
- ; // ignore, does nothing
- }
-
- @Override
- public int getControllerCount() {
- return 0;
- }
-
- @Override
- public ControllerInfo getControllerInfo(final int controllerIndex) {
- return null;
- }
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.input.logical;
+
+import com.ardor3d.input.ControllerEvent;
+import com.ardor3d.input.ControllerInfo;
+import com.ardor3d.input.ControllerWrapper;
+import com.google.common.collect.PeekingIterator;
+
+public class DummyControllerWrapper implements ControllerWrapper {
+ public static final DummyControllerWrapper INSTANCE = new DummyControllerWrapper();
+
+ PeekingIterator<ControllerEvent> empty = new PeekingIterator<ControllerEvent>() {
+ public boolean hasNext() {
+ return false;
+ }
+
+ public void remove() {}
+
+ public ControllerEvent peek() {
+ return null;
+ }
+
+ public ControllerEvent next() {
+ return null;
+ }
+ };
+
+ public PeekingIterator<ControllerEvent> getEvents() {
+ return empty;
+ }
+
+ public void init() {
+ ; // ignore, does nothing
+ }
+
+ @Override
+ public int getControllerCount() {
+ return 0;
+ }
+
+ @Override
+ public ControllerInfo getControllerInfo(final int controllerIndex) {
+ return null;
+ }
} \ No newline at end of file
diff --git a/ardor3d-core/src/main/java/com/ardor3d/input/logical/InputTrigger.java b/ardor3d-core/src/main/java/com/ardor3d/input/logical/InputTrigger.java
index fb5119f..5c126f4 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/input/logical/InputTrigger.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/input/logical/InputTrigger.java
@@ -1,85 +1,85 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.input.logical;
-
-import com.ardor3d.annotation.Immutable;
-import com.ardor3d.framework.Canvas;
-import com.google.common.base.Predicate;
-
-/**
- * Defines an action to be performed when a specific input condition is met.
- */
-@Immutable
-public final class InputTrigger {
- private final Predicate<TwoInputStates> _condition;
- private final TriggerAction _action;
- private String _id;
-
- /**
- * Construct a new InputTrigger with the given condition and action.
- *
- * @param condition
- * the predicate to test for this trigger
- * @param action
- * the action to take if the predicate returns true.
- */
- public InputTrigger(final Predicate<TwoInputStates> condition, final TriggerAction action) {
- _condition = condition;
- _action = action;
- }
-
- /**
- * Construct a new InputTrigger with the given condition and action.
- *
- * @param condition
- * the predicate to test for this trigger
- * @param action
- * the action to take if the predicate returns true.
- * @param id
- * an id, useful for identifying this trigger for deregistration, etc.
- */
- public InputTrigger(final Predicate<TwoInputStates> condition, final TriggerAction action, final String id) {
- _condition = condition;
- _action = action;
- _id = id;
- }
-
- /**
- * Checks if the condition is applicable, and if so, performs the action.
- *
- * @param source
- * the Canvas that was the source of the current input
- * @param states
- * the input states to check
- * @param tpf
- * the time per frame in seconds
- */
- void performIfValid(final Canvas source, final TwoInputStates states, final double tpf) {
- if (_condition.apply(states)) {
- _action.perform(source, states, tpf);
- }
- }
-
- /**
- * @param id
- * the id to set. This id can be used to uniquely identify a trigger.
- */
- public void setId(final String id) {
- _id = id;
- }
-
- /**
- * @return the id set, or null if none was set.
- */
- public String getId() {
- return _id;
- }
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.input.logical;
+
+import com.ardor3d.annotation.Immutable;
+import com.ardor3d.framework.Canvas;
+import com.google.common.base.Predicate;
+
+/**
+ * Defines an action to be performed when a specific input condition is met.
+ */
+@Immutable
+public final class InputTrigger {
+ private final Predicate<TwoInputStates> _condition;
+ private final TriggerAction _action;
+ private String _id;
+
+ /**
+ * Construct a new InputTrigger with the given condition and action.
+ *
+ * @param condition
+ * the predicate to test for this trigger
+ * @param action
+ * the action to take if the predicate returns true.
+ */
+ public InputTrigger(final Predicate<TwoInputStates> condition, final TriggerAction action) {
+ _condition = condition;
+ _action = action;
+ }
+
+ /**
+ * Construct a new InputTrigger with the given condition and action.
+ *
+ * @param condition
+ * the predicate to test for this trigger
+ * @param action
+ * the action to take if the predicate returns true.
+ * @param id
+ * an id, useful for identifying this trigger for deregistration, etc.
+ */
+ public InputTrigger(final Predicate<TwoInputStates> condition, final TriggerAction action, final String id) {
+ _condition = condition;
+ _action = action;
+ _id = id;
+ }
+
+ /**
+ * Checks if the condition is applicable, and if so, performs the action.
+ *
+ * @param source
+ * the Canvas that was the source of the current input
+ * @param states
+ * the input states to check
+ * @param tpf
+ * the time per frame in seconds
+ */
+ void performIfValid(final Canvas source, final TwoInputStates states, final double tpf) {
+ if (_condition.apply(states)) {
+ _action.perform(source, states, tpf);
+ }
+ }
+
+ /**
+ * @param id
+ * the id to set. This id can be used to uniquely identify a trigger.
+ */
+ public void setId(final String id) {
+ _id = id;
+ }
+
+ /**
+ * @return the id set, or null if none was set.
+ */
+ public String getId() {
+ return _id;
+ }
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/input/logical/KeyHeldCondition.java b/ardor3d-core/src/main/java/com/ardor3d/input/logical/KeyHeldCondition.java
index e913b22..ce2b600 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/input/logical/KeyHeldCondition.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/input/logical/KeyHeldCondition.java
@@ -1,43 +1,43 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.input.logical;
-
-import com.ardor3d.annotation.Immutable;
-import com.ardor3d.input.Key;
-import com.google.common.base.Predicate;
-
-/**
- * A condition that is true when a key is down in the current input state.
- */
-@Immutable
-public final class KeyHeldCondition implements Predicate<TwoInputStates> {
- private final Key key;
-
- /**
- * Construct a new KeyHeldCondition.
- *
- * @param key
- * the key that should be held
- * @throws NullPointerException
- * if the key is null
- */
- public KeyHeldCondition(final Key key) {
- if (key == null) {
- throw new NullPointerException();
- }
-
- this.key = key;
- }
-
- public boolean apply(final TwoInputStates states) {
- return states.getCurrent().getKeyboardState().isDown(key);
- }
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.input.logical;
+
+import com.ardor3d.annotation.Immutable;
+import com.ardor3d.input.Key;
+import com.google.common.base.Predicate;
+
+/**
+ * A condition that is true when a key is down in the current input state.
+ */
+@Immutable
+public final class KeyHeldCondition implements Predicate<TwoInputStates> {
+ private final Key key;
+
+ /**
+ * Construct a new KeyHeldCondition.
+ *
+ * @param key
+ * the key that should be held
+ * @throws NullPointerException
+ * if the key is null
+ */
+ public KeyHeldCondition(final Key key) {
+ if (key == null) {
+ throw new NullPointerException();
+ }
+
+ this.key = key;
+ }
+
+ public boolean apply(final TwoInputStates states) {
+ return states.getCurrent().getKeyboardState().isDown(key);
+ }
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/input/logical/KeyPressedCondition.java b/ardor3d-core/src/main/java/com/ardor3d/input/logical/KeyPressedCondition.java
index fd56bb3..cdb19d6 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/input/logical/KeyPressedCondition.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/input/logical/KeyPressedCondition.java
@@ -1,47 +1,47 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.input.logical;
-
-import com.ardor3d.annotation.Immutable;
-import com.ardor3d.input.InputState;
-import com.ardor3d.input.Key;
-import com.google.common.base.Predicate;
-
-/**
- * A condition that is true if a given key was pressed when going from the previous input state to the current one.
- */
-@Immutable
-public final class KeyPressedCondition implements Predicate<TwoInputStates> {
- private final Key key;
-
- /**
- * Construct a new KeyPressedCondition.
- *
- * @param key
- * the key that should be held
- * @throws NullPointerException
- * if the key is null
- */
- public KeyPressedCondition(final Key key) {
- if (key == null) {
- throw new NullPointerException();
- }
-
- this.key = key;
- }
-
- public boolean apply(final TwoInputStates states) {
- final InputState currentState = states.getCurrent();
- final InputState previousState = states.getPrevious();
-
- return currentState.getKeyboardState().getKeysPressedSince(previousState.getKeyboardState()).contains(key);
- }
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.input.logical;
+
+import com.ardor3d.annotation.Immutable;
+import com.ardor3d.input.InputState;
+import com.ardor3d.input.Key;
+import com.google.common.base.Predicate;
+
+/**
+ * A condition that is true if a given key was pressed when going from the previous input state to the current one.
+ */
+@Immutable
+public final class KeyPressedCondition implements Predicate<TwoInputStates> {
+ private final Key key;
+
+ /**
+ * Construct a new KeyPressedCondition.
+ *
+ * @param key
+ * the key that should be held
+ * @throws NullPointerException
+ * if the key is null
+ */
+ public KeyPressedCondition(final Key key) {
+ if (key == null) {
+ throw new NullPointerException();
+ }
+
+ this.key = key;
+ }
+
+ public boolean apply(final TwoInputStates states) {
+ final InputState currentState = states.getCurrent();
+ final InputState previousState = states.getPrevious();
+
+ return currentState.getKeyboardState().getKeysPressedSince(previousState.getKeyboardState()).contains(key);
+ }
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/input/logical/KeyReleasedCondition.java b/ardor3d-core/src/main/java/com/ardor3d/input/logical/KeyReleasedCondition.java
index d7e313f..b08f5ef 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/input/logical/KeyReleasedCondition.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/input/logical/KeyReleasedCondition.java
@@ -1,47 +1,47 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.input.logical;
-
-import com.ardor3d.annotation.Immutable;
-import com.ardor3d.input.InputState;
-import com.ardor3d.input.Key;
-import com.google.common.base.Predicate;
-
-/**
- * A condition that is true when a key was released from the previous to the current input state.
- */
-@Immutable
-public final class KeyReleasedCondition implements Predicate<TwoInputStates> {
- private final Key key;
-
- /**
- * Construct a new KeyReleasedCondition.
- *
- * @param key
- * the key that should be held
- * @throws NullPointerException
- * if the key is null
- */
- public KeyReleasedCondition(final Key key) {
- if (key == null) {
- throw new NullPointerException();
- }
-
- this.key = key;
- }
-
- public boolean apply(final TwoInputStates states) {
- final InputState currentState = states.getCurrent();
- final InputState previousState = states.getPrevious();
-
- return currentState.getKeyboardState().getKeysReleasedSince(previousState.getKeyboardState()).contains(key);
- }
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.input.logical;
+
+import com.ardor3d.annotation.Immutable;
+import com.ardor3d.input.InputState;
+import com.ardor3d.input.Key;
+import com.google.common.base.Predicate;
+
+/**
+ * A condition that is true when a key was released from the previous to the current input state.
+ */
+@Immutable
+public final class KeyReleasedCondition implements Predicate<TwoInputStates> {
+ private final Key key;
+
+ /**
+ * Construct a new KeyReleasedCondition.
+ *
+ * @param key
+ * the key that should be held
+ * @throws NullPointerException
+ * if the key is null
+ */
+ public KeyReleasedCondition(final Key key) {
+ if (key == null) {
+ throw new NullPointerException();
+ }
+
+ this.key = key;
+ }
+
+ public boolean apply(final TwoInputStates states) {
+ final InputState currentState = states.getCurrent();
+ final InputState previousState = states.getPrevious();
+
+ return currentState.getKeyboardState().getKeysReleasedSince(previousState.getKeyboardState()).contains(key);
+ }
} \ No newline at end of file
diff --git a/ardor3d-core/src/main/java/com/ardor3d/input/logical/MouseButtonClickedCondition.java b/ardor3d-core/src/main/java/com/ardor3d/input/logical/MouseButtonClickedCondition.java
index 3fb0153..4c2a5ff 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/input/logical/MouseButtonClickedCondition.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/input/logical/MouseButtonClickedCondition.java
@@ -1,47 +1,47 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.input.logical;
-
-import com.ardor3d.annotation.Immutable;
-import com.ardor3d.input.InputState;
-import com.ardor3d.input.MouseButton;
-import com.google.common.base.Predicate;
-
-/**
- * A condition that is true if a given button was clicked (has a click count) when going from the previous input state
- * to the current one.
- */
-@Immutable
-public final class MouseButtonClickedCondition implements Predicate<TwoInputStates> {
- private final MouseButton _button;
-
- /**
- * Construct a new MouseButtonClickedCondition.
- *
- * @param button
- * the button that should be "clicked" to trigger this condition
- * @throws NullPointerException
- * if the button is null
- */
- public MouseButtonClickedCondition(final MouseButton button) {
- if (button == null) {
- throw new NullPointerException();
- }
-
- _button = button;
- }
-
- public boolean apply(final TwoInputStates states) {
- final InputState currentState = states.getCurrent();
-
- return currentState.getMouseState().getButtonsClicked().contains(_button);
- }
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.input.logical;
+
+import com.ardor3d.annotation.Immutable;
+import com.ardor3d.input.InputState;
+import com.ardor3d.input.MouseButton;
+import com.google.common.base.Predicate;
+
+/**
+ * A condition that is true if a given button was clicked (has a click count) when going from the previous input state
+ * to the current one.
+ */
+@Immutable
+public final class MouseButtonClickedCondition implements Predicate<TwoInputStates> {
+ private final MouseButton _button;
+
+ /**
+ * Construct a new MouseButtonClickedCondition.
+ *
+ * @param button
+ * the button that should be "clicked" to trigger this condition
+ * @throws NullPointerException
+ * if the button is null
+ */
+ public MouseButtonClickedCondition(final MouseButton button) {
+ if (button == null) {
+ throw new NullPointerException();
+ }
+
+ _button = button;
+ }
+
+ public boolean apply(final TwoInputStates states) {
+ final InputState currentState = states.getCurrent();
+
+ return currentState.getMouseState().getButtonsClicked().contains(_button);
+ }
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/input/logical/MouseButtonCondition.java b/ardor3d-core/src/main/java/com/ardor3d/input/logical/MouseButtonCondition.java
index ecb03cb..af19920 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/input/logical/MouseButtonCondition.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/input/logical/MouseButtonCondition.java
@@ -1,62 +1,62 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.input.logical;
-
-import java.util.EnumMap;
-
-import com.ardor3d.annotation.Immutable;
-import com.ardor3d.input.ButtonState;
-import com.ardor3d.input.InputState;
-import com.ardor3d.input.MouseButton;
-import com.google.common.base.Predicate;
-import com.google.common.collect.Maps;
-
-/**
- * A condition that checks the state of the two most commonly used mouse buttons.
- */
-@Immutable
-public final class MouseButtonCondition implements Predicate<TwoInputStates> {
- private final EnumMap<MouseButton, ButtonState> _states = Maps.newEnumMap(MouseButton.class);
-
- public MouseButtonCondition(final EnumMap<MouseButton, ButtonState> states) {
- _states.putAll(states);
- }
-
- public MouseButtonCondition(final ButtonState left, final ButtonState right, final ButtonState middle) {
- if (left != ButtonState.UNDEFINED) {
- _states.put(MouseButton.LEFT, left);
- }
- if (right != ButtonState.UNDEFINED) {
- _states.put(MouseButton.RIGHT, right);
- }
- if (middle != ButtonState.UNDEFINED) {
- _states.put(MouseButton.MIDDLE, middle);
- }
- }
-
- public boolean apply(final TwoInputStates states) {
- final InputState currentState = states.getCurrent();
-
- if (currentState == null) {
- return false;
- }
-
- for (final MouseButton button : _states.keySet()) {
- final ButtonState required = _states.get(button);
- if (required != ButtonState.UNDEFINED) {
- if (currentState.getMouseState().getButtonState(button) != required) {
- return false;
- }
- }
- }
- return true;
- }
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.input.logical;
+
+import java.util.EnumMap;
+
+import com.ardor3d.annotation.Immutable;
+import com.ardor3d.input.ButtonState;
+import com.ardor3d.input.InputState;
+import com.ardor3d.input.MouseButton;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Maps;
+
+/**
+ * A condition that checks the state of the two most commonly used mouse buttons.
+ */
+@Immutable
+public final class MouseButtonCondition implements Predicate<TwoInputStates> {
+ private final EnumMap<MouseButton, ButtonState> _states = Maps.newEnumMap(MouseButton.class);
+
+ public MouseButtonCondition(final EnumMap<MouseButton, ButtonState> states) {
+ _states.putAll(states);
+ }
+
+ public MouseButtonCondition(final ButtonState left, final ButtonState right, final ButtonState middle) {
+ if (left != ButtonState.UNDEFINED) {
+ _states.put(MouseButton.LEFT, left);
+ }
+ if (right != ButtonState.UNDEFINED) {
+ _states.put(MouseButton.RIGHT, right);
+ }
+ if (middle != ButtonState.UNDEFINED) {
+ _states.put(MouseButton.MIDDLE, middle);
+ }
+ }
+
+ public boolean apply(final TwoInputStates states) {
+ final InputState currentState = states.getCurrent();
+
+ if (currentState == null) {
+ return false;
+ }
+
+ for (final MouseButton button : _states.keySet()) {
+ final ButtonState required = _states.get(button);
+ if (required != ButtonState.UNDEFINED) {
+ if (currentState.getMouseState().getButtonState(button) != required) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/input/logical/MouseButtonPressedCondition.java b/ardor3d-core/src/main/java/com/ardor3d/input/logical/MouseButtonPressedCondition.java
index b804246..a460517 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/input/logical/MouseButtonPressedCondition.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/input/logical/MouseButtonPressedCondition.java
@@ -1,53 +1,53 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.input.logical;
-
-import com.ardor3d.annotation.Immutable;
-import com.ardor3d.input.ButtonState;
-import com.ardor3d.input.InputState;
-import com.ardor3d.input.MouseButton;
-import com.google.common.base.Predicate;
-
-/**
- * A condition that is true if a given button was pressed when going from the previous input state to the current one.
- */
-@Immutable
-public final class MouseButtonPressedCondition implements Predicate<TwoInputStates> {
- private final MouseButton _button;
-
- /**
- * Construct a new MouseButtonPressedCondition.
- *
- * @param button
- * the button that should be pressed to trigger this condition
- * @throws NullPointerException
- * if the button is null
- */
- public MouseButtonPressedCondition(final MouseButton button) {
- if (button == null) {
- throw new NullPointerException();
- }
-
- _button = button;
- }
-
- public boolean apply(final TwoInputStates states) {
- final InputState currentState = states.getCurrent();
- final InputState previousState = states.getPrevious();
-
- if (currentState == null || previousState == null
- || !currentState.getMouseState().hasButtonState(ButtonState.DOWN)) {
- return false;
- }
-
- return currentState.getMouseState().getButtonsPressedSince(previousState.getMouseState()).contains(_button);
- }
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.input.logical;
+
+import com.ardor3d.annotation.Immutable;
+import com.ardor3d.input.ButtonState;
+import com.ardor3d.input.InputState;
+import com.ardor3d.input.MouseButton;
+import com.google.common.base.Predicate;
+
+/**
+ * A condition that is true if a given button was pressed when going from the previous input state to the current one.
+ */
+@Immutable
+public final class MouseButtonPressedCondition implements Predicate<TwoInputStates> {
+ private final MouseButton _button;
+
+ /**
+ * Construct a new MouseButtonPressedCondition.
+ *
+ * @param button
+ * the button that should be pressed to trigger this condition
+ * @throws NullPointerException
+ * if the button is null
+ */
+ public MouseButtonPressedCondition(final MouseButton button) {
+ if (button == null) {
+ throw new NullPointerException();
+ }
+
+ _button = button;
+ }
+
+ public boolean apply(final TwoInputStates states) {
+ final InputState currentState = states.getCurrent();
+ final InputState previousState = states.getPrevious();
+
+ if (currentState == null || previousState == null
+ || !currentState.getMouseState().hasButtonState(ButtonState.DOWN)) {
+ return false;
+ }
+
+ return currentState.getMouseState().getButtonsPressedSince(previousState.getMouseState()).contains(_button);
+ }
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/input/logical/MouseButtonReleasedCondition.java b/ardor3d-core/src/main/java/com/ardor3d/input/logical/MouseButtonReleasedCondition.java
index 461d889..f9b0ebb 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/input/logical/MouseButtonReleasedCondition.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/input/logical/MouseButtonReleasedCondition.java
@@ -1,53 +1,53 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.input.logical;
-
-import com.ardor3d.annotation.Immutable;
-import com.ardor3d.input.ButtonState;
-import com.ardor3d.input.InputState;
-import com.ardor3d.input.MouseButton;
-import com.google.common.base.Predicate;
-
-/**
- * A condition that is true if a given button was pressed when going from the previous input state to the current one.
- */
-@Immutable
-public final class MouseButtonReleasedCondition implements Predicate<TwoInputStates> {
- private final MouseButton _button;
-
- /**
- * Construct a new MouseButtonPressedCondition.
- *
- * @param button
- * the button that should be pressed to trigger this condition
- * @throws NullPointerException
- * if the button is null
- */
- public MouseButtonReleasedCondition(final MouseButton button) {
- if (button == null) {
- throw new NullPointerException();
- }
-
- _button = button;
- }
-
- public boolean apply(final TwoInputStates states) {
- final InputState currentState = states.getCurrent();
- final InputState previousState = states.getPrevious();
-
- if (currentState == null || previousState == null
- || !previousState.getMouseState().hasButtonState(ButtonState.DOWN)) {
- return false;
- }
-
- return currentState.getMouseState().getButtonsReleasedSince(previousState.getMouseState()).contains(_button);
- }
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.input.logical;
+
+import com.ardor3d.annotation.Immutable;
+import com.ardor3d.input.ButtonState;
+import com.ardor3d.input.InputState;
+import com.ardor3d.input.MouseButton;
+import com.google.common.base.Predicate;
+
+/**
+ * A condition that is true if a given button was pressed when going from the previous input state to the current one.
+ */
+@Immutable
+public final class MouseButtonReleasedCondition implements Predicate<TwoInputStates> {
+ private final MouseButton _button;
+
+ /**
+ * Construct a new MouseButtonPressedCondition.
+ *
+ * @param button
+ * the button that should be pressed to trigger this condition
+ * @throws NullPointerException
+ * if the button is null
+ */
+ public MouseButtonReleasedCondition(final MouseButton button) {
+ if (button == null) {
+ throw new NullPointerException();
+ }
+
+ _button = button;
+ }
+
+ public boolean apply(final TwoInputStates states) {
+ final InputState currentState = states.getCurrent();
+ final InputState previousState = states.getPrevious();
+
+ if (currentState == null || previousState == null
+ || !previousState.getMouseState().hasButtonState(ButtonState.DOWN)) {
+ return false;
+ }
+
+ return currentState.getMouseState().getButtonsReleasedSince(previousState.getMouseState()).contains(_button);
+ }
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/input/logical/MouseMovedCondition.java b/ardor3d-core/src/main/java/com/ardor3d/input/logical/MouseMovedCondition.java
index e8643a0..cf3b47d 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/input/logical/MouseMovedCondition.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/input/logical/MouseMovedCondition.java
@@ -1,36 +1,36 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.input.logical;
-
-import com.ardor3d.annotation.Immutable;
-import com.ardor3d.input.InputState;
-import com.google.common.base.Predicate;
-
-/**
- * A condition that is true if the mouse has moved between the two input states.
- */
-@Immutable
-public final class MouseMovedCondition implements Predicate<TwoInputStates> {
- public boolean apply(final TwoInputStates states) {
- final InputState currentState = states.getCurrent();
- final InputState previousState = states.getPrevious();
-
- if (currentState == null) {
- return false;
- }
-
- if (currentState.equals(previousState)) {
- return false;
- }
-
- return currentState.getMouseState().getDx() != 0 || currentState.getMouseState().getDy() != 0;
- }
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.input.logical;
+
+import com.ardor3d.annotation.Immutable;
+import com.ardor3d.input.InputState;
+import com.google.common.base.Predicate;
+
+/**
+ * A condition that is true if the mouse has moved between the two input states.
+ */
+@Immutable
+public final class MouseMovedCondition implements Predicate<TwoInputStates> {
+ public boolean apply(final TwoInputStates states) {
+ final InputState currentState = states.getCurrent();
+ final InputState previousState = states.getPrevious();
+
+ if (currentState == null) {
+ return false;
+ }
+
+ if (currentState.equals(previousState)) {
+ return false;
+ }
+
+ return currentState.getMouseState().getDx() != 0 || currentState.getMouseState().getDy() != 0;
+ }
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/input/logical/MouseWheelMovedCondition.java b/ardor3d-core/src/main/java/com/ardor3d/input/logical/MouseWheelMovedCondition.java
index f0377f9..59ccb97 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/input/logical/MouseWheelMovedCondition.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/input/logical/MouseWheelMovedCondition.java
@@ -1,36 +1,36 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.input.logical;
-
-import com.ardor3d.annotation.Immutable;
-import com.ardor3d.input.InputState;
-import com.google.common.base.Predicate;
-
-/**
- * A condition that is true if the mouse wheel has moved between the two input states.
- */
-@Immutable
-public final class MouseWheelMovedCondition implements Predicate<TwoInputStates> {
- public boolean apply(final TwoInputStates states) {
- final InputState currentState = states.getCurrent();
- final InputState previousState = states.getPrevious();
-
- if (currentState == null) {
- return false;
- }
-
- if (currentState.equals(previousState)) {
- return false;
- }
-
- return currentState.getMouseState().getDwheel() != 0;
- }
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.input.logical;
+
+import com.ardor3d.annotation.Immutable;
+import com.ardor3d.input.InputState;
+import com.google.common.base.Predicate;
+
+/**
+ * A condition that is true if the mouse wheel has moved between the two input states.
+ */
+@Immutable
+public final class MouseWheelMovedCondition implements Predicate<TwoInputStates> {
+ public boolean apply(final TwoInputStates states) {
+ final InputState currentState = states.getCurrent();
+ final InputState previousState = states.getPrevious();
+
+ if (currentState == null) {
+ return false;
+ }
+
+ if (currentState.equals(previousState)) {
+ return false;
+ }
+
+ return currentState.getMouseState().getDwheel() != 0;
+ }
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/input/logical/TriggerAction.java b/ardor3d-core/src/main/java/com/ardor3d/input/logical/TriggerAction.java
index 48b5ac1..216c28e 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/input/logical/TriggerAction.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/input/logical/TriggerAction.java
@@ -1,33 +1,33 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.input.logical;
-
-import com.ardor3d.annotation.MainThread;
-import com.ardor3d.framework.Canvas;
-
-/**
- * Defines an action to be performed when a given input condition is true.
- */
-public interface TriggerAction {
- /**
- * Implementing classes should implementing this method to take whatever action is desired. This method will always
- * be called on the main GL thread.
- *
- * @param source
- * the Canvas that was the source of the current input
- * @param inputState
- * the current and previous states of the input system when the action was triggered
- * @param tpf
- * the time per frame in seconds
- */
- @MainThread
- public void perform(Canvas source, TwoInputStates inputStates, double tpf);
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.input.logical;
+
+import com.ardor3d.annotation.MainThread;
+import com.ardor3d.framework.Canvas;
+
+/**
+ * Defines an action to be performed when a given input condition is true.
+ */
+public interface TriggerAction {
+ /**
+ * Implementing classes should implementing this method to take whatever action is desired. This method will always
+ * be called on the main GL thread.
+ *
+ * @param source
+ * the Canvas that was the source of the current input
+ * @param inputState
+ * the current and previous states of the input system when the action was triggered
+ * @param tpf
+ * the time per frame in seconds
+ */
+ @MainThread
+ public void perform(Canvas source, TwoInputStates inputStates, double tpf);
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/input/logical/TriggerConditions.java b/ardor3d-core/src/main/java/com/ardor3d/input/logical/TriggerConditions.java
index 1f686a5..a36e8a5 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/input/logical/TriggerConditions.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/input/logical/TriggerConditions.java
@@ -1,121 +1,121 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.input.logical;
-
-import java.util.EnumMap;
-
-import com.ardor3d.input.ButtonState;
-import com.ardor3d.input.MouseButton;
-import com.ardor3d.util.Timer;
-import com.google.common.base.Predicate;
-
-/**
- * Utility methods for getting standard TriggerConditions. To reduce object creation, it may be a good idea to use
- * utility methods here to get immutable conditions that meet common criteria.
- */
-public final class TriggerConditions {
- private static final MouseMovedCondition MOUSE_MOVED_CONDITION = new MouseMovedCondition();
- private static final MouseButtonCondition LEFT_DOWN_CONDITION = makeCondition(MouseButton.LEFT, ButtonState.DOWN);
- private static final MouseButtonCondition RIGHT_DOWN_CONDITION = makeCondition(MouseButton.RIGHT, ButtonState.DOWN);
- private static final MouseButtonCondition MIDDLE_DOWN_CONDITION = makeCondition(MouseButton.MIDDLE,
- ButtonState.DOWN);
-
- private static final Predicate<TwoInputStates> ALWAYS_TRUE = new Predicate<TwoInputStates>() {
- @Override
- public boolean apply(final TwoInputStates arg0) {
- return true;
- }
- };
-
- private static final Predicate<TwoInputStates> ALWAYS_FALSE = new Predicate<TwoInputStates>() {
- @Override
- public boolean apply(final TwoInputStates arg0) {
- return true;
- }
- };
-
- private static MouseButtonCondition makeCondition(final MouseButton button, final ButtonState state) {
- final EnumMap<MouseButton, ButtonState> map = new EnumMap<MouseButton, ButtonState>(MouseButton.class);
- for (final MouseButton b : MouseButton.values()) {
- map.put(b, button != b ? ButtonState.UNDEFINED : state);
- }
- return new MouseButtonCondition(map);
- }
-
- // prevent instantiation
- private TriggerConditions() {
-
- }
-
- /**
- * @return a condition that evaluates to true if the mouse has moved
- */
- public static MouseMovedCondition mouseMoved() {
- return MOUSE_MOVED_CONDITION;
- }
-
- /**
- *
- * @return a condition that is true if the left button is down
- */
- public static MouseButtonCondition leftButtonDown() {
- return LEFT_DOWN_CONDITION;
- }
-
- /**
- *
- * @return a condition that is true if the right button is down
- */
- public static MouseButtonCondition rightButtonDown() {
- return RIGHT_DOWN_CONDITION;
- }
-
- /**
- *
- * @return a condition that is true if the middle button is down
- */
- public static MouseButtonCondition middleButtonDown() {
- return MIDDLE_DOWN_CONDITION;
- }
-
- /**
- * @return a condition that is always true.
- */
- public static Predicate<TwoInputStates> alwaysTrue() {
- return ALWAYS_TRUE;
- }
-
- /**
- * @return a condition that is always false.
- */
- public static Predicate<TwoInputStates> alwaysFalse() {
- return ALWAYS_FALSE;
- }
-
- /**
- * @return a condition that is always false.
- */
- public static Predicate<TwoInputStates> passedThrottle(final double throttleTime, final Timer timer) {
- return new Predicate<TwoInputStates>() {
- private double lastPass = 0;
-
- @Override
- public boolean apply(final TwoInputStates arg0) {
- final double now = timer.getTimeInSeconds();
- if (now - lastPass >= throttleTime) {
- lastPass = now;
- return true;
- }
- return false;
- }
- };
- }
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.input.logical;
+
+import java.util.EnumMap;
+
+import com.ardor3d.input.ButtonState;
+import com.ardor3d.input.MouseButton;
+import com.ardor3d.util.Timer;
+import com.google.common.base.Predicate;
+
+/**
+ * Utility methods for getting standard TriggerConditions. To reduce object creation, it may be a good idea to use
+ * utility methods here to get immutable conditions that meet common criteria.
+ */
+public final class TriggerConditions {
+ private static final MouseMovedCondition MOUSE_MOVED_CONDITION = new MouseMovedCondition();
+ private static final MouseButtonCondition LEFT_DOWN_CONDITION = makeCondition(MouseButton.LEFT, ButtonState.DOWN);
+ private static final MouseButtonCondition RIGHT_DOWN_CONDITION = makeCondition(MouseButton.RIGHT, ButtonState.DOWN);
+ private static final MouseButtonCondition MIDDLE_DOWN_CONDITION = makeCondition(MouseButton.MIDDLE,
+ ButtonState.DOWN);
+
+ private static final Predicate<TwoInputStates> ALWAYS_TRUE = new Predicate<TwoInputStates>() {
+ @Override
+ public boolean apply(final TwoInputStates arg0) {
+ return true;
+ }
+ };
+
+ private static final Predicate<TwoInputStates> ALWAYS_FALSE = new Predicate<TwoInputStates>() {
+ @Override
+ public boolean apply(final TwoInputStates arg0) {
+ return true;
+ }
+ };
+
+ private static MouseButtonCondition makeCondition(final MouseButton button, final ButtonState state) {
+ final EnumMap<MouseButton, ButtonState> map = new EnumMap<MouseButton, ButtonState>(MouseButton.class);
+ for (final MouseButton b : MouseButton.values()) {
+ map.put(b, button != b ? ButtonState.UNDEFINED : state);
+ }
+ return new MouseButtonCondition(map);
+ }
+
+ // prevent instantiation
+ private TriggerConditions() {
+
+ }
+
+ /**
+ * @return a condition that evaluates to true if the mouse has moved
+ */
+ public static MouseMovedCondition mouseMoved() {
+ return MOUSE_MOVED_CONDITION;
+ }
+
+ /**
+ *
+ * @return a condition that is true if the left button is down
+ */
+ public static MouseButtonCondition leftButtonDown() {
+ return LEFT_DOWN_CONDITION;
+ }
+
+ /**
+ *
+ * @return a condition that is true if the right button is down
+ */
+ public static MouseButtonCondition rightButtonDown() {
+ return RIGHT_DOWN_CONDITION;
+ }
+
+ /**
+ *
+ * @return a condition that is true if the middle button is down
+ */
+ public static MouseButtonCondition middleButtonDown() {
+ return MIDDLE_DOWN_CONDITION;
+ }
+
+ /**
+ * @return a condition that is always true.
+ */
+ public static Predicate<TwoInputStates> alwaysTrue() {
+ return ALWAYS_TRUE;
+ }
+
+ /**
+ * @return a condition that is always false.
+ */
+ public static Predicate<TwoInputStates> alwaysFalse() {
+ return ALWAYS_FALSE;
+ }
+
+ /**
+ * @return a condition that is always false.
+ */
+ public static Predicate<TwoInputStates> passedThrottle(final double throttleTime, final Timer timer) {
+ return new Predicate<TwoInputStates>() {
+ private double lastPass = 0;
+
+ @Override
+ public boolean apply(final TwoInputStates arg0) {
+ final double now = timer.getTimeInSeconds();
+ if (now - lastPass >= throttleTime) {
+ lastPass = now;
+ return true;
+ }
+ return false;
+ }
+ };
+ }
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/renderer/ContextCapabilities.java b/ardor3d-core/src/main/java/com/ardor3d/renderer/ContextCapabilities.java
index f2ac794..3e8d55c 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/renderer/ContextCapabilities.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/renderer/ContextCapabilities.java
@@ -43,6 +43,8 @@ public class ContextCapabilities {
protected boolean _pbufferSupported = false;
protected boolean _fboSupported = false;
+ protected boolean _supportsFBOMultisample = false;
+ protected boolean _supportsFBOBlit = false;
protected int _maxFBOColorAttachments = 1;
protected int _maxFBOSamples = 0;
@@ -227,6 +229,20 @@ public class ContextCapabilities {
}
/**
+ * @return true if we support fbo multisampling (antialiasing)
+ */
+ public boolean isFBOMultisampleSupported() {
+ return _supportsFBOMultisample;
+ }
+
+ /**
+ * @return true if we support fbo blitting
+ */
+ public boolean isFBOBlitSupported() {
+ return _supportsFBOBlit;
+ }
+
+ /**
* @return true if we support setting a constant color for use with *Constant* type BlendFunctions.
*/
public boolean isConstantBlendColorSupported() {
diff --git a/ardor3d-core/src/main/java/com/ardor3d/renderer/ContextManager.java b/ardor3d-core/src/main/java/com/ardor3d/renderer/ContextManager.java
index 8f973d9..a72ffd5 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/renderer/ContextManager.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/renderer/ContextManager.java
@@ -1,81 +1,81 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.renderer;
-
-import java.util.List;
-import java.util.Map;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.MapMaker;
-
-public class ContextManager {
-
- protected static RenderContext currentContext = null;
-
- private static List<ContextCleanListener> _cleanListeners = Lists.newArrayList();
-
- protected static final Map<Object, RenderContext> contextStore = new MapMaker().weakKeys().makeMap();
-
- /**
- * @return a RenderContext object representing the current OpenGL context.
- */
- public static RenderContext getCurrentContext() {
- return currentContext;
- }
-
- public static RenderContext switchContext(final Object contextKey) {
- currentContext = contextStore.get(contextKey);
- if (currentContext == null) {
- throw new IllegalArgumentException("contextKey not found in context store.");
- }
- return currentContext;
- }
-
- public static void removeContext(final Object contextKey) {
- contextStore.remove(contextKey);
- }
-
- public static void addContext(final Object contextKey, final RenderContext context) {
- contextStore.put(contextKey, context);
- }
-
- public static RenderContext getContextForKey(final Object key) {
- return contextStore.get(key);
- }
-
- /**
- * Find the first context we manage that uses the given shared opengl context.
- *
- * @param glref
- * @return
- */
- public static RenderContext getContextForRef(final Object glref) {
- if (glref == null) {
- return null;
- }
- for (final RenderContext context : contextStore.values()) {
- if (glref.equals(context.getGlContextRep())) {
- return context;
- }
- }
- return null;
- }
-
- public static void fireCleanContextEvent(final RenderContext renderContext) {
- for (final ContextCleanListener listener : _cleanListeners) {
- listener.cleanForContext(renderContext);
- }
- }
-
- public static void addContextCleanListener(final ContextCleanListener listener) {
- _cleanListeners.add(listener);
- }
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.renderer;
+
+import java.util.List;
+import java.util.Map;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.MapMaker;
+
+public class ContextManager {
+
+ protected static RenderContext currentContext = null;
+
+ private static List<ContextCleanListener> _cleanListeners = Lists.newArrayList();
+
+ protected static final Map<Object, RenderContext> contextStore = new MapMaker().weakKeys().makeMap();
+
+ /**
+ * @return a RenderContext object representing the current OpenGL context.
+ */
+ public static RenderContext getCurrentContext() {
+ return currentContext;
+ }
+
+ public static RenderContext switchContext(final Object contextKey) {
+ currentContext = contextStore.get(contextKey);
+ if (currentContext == null) {
+ throw new IllegalArgumentException("contextKey not found in context store.");
+ }
+ return currentContext;
+ }
+
+ public static void removeContext(final Object contextKey) {
+ contextStore.remove(contextKey);
+ }
+
+ public static void addContext(final Object contextKey, final RenderContext context) {
+ contextStore.put(contextKey, context);
+ }
+
+ public static RenderContext getContextForKey(final Object key) {
+ return contextStore.get(key);
+ }
+
+ /**
+ * Find the first context we manage that uses the given shared opengl context.
+ *
+ * @param glref
+ * @return
+ */
+ public static RenderContext getContextForRef(final Object glref) {
+ if (glref == null) {
+ return null;
+ }
+ for (final RenderContext context : contextStore.values()) {
+ if (glref.equals(context.getGlContextRep())) {
+ return context;
+ }
+ }
+ return null;
+ }
+
+ public static void fireCleanContextEvent(final RenderContext renderContext) {
+ for (final ContextCleanListener listener : _cleanListeners) {
+ listener.cleanForContext(renderContext);
+ }
+ }
+
+ public static void addContextCleanListener(final ContextCleanListener listener) {
+ _cleanListeners.add(listener);
+ }
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/renderer/IndexMode.java b/ardor3d-core/src/main/java/com/ardor3d/renderer/IndexMode.java
index b952d4a..305e914 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/renderer/IndexMode.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/renderer/IndexMode.java
@@ -1,122 +1,122 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.renderer;
-
-public enum IndexMode {
- // TRIMESH
- /**
- * Every three vertices referenced by the indexbuffer will be considered a stand-alone triangle.
- */
- Triangles(true),
- /**
- * The first three vertices referenced by the indexbuffer create a triangle, from there, every additional vertex is
- * paired with the two preceding vertices to make a new triangle.
- */
- TriangleStrip(true),
- /**
- * The first three vertices (V0, V1, V2) referenced by the indexbuffer create a triangle, from there, every
- * additional vertex is paired with the preceding vertex and the initial vertex (V0) to make a new triangle.
- */
- TriangleFan(true),
-
- // QUADMESH
- /**
- * Every four vertices referenced by the indexbuffer will be considered a stand-alone quad.
- */
- Quads(true),
- /**
- * The first four vertices referenced by the indexbuffer create a triangle, from there, every two additional
- * vertices are paired with the two preceding vertices to make a new quad.
- */
- QuadStrip(true),
-
- // LINE
- /**
- * Every two vertices referenced by the indexbuffer will be considered a stand-alone line segment.
- */
- Lines(false),
- /**
- * The first two vertices referenced by the indexbuffer create a line, from there, every additional vertex is paired
- * with the preceding vertex to make a new, connected line.
- */
- LineStrip(false),
- /**
- * Identical to <i>LineStrip</i> except the final indexed vertex is then connected back to the initial vertex to
- * form a loop.
- */
- LineLoop(false),
-
- // POINT
- /**
- * Identical to <i>Connected</i> except the final indexed vertex is then connected back to the initial vertex to
- * form a loop.
- */
- Points(false);
-
- private final boolean _hasPolygons;
-
- private IndexMode(final boolean hasPolygons) {
- _hasPolygons = hasPolygons;
- }
-
- public boolean hasPolygons() {
- return _hasPolygons;
- }
-
- public int getVertexCount() {
- switch (this) {
- case Triangles:
- case TriangleStrip:
- case TriangleFan:
- return 3;
- case Quads:
- case QuadStrip:
- return 4;
- case Lines:
- case LineStrip:
- case LineLoop:
- return 2;
- case Points:
- return 1;
- }
- throw new IllegalArgumentException("Unhandled type: " + this);
- }
-
- /**
- * @param indexMode
- * @param size
- * @return the number of primitives you would have if you connected an array of points of the given size using the
- * given index mode.
- */
- public static int getPrimitiveCount(final IndexMode indexMode, final int size) {
- switch (indexMode) {
- case Triangles:
- return size / 3;
- case TriangleFan:
- case TriangleStrip:
- return size - 2;
- case Quads:
- return size / 4;
- case QuadStrip:
- return size / 2 - 1;
- case Lines:
- return size / 2;
- case LineStrip:
- return size - 1;
- case LineLoop:
- return size;
- case Points:
- return size;
- }
-
- throw new IllegalArgumentException("unimplemented index mode: " + indexMode);
- }
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.renderer;
+
+public enum IndexMode {
+ // TRIMESH
+ /**
+ * Every three vertices referenced by the indexbuffer will be considered a stand-alone triangle.
+ */
+ Triangles(true),
+ /**
+ * The first three vertices referenced by the indexbuffer create a triangle, from there, every additional vertex is
+ * paired with the two preceding vertices to make a new triangle.
+ */
+ TriangleStrip(true),
+ /**
+ * The first three vertices (V0, V1, V2) referenced by the indexbuffer create a triangle, from there, every
+ * additional vertex is paired with the preceding vertex and the initial vertex (V0) to make a new triangle.
+ */
+ TriangleFan(true),
+
+ // QUADMESH
+ /**
+ * Every four vertices referenced by the indexbuffer will be considered a stand-alone quad.
+ */
+ Quads(true),
+ /**
+ * The first four vertices referenced by the indexbuffer create a triangle, from there, every two additional
+ * vertices are paired with the two preceding vertices to make a new quad.
+ */
+ QuadStrip(true),
+
+ // LINE
+ /**
+ * Every two vertices referenced by the indexbuffer will be considered a stand-alone line segment.
+ */
+ Lines(false),
+ /**
+ * The first two vertices referenced by the indexbuffer create a line, from there, every additional vertex is paired
+ * with the preceding vertex to make a new, connected line.
+ */
+ LineStrip(false),
+ /**
+ * Identical to <i>LineStrip</i> except the final indexed vertex is then connected back to the initial vertex to
+ * form a loop.
+ */
+ LineLoop(false),
+
+ // POINT
+ /**
+ * Identical to <i>Connected</i> except the final indexed vertex is then connected back to the initial vertex to
+ * form a loop.
+ */
+ Points(false);
+
+ private final boolean _hasPolygons;
+
+ private IndexMode(final boolean hasPolygons) {
+ _hasPolygons = hasPolygons;
+ }
+
+ public boolean hasPolygons() {
+ return _hasPolygons;
+ }
+
+ public int getVertexCount() {
+ switch (this) {
+ case Triangles:
+ case TriangleStrip:
+ case TriangleFan:
+ return 3;
+ case Quads:
+ case QuadStrip:
+ return 4;
+ case Lines:
+ case LineStrip:
+ case LineLoop:
+ return 2;
+ case Points:
+ return 1;
+ }
+ throw new IllegalArgumentException("Unhandled type: " + this);
+ }
+
+ /**
+ * @param indexMode
+ * @param size
+ * @return the number of primitives you would have if you connected an array of points of the given size using the
+ * given index mode.
+ */
+ public static int getPrimitiveCount(final IndexMode indexMode, final int size) {
+ switch (indexMode) {
+ case Triangles:
+ return size / 3;
+ case TriangleFan:
+ case TriangleStrip:
+ return size - 2;
+ case Quads:
+ return size / 4;
+ case QuadStrip:
+ return size / 2 - 1;
+ case Lines:
+ return size / 2;
+ case LineStrip:
+ return size - 1;
+ case LineLoop:
+ return size;
+ case Points:
+ return size;
+ }
+
+ throw new IllegalArgumentException("unimplemented index mode: " + indexMode);
+ }
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/renderer/TextureRendererFactory.java b/ardor3d-core/src/main/java/com/ardor3d/renderer/TextureRendererFactory.java
index f6f8a8c..31bace1 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/renderer/TextureRendererFactory.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/renderer/TextureRendererFactory.java
@@ -1,103 +1,103 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.renderer;
-
-import com.ardor3d.framework.DisplaySettings;
-
-public enum TextureRendererFactory {
-
- INSTANCE;
-
- private TextureRendererProvider _provider = null;
-
- public void setProvider(final TextureRendererProvider provider) {
- _provider = provider;
- }
-
- /**
- * Create a TextureRenderer of the given width and height. All other params are considered undefined. We will
- * attempt to make an FBO based renderer if supported, or a Pbuffer based renderer if supported, or null if neither
- * are supported.
- *
- * @param width
- * the width of our off screen rendering target
- * @param height
- * the height of our off screen rendering target
- * @param renderer
- * the renderer to use when rendering to this off screen target.
- * @param caps
- * the context capabilities, used for testing.
- * @return a TextureRenderer
- * @throws IllegalStateException
- * if provider has not been set prior to calling this method.
- */
- public TextureRenderer createTextureRenderer(final int width, final int height, final Renderer renderer,
- final ContextCapabilities caps) {
- if (_provider == null) {
- throw new IllegalStateException("No provider has been set on TextureRendererFactory.");
- }
- return _provider.createTextureRenderer(width, height, renderer, caps);
- }
-
- /**
- * Create a TextureRenderer using params that are meaningful regardless of whether a Pbuffer or FBO renderer are
- * used. We will attempt to make an FBO based renderer if supported, or a Pbuffer based renderer if supported, or
- * null if neither are supported.
- *
- * @param width
- * the width of our off screen rendering target
- * @param height
- * the height of our off screen rendering target
- * @param depthBits
- * the desired depth buffer size of our off screen rendering target
- * @param samples
- * the number of samples for our off screen rendering target
- * @param renderer
- * the renderer to use when rendering to this off screen target.
- * @param caps
- * the context capabilities, used for testing.
- * @return a TextureRenderer
- * @throws IllegalStateException
- * if provider has not been set prior to calling this method.
- */
- public TextureRenderer createTextureRenderer(final int width, final int height, final int depthBits,
- final int samples, final Renderer renderer, final ContextCapabilities caps) {
- if (_provider == null) {
- throw new IllegalStateException("No provider has been set on TextureRendererFactory.");
- }
- return _provider.createTextureRenderer(width, height, depthBits, samples, renderer, caps);
- }
-
- /**
- * Create a TextureRenderer using as many of the given DisplaySettings that are meaningful for the chosen type.
- * Unless forcePbuffer is true, we will attempt to make an FBO based renderer if supported, or a Pbuffer based
- * renderer if supported, or null if neither are supported.
- *
- * @param settings
- * a complete set of possible display settings to use. Some will only be valid if Pbuffer is used.
- * @param forcePbuffer
- * if true, we will return a pbuffer or null if pbuffers are not supported.
- * @param renderer
- * the renderer to use when rendering to this off screen target.
- * @param caps
- * the context capabilities, used for testing.
- * @return a TextureRenderer
- * @throws IllegalStateException
- * if provider has not been set prior to calling this method.
- */
- public TextureRenderer createTextureRenderer(final DisplaySettings settings, final boolean forcePbuffer,
- final Renderer renderer, final ContextCapabilities caps) {
- if (_provider == null) {
- throw new IllegalStateException("No provider has been set on TextureRendererFactory.");
- }
- return _provider.createTextureRenderer(settings, forcePbuffer, renderer, caps);
- }
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.renderer;
+
+import com.ardor3d.framework.DisplaySettings;
+
+public enum TextureRendererFactory {
+
+ INSTANCE;
+
+ private TextureRendererProvider _provider = null;
+
+ public void setProvider(final TextureRendererProvider provider) {
+ _provider = provider;
+ }
+
+ /**
+ * Create a TextureRenderer of the given width and height. All other params are considered undefined. We will
+ * attempt to make an FBO based renderer if supported, or a Pbuffer based renderer if supported, or null if neither
+ * are supported.
+ *
+ * @param width
+ * the width of our off screen rendering target
+ * @param height
+ * the height of our off screen rendering target
+ * @param renderer
+ * the renderer to use when rendering to this off screen target.
+ * @param caps
+ * the context capabilities, used for testing.
+ * @return a TextureRenderer
+ * @throws IllegalStateException
+ * if provider has not been set prior to calling this method.
+ */
+ public TextureRenderer createTextureRenderer(final int width, final int height, final Renderer renderer,
+ final ContextCapabilities caps) {
+ if (_provider == null) {
+ throw new IllegalStateException("No provider has been set on TextureRendererFactory.");
+ }
+ return _provider.createTextureRenderer(width, height, renderer, caps);
+ }
+
+ /**
+ * Create a TextureRenderer using params that are meaningful regardless of whether a Pbuffer or FBO renderer are
+ * used. We will attempt to make an FBO based renderer if supported, or a Pbuffer based renderer if supported, or
+ * null if neither are supported.
+ *
+ * @param width
+ * the width of our off screen rendering target
+ * @param height
+ * the height of our off screen rendering target
+ * @param depthBits
+ * the desired depth buffer size of our off screen rendering target
+ * @param samples
+ * the number of samples for our off screen rendering target
+ * @param renderer
+ * the renderer to use when rendering to this off screen target.
+ * @param caps
+ * the context capabilities, used for testing.
+ * @return a TextureRenderer
+ * @throws IllegalStateException
+ * if provider has not been set prior to calling this method.
+ */
+ public TextureRenderer createTextureRenderer(final int width, final int height, final int depthBits,
+ final int samples, final Renderer renderer, final ContextCapabilities caps) {
+ if (_provider == null) {
+ throw new IllegalStateException("No provider has been set on TextureRendererFactory.");
+ }
+ return _provider.createTextureRenderer(width, height, depthBits, samples, renderer, caps);
+ }
+
+ /**
+ * Create a TextureRenderer using as many of the given DisplaySettings that are meaningful for the chosen type.
+ * Unless forcePbuffer is true, we will attempt to make an FBO based renderer if supported, or a Pbuffer based
+ * renderer if supported, or null if neither are supported.
+ *
+ * @param settings
+ * a complete set of possible display settings to use. Some will only be valid if Pbuffer is used.
+ * @param forcePbuffer
+ * if true, we will return a pbuffer or null if pbuffers are not supported.
+ * @param renderer
+ * the renderer to use when rendering to this off screen target.
+ * @param caps
+ * the context capabilities, used for testing.
+ * @return a TextureRenderer
+ * @throws IllegalStateException
+ * if provider has not been set prior to calling this method.
+ */
+ public TextureRenderer createTextureRenderer(final DisplaySettings settings, final boolean forcePbuffer,
+ final Renderer renderer, final ContextCapabilities caps) {
+ if (_provider == null) {
+ throw new IllegalStateException("No provider has been set on TextureRendererFactory.");
+ }
+ return _provider.createTextureRenderer(settings, forcePbuffer, renderer, caps);
+ }
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/renderer/TextureRendererProvider.java b/ardor3d-core/src/main/java/com/ardor3d/renderer/TextureRendererProvider.java
index 6416824..b775643 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/renderer/TextureRendererProvider.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/renderer/TextureRendererProvider.java
@@ -1,34 +1,34 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.renderer;
-
-import com.ardor3d.framework.DisplaySettings;
-
-public interface TextureRendererProvider {
-
- /**
- * @see TextureRendererFactory#createTextureRenderer(int, int, Renderer, ContextCapabilities)
- */
- TextureRenderer createTextureRenderer(int width, int height, Renderer renderer, ContextCapabilities caps);
-
- /**
- * @see TextureRendererFactory#createTextureRenderer(int, int, int, int, Renderer, ContextCapabilities)
- */
- TextureRenderer createTextureRenderer(int width, int height, int depthBits, int samples, Renderer renderer,
- ContextCapabilities caps);
-
- /**
- * @see TextureRendererFactory#createTextureRenderer(DisplaySettings, boolean, Renderer, ContextCapabilities)
- */
- TextureRenderer createTextureRenderer(DisplaySettings settings, boolean forcePbuffer, Renderer renderer,
- ContextCapabilities caps);
-
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.renderer;
+
+import com.ardor3d.framework.DisplaySettings;
+
+public interface TextureRendererProvider {
+
+ /**
+ * @see TextureRendererFactory#createTextureRenderer(int, int, Renderer, ContextCapabilities)
+ */
+ TextureRenderer createTextureRenderer(int width, int height, Renderer renderer, ContextCapabilities caps);
+
+ /**
+ * @see TextureRendererFactory#createTextureRenderer(int, int, int, int, Renderer, ContextCapabilities)
+ */
+ TextureRenderer createTextureRenderer(int width, int height, int depthBits, int samples, Renderer renderer,
+ ContextCapabilities caps);
+
+ /**
+ * @see TextureRendererFactory#createTextureRenderer(DisplaySettings, boolean, Renderer, ContextCapabilities)
+ */
+ TextureRenderer createTextureRenderer(DisplaySettings settings, boolean forcePbuffer, Renderer renderer,
+ ContextCapabilities caps);
+
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/renderer/effect/EffectManager.java b/ardor3d-core/src/main/java/com/ardor3d/renderer/effect/EffectManager.java
index 8299c14..c5780bd 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/renderer/effect/EffectManager.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/renderer/effect/EffectManager.java
@@ -18,11 +18,11 @@ import com.ardor3d.framework.DisplaySettings;
import com.ardor3d.image.TextureStoreFormat;
import com.ardor3d.math.Vector3;
import com.ardor3d.renderer.Camera;
-import com.ardor3d.renderer.Renderer;
import com.ardor3d.renderer.Camera.ProjectionMode;
+import com.ardor3d.renderer.Renderer;
import com.ardor3d.renderer.state.RenderState;
-import com.ardor3d.renderer.state.ZBufferState;
import com.ardor3d.renderer.state.RenderState.StateType;
+import com.ardor3d.renderer.state.ZBufferState;
import com.ardor3d.scenegraph.Mesh;
import com.ardor3d.scenegraph.hint.CullHint;
import com.ardor3d.scenegraph.hint.LightCombineMode;
@@ -139,7 +139,7 @@ public class EffectManager {
_fsq = new Mesh("fsq");
_fsq.getMeshData().setVertexBuffer(BufferUtils.createFloatBuffer(-1, -1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1));
_fsq.getMeshData().setTextureBuffer(BufferUtils.createFloatBuffer(0, 0, 1, 0, 1, 1, 0, 1), 0);
- _fsq.getMeshData().setIndexBuffer(BufferUtils.createIntBuffer(0, 1, 3, 1, 2, 3));
+ _fsq.getMeshData().setIndices(BufferUtils.createIndexBufferData(new int[] { 0, 1, 3, 1, 2, 3 }, 3));
_fsq.getSceneHints().setCullHint(CullHint.Never);
_fsq.getSceneHints().setLightCombineMode(LightCombineMode.Off);
diff --git a/ardor3d-core/src/main/java/com/ardor3d/renderer/queue/OpaqueRenderBucket.java b/ardor3d-core/src/main/java/com/ardor3d/renderer/queue/OpaqueRenderBucket.java
index 6ced7e2..f74e9a3 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/renderer/queue/OpaqueRenderBucket.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/renderer/queue/OpaqueRenderBucket.java
@@ -1,96 +1,96 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.renderer.queue;
-
-import java.util.Comparator;
-
-import com.ardor3d.renderer.state.RenderState;
-import com.ardor3d.renderer.state.TextureState;
-import com.ardor3d.scenegraph.Mesh;
-import com.ardor3d.scenegraph.Spatial;
-import com.ardor3d.util.TextureKey;
-
-public class OpaqueRenderBucket extends AbstractRenderBucket {
-
- public OpaqueRenderBucket() {
- super();
-
- _comparator = new OpaqueComparator();
- }
-
- private class OpaqueComparator implements Comparator<Spatial> {
- public int compare(final Spatial o1, final Spatial o2) {
- if (o1 instanceof Mesh && o2 instanceof Mesh) {
- return compareByStates((Mesh) o1, (Mesh) o2);
- }
-
- final double d1 = distanceToCam(o1);
- final double d2 = distanceToCam(o2);
- if (d1 > d2) {
- return 1;
- } else if (d1 < d2) {
- return -1;
- } else {
- return 0;
- }
- }
-
- /**
- * Compare opaque items by their texture states - generally the most expensive switch. Later this might expand
- * to comparisons by other states as well, such as lighting or material.
- */
- private int compareByStates(final Mesh mesh1, final Mesh mesh2) {
- final TextureState ts1 = (TextureState) mesh1.getWorldRenderState(RenderState.StateType.Texture);
- final TextureState ts2 = (TextureState) mesh2.getWorldRenderState(RenderState.StateType.Texture);
- if (ts1 == ts2) {
- return 0;
- } else if (ts1 == null && ts2 != null) {
- return -1;
- } else if (ts2 == null && ts1 != null) {
- return 1;
- }
-
- for (int x = 0, maxIndex = Math.min(ts1.getMaxTextureIndexUsed(), ts2.getMaxTextureIndexUsed()); x <= maxIndex; x++) {
-
- final TextureKey key1 = ts1.getTextureKey(x);
- final TextureKey key2 = ts2.getTextureKey(x);
-
- if (key1 == null) {
- if (key2 == null) {
- continue;
- } else {
- return -1;
- }
- } else if (key2 == null) {
- return 1;
- }
-
- final int tid1 = key1.hashCode();
- final int tid2 = key2.hashCode();
-
- if (tid1 == tid2) {
- continue;
- } else if (tid1 < tid2) {
- return -1;
- } else {
- return 1;
- }
- }
-
- if (ts1.getMaxTextureIndexUsed() != ts2.getMaxTextureIndexUsed()) {
- return ts2.getMaxTextureIndexUsed() - ts1.getMaxTextureIndexUsed();
- }
-
- return 0;
- }
- }
-
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.renderer.queue;
+
+import java.util.Comparator;
+
+import com.ardor3d.renderer.state.RenderState;
+import com.ardor3d.renderer.state.TextureState;
+import com.ardor3d.scenegraph.Mesh;
+import com.ardor3d.scenegraph.Spatial;
+import com.ardor3d.util.TextureKey;
+
+public class OpaqueRenderBucket extends AbstractRenderBucket {
+
+ public OpaqueRenderBucket() {
+ super();
+
+ _comparator = new OpaqueComparator();
+ }
+
+ private class OpaqueComparator implements Comparator<Spatial> {
+ public int compare(final Spatial o1, final Spatial o2) {
+ if (o1 instanceof Mesh && o2 instanceof Mesh) {
+ return compareByStates((Mesh) o1, (Mesh) o2);
+ }
+
+ final double d1 = distanceToCam(o1);
+ final double d2 = distanceToCam(o2);
+ if (d1 > d2) {
+ return 1;
+ } else if (d1 < d2) {
+ return -1;
+ } else {
+ return 0;
+ }
+ }
+
+ /**
+ * Compare opaque items by their texture states - generally the most expensive switch. Later this might expand
+ * to comparisons by other states as well, such as lighting or material.
+ */
+ private int compareByStates(final Mesh mesh1, final Mesh mesh2) {
+ final TextureState ts1 = (TextureState) mesh1.getWorldRenderState(RenderState.StateType.Texture);
+ final TextureState ts2 = (TextureState) mesh2.getWorldRenderState(RenderState.StateType.Texture);
+ if (ts1 == ts2) {
+ return 0;
+ } else if (ts1 == null && ts2 != null) {
+ return -1;
+ } else if (ts2 == null && ts1 != null) {
+ return 1;
+ }
+
+ for (int x = 0, maxIndex = Math.min(ts1.getMaxTextureIndexUsed(), ts2.getMaxTextureIndexUsed()); x <= maxIndex; x++) {
+
+ final TextureKey key1 = ts1.getTextureKey(x);
+ final TextureKey key2 = ts2.getTextureKey(x);
+
+ if (key1 == null) {
+ if (key2 == null) {
+ continue;
+ } else {
+ return -1;
+ }
+ } else if (key2 == null) {
+ return 1;
+ }
+
+ final int tid1 = key1.hashCode();
+ final int tid2 = key2.hashCode();
+
+ if (tid1 == tid2) {
+ continue;
+ } else if (tid1 < tid2) {
+ return -1;
+ } else {
+ return 1;
+ }
+ }
+
+ if (ts1.getMaxTextureIndexUsed() != ts2.getMaxTextureIndexUsed()) {
+ return ts2.getMaxTextureIndexUsed() - ts1.getMaxTextureIndexUsed();
+ }
+
+ return 0;
+ }
+ }
+
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/renderer/queue/OrthoRenderBucket.java b/ardor3d-core/src/main/java/com/ardor3d/renderer/queue/OrthoRenderBucket.java
index afc7d70..fa4f8c3 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/renderer/queue/OrthoRenderBucket.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/renderer/queue/OrthoRenderBucket.java
@@ -1,51 +1,51 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.renderer.queue;
-
-import java.util.Comparator;
-
-import com.ardor3d.renderer.Renderer;
-import com.ardor3d.scenegraph.Spatial;
-
-public class OrthoRenderBucket extends AbstractRenderBucket {
-
- public OrthoRenderBucket() {
- super();
-
- _comparator = new OrthoComparator();
- }
-
- @Override
- public void render(final Renderer renderer) {
- if (_currentListSize > 0) {
- try {
- renderer.setOrtho();
- for (int i = 0; i < _currentListSize; i++) {
- _currentList[i].draw(renderer);
- }
- } finally {
- renderer.unsetOrtho();
- }
- }
- }
-
- private static class OrthoComparator implements Comparator<Spatial> {
- public int compare(final Spatial o1, final Spatial o2) {
- if (o2.getSceneHints().getOrthoOrder() == o1.getSceneHints().getOrthoOrder()) {
- return 0;
- } else if (o2.getSceneHints().getOrthoOrder() < o1.getSceneHints().getOrthoOrder()) {
- return -1;
- } else {
- return 1;
- }
- }
- }
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.renderer.queue;
+
+import java.util.Comparator;
+
+import com.ardor3d.renderer.Renderer;
+import com.ardor3d.scenegraph.Spatial;
+
+public class OrthoRenderBucket extends AbstractRenderBucket {
+
+ public OrthoRenderBucket() {
+ super();
+
+ _comparator = new OrthoComparator();
+ }
+
+ @Override
+ public void render(final Renderer renderer) {
+ if (_currentListSize > 0) {
+ try {
+ renderer.setOrtho();
+ for (int i = 0; i < _currentListSize; i++) {
+ _currentList[i].draw(renderer);
+ }
+ } finally {
+ renderer.unsetOrtho();
+ }
+ }
+ }
+
+ private static class OrthoComparator implements Comparator<Spatial> {
+ public int compare(final Spatial o1, final Spatial o2) {
+ if (o2.getSceneHints().getOrthoOrder() == o1.getSceneHints().getOrthoOrder()) {
+ return 0;
+ } else if (o2.getSceneHints().getOrthoOrder() < o1.getSceneHints().getOrthoOrder()) {
+ return -1;
+ } else {
+ return 1;
+ }
+ }
+ }
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/renderer/queue/RenderBucket.java b/ardor3d-core/src/main/java/com/ardor3d/renderer/queue/RenderBucket.java
index abc888e..d3a4c53 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/renderer/queue/RenderBucket.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/renderer/queue/RenderBucket.java
@@ -1,31 +1,31 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.renderer.queue;
-
-import com.ardor3d.renderer.Renderer;
-import com.ardor3d.scenegraph.Spatial;
-
-public interface RenderBucket {
- void add(Spatial spatial);
-
- void remove(Spatial spatial);
-
- void clear();
-
- void sort();
-
- void render(Renderer renderer);
-
- void pushBucket();
-
- void popBucket();
-
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.renderer.queue;
+
+import com.ardor3d.renderer.Renderer;
+import com.ardor3d.scenegraph.Spatial;
+
+public interface RenderBucket {
+ void add(Spatial spatial);
+
+ void remove(Spatial spatial);
+
+ void clear();
+
+ void sort();
+
+ void render(Renderer renderer);
+
+ void pushBucket();
+
+ void popBucket();
+
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/ByteBufferData.java b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/ByteBufferData.java
index 89d516e..4091e06 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/ByteBufferData.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/ByteBufferData.java
@@ -106,6 +106,20 @@ public class ByteBufferData extends IndexBufferData<ByteBuffer> implements Savab
}
@Override
+ public void put(final int[] array) {
+ for (int i = 0; i < array.length; i++) {
+ put(array[i]);
+ }
+ }
+
+ @Override
+ public void put(final int[] array, final int offset, final int length) {
+ for (int i = offset, max = offset + length; i < max; i++) {
+ put(array[i]);
+ }
+ }
+
+ @Override
public int getByteCount() {
return 1;
}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/FloatBufferDataUtil.java b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/FloatBufferDataUtil.java
index 422dabe..b0afc37 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/FloatBufferDataUtil.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/FloatBufferDataUtil.java
@@ -1,66 +1,66 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.scenegraph;
-
-import com.ardor3d.math.type.ReadOnlyVector2;
-import com.ardor3d.math.type.ReadOnlyVector3;
-import com.ardor3d.util.geom.BufferUtils;
-
-public class FloatBufferDataUtil {
- public static FloatBufferData makeNew(final ReadOnlyVector2[] coords) {
- if (coords == null) {
- return null;
- }
-
- return new FloatBufferData(BufferUtils.createFloatBuffer(coords), 2);
- }
-
- public static FloatBufferData makeNew(final ReadOnlyVector3[] coords) {
- if (coords == null) {
- return null;
- }
-
- return new FloatBufferData(BufferUtils.createFloatBuffer(coords), 3);
- }
-
- public static FloatBufferData makeNew(final float[] coords) {
- if (coords == null) {
- return null;
- }
-
- return new FloatBufferData(BufferUtils.createFloatBuffer(coords), 1);
- }
-
- /**
- * Check an incoming TexCoords object for null and correct size.
- *
- * @param tc
- * @param vertexCount
- * @param perVert
- * @return tc if it is not null and the right size, otherwise it will be a new TexCoords object.
- */
- public static FloatBufferData ensureSize(final FloatBufferData tc, final int vertexCount, final int coordsPerVertex) {
- if (tc == null) {
- return new FloatBufferData(BufferUtils.createFloatBuffer(vertexCount * coordsPerVertex), coordsPerVertex);
- }
-
- if (tc.getBuffer().limit() == coordsPerVertex * vertexCount && tc.getValuesPerTuple() == coordsPerVertex) {
- tc.getBuffer().rewind();
- return tc;
- } else if (tc.getBuffer().limit() == coordsPerVertex * vertexCount) {
- tc.setValuesPerTuple(coordsPerVertex);
- } else {
- return new FloatBufferData(BufferUtils.createFloatBuffer(vertexCount * coordsPerVertex), coordsPerVertex);
- }
-
- return tc;
- }
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.scenegraph;
+
+import com.ardor3d.math.type.ReadOnlyVector2;
+import com.ardor3d.math.type.ReadOnlyVector3;
+import com.ardor3d.util.geom.BufferUtils;
+
+public class FloatBufferDataUtil {
+ public static FloatBufferData makeNew(final ReadOnlyVector2[] coords) {
+ if (coords == null) {
+ return null;
+ }
+
+ return new FloatBufferData(BufferUtils.createFloatBuffer(coords), 2);
+ }
+
+ public static FloatBufferData makeNew(final ReadOnlyVector3[] coords) {
+ if (coords == null) {
+ return null;
+ }
+
+ return new FloatBufferData(BufferUtils.createFloatBuffer(coords), 3);
+ }
+
+ public static FloatBufferData makeNew(final float[] coords) {
+ if (coords == null) {
+ return null;
+ }
+
+ return new FloatBufferData(BufferUtils.createFloatBuffer(coords), 1);
+ }
+
+ /**
+ * Check an incoming TexCoords object for null and correct size.
+ *
+ * @param tc
+ * @param vertexCount
+ * @param perVert
+ * @return tc if it is not null and the right size, otherwise it will be a new TexCoords object.
+ */
+ public static FloatBufferData ensureSize(final FloatBufferData tc, final int vertexCount, final int coordsPerVertex) {
+ if (tc == null) {
+ return new FloatBufferData(BufferUtils.createFloatBuffer(vertexCount * coordsPerVertex), coordsPerVertex);
+ }
+
+ if (tc.getBuffer().limit() == coordsPerVertex * vertexCount && tc.getValuesPerTuple() == coordsPerVertex) {
+ tc.getBuffer().rewind();
+ return tc;
+ } else if (tc.getBuffer().limit() == coordsPerVertex * vertexCount) {
+ tc.setValuesPerTuple(coordsPerVertex);
+ } else {
+ return new FloatBufferData(BufferUtils.createFloatBuffer(vertexCount * coordsPerVertex), coordsPerVertex);
+ }
+
+ return tc;
+ }
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/IndexBufferData.java b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/IndexBufferData.java
index 9c39fae..4ca77b5 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/IndexBufferData.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/IndexBufferData.java
@@ -66,6 +66,26 @@ public abstract class IndexBufferData<T extends Buffer> extends AbstractBufferDa
public abstract void put(IndexBufferData<?> buf);
/**
+ * Write the contents of the given int array into this IndexBufferData. Note that data conversion is handled using
+ * the get/put methods in IndexBufferData.
+ *
+ * @param array
+ * the source int array.
+ */
+ public abstract void put(int[] array);
+
+ /**
+ * Write the contents of the given int array into this IndexBufferData. Note that data conversion is handled using
+ * the get/put methods in IndexBufferData.
+ *
+ * @param array
+ * the source int array.
+ * @param offset
+ * @param length
+ */
+ public abstract void put(int[] array, int offset, int length);
+
+ /**
* Get the underlying nio buffer.
*/
@Override
@@ -121,6 +141,20 @@ public abstract class IndexBufferData<T extends Buffer> extends AbstractBufferDa
}
/**
+ * @see Buffer#flip();
+ */
+ public void flip() {
+ getBuffer().flip();
+ }
+
+ /**
+ * @see Buffer#clear();
+ */
+ public void clear() {
+ getBuffer().clear();
+ }
+
+ /**
* @see Buffer#reset();
*/
public void reset() {
diff --git a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/IntBufferData.java b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/IntBufferData.java
index 4e4cf04..219a729 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/IntBufferData.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/IntBufferData.java
@@ -105,6 +105,16 @@ public class IntBufferData extends IndexBufferData<IntBuffer> implements Savable
}
@Override
+ public void put(final int[] array) {
+ _buffer.put(array);
+ }
+
+ @Override
+ public void put(final int[] array, final int offset, final int length) {
+ _buffer.put(array, offset, length);
+ }
+
+ @Override
public int getByteCount() {
return 4;
}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/Mesh.java b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/Mesh.java
index d97c844..b81eb1c 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/Mesh.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/Mesh.java
@@ -336,7 +336,7 @@ public class Mesh extends Spatial implements Renderable, Pickable {
}
renderer.setupVertexData(meshData.getVertexCoords());
- if (meshData.getIndexBuffer() != null) {
+ if (meshData.getIndices() != null) {
renderer.drawElements(meshData.getIndices(), meshData.getIndexLengths(), meshData.getIndexModes(),
primcount);
} else {
@@ -390,7 +390,7 @@ public class Mesh extends Spatial implements Renderable, Pickable {
renderer.setupVertexDataVBO(meshData.getVertexCoords());
}
- if (meshData.getIndexBuffer() != null) {
+ if (meshData.getIndices() != null) {
// TODO: Maybe ask for the IndexBuffer's dynamic/static type and fall back to arrays for indices?
renderer.drawElementsVBO(meshData.getIndices(), meshData.getIndexLengths(), meshData.getIndexModes(),
primcount);
diff --git a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/MeshData.java b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/MeshData.java
index 88218ea..90a5a8b 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/MeshData.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/MeshData.java
@@ -354,6 +354,7 @@ public class MeshData implements Savable {
} else if (index < _textureCoords.size()) {
_textureCoords.set(index, null);
}
+ refreshInterleaved();
}
/**
@@ -793,7 +794,7 @@ public class MeshData implements Savable {
}
for (int i = 0; i < rSize; i++) {
- if (getIndexBuffer() != null) {
+ if (getIndices() != null) {
result[i] = getIndices().get(getVertexIndex(primitiveIndex, i, section));
} else {
result[i] = getVertexIndex(primitiveIndex, i, section);
@@ -832,7 +833,7 @@ public class MeshData implements Savable {
if (result[i] == null) {
result[i] = new Vector3();
}
- if (getIndexBuffer() != null) {
+ if (getIndices() != null) {
// indexed geometry
BufferUtils.populateFromBuffer(result[i], getVertexBuffer(),
getIndices().get(getVertexIndex(primitiveIndex, i, section)));
@@ -959,7 +960,7 @@ public class MeshData implements Savable {
// Now, based on IndexMode, pick a point on that primitive
final IndexMode mode = getIndexMode(section);
- final boolean hasIndices = getIndexBuffer() != null;
+ final boolean hasIndices = getIndices() != null;
switch (mode) {
case Triangles:
case TriangleFan:
diff --git a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/Renderable.java b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/Renderable.java
index cfc8d8b..369b7d2 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/Renderable.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/Renderable.java
@@ -1,25 +1,25 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.scenegraph;
-
-import com.ardor3d.renderer.Renderer;
-
-/**
- * Renderable is the interface for objects that can be rendered.
- */
-public interface Renderable {
- /**
- * Render the object using the supplied renderer instance.
- *
- * @param renderer
- */
- void render(Renderer renderer);
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.scenegraph;
+
+import com.ardor3d.renderer.Renderer;
+
+/**
+ * Renderable is the interface for objects that can be rendered.
+ */
+public interface Renderable {
+ /**
+ * Render the object using the supplied renderer instance.
+ *
+ * @param renderer
+ */
+ void render(Renderer renderer);
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/ShortBufferData.java b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/ShortBufferData.java
index 95016bf..5d8f8f8 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/ShortBufferData.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/ShortBufferData.java
@@ -106,6 +106,20 @@ public class ShortBufferData extends IndexBufferData<ShortBuffer> implements Sav
}
@Override
+ public void put(final int[] array) {
+ for (int i = 0; i < array.length; i++) {
+ put(array[i]);
+ }
+ }
+
+ @Override
+ public void put(final int[] array, final int offset, final int length) {
+ for (int i = offset, max = offset + length; i < max; i++) {
+ put(array[i]);
+ }
+ }
+
+ @Override
public int getByteCount() {
return 2;
}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/controller/interpolation/CurveLookAtController.java b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/controller/interpolation/CurveLookAtController.java
index 30b595b..ef322fc 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/controller/interpolation/CurveLookAtController.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/controller/interpolation/CurveLookAtController.java
@@ -1,139 +1,139 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-/**
- *
- */
-
-package com.ardor3d.scenegraph.controller.interpolation;
-
-import java.io.Serializable;
-
-import com.ardor3d.math.MathUtils;
-import com.ardor3d.math.Matrix3;
-import com.ardor3d.math.Vector3;
-import com.ardor3d.math.type.ReadOnlyVector3;
-import com.ardor3d.scenegraph.Spatial;
-import com.ardor3d.scenegraph.controller.SpatialController;
-
-/**
- * CurveLookAtController class rotates a spatial to 'look at' a curve.
- * <p>
- * This class assumes the given delegate curve interpolation controller is already added to a spatial and is getting
- * automatically updated as part of the main loop. Therefore this class doesn't call update on the delegate controller.
- * </p>
- */
-public class CurveLookAtController implements SpatialController<Spatial>, Serializable {
-
- /** Serial UID */
- private static final long serialVersionUID = 1L;
-
- /** The world up vector to use in matrix look at */
- private ReadOnlyVector3 _worldUp;
-
- /** The curve interpolation controller that does the work of finding the correct position to look at */
- private final CurveInterpolationController _curveController;
-
- /** The previous location of the spatial on the curve */
- private final Vector3 _previous;
-
- /** @see #setLocalRotation(boolean) */
- private boolean _localRotation = true;
-
- /**
- * Creates a new instance of <code>CurveLookAtController</code>, with {@link Vector3#UNIT_Y} as the world up vector.
- *
- * @param curveController
- * The curve interpolation controller that does the work of finding the correct position to look at, can
- * not be <code>null</code>.
- */
- public CurveLookAtController(final CurveInterpolationController curveController) {
- this(curveController, Vector3.UNIT_Y);
- }
-
- /**
- * Creates a new instance of <code>CurveLookAtController</code>.
- *
- * @param curveController
- * The curve interpolation controller that does the work of finding the correct position to look at, can
- * not be <code>null</code>.
- * @param worldUp
- * The world up vector, can not be <code>null</code>.
- */
- public CurveLookAtController(final CurveInterpolationController curveController, final ReadOnlyVector3 worldUp) {
- super();
-
- if (null == curveController) {
- throw new IllegalArgumentException("curveController can not be null!");
- }
-
- _curveController = curveController;
-
- _previous = new Vector3(_curveController.getControlFrom());
-
- setWorldUp(worldUp);
- }
-
- @Override
- public void update(final double time, final Spatial caller) {
- if (null == caller) {
- throw new IllegalArgumentException("caller can not be null!");
- }
-
- final Vector3 interpolated = Vector3.fetchTempInstance();
- final Matrix3 rotation = Matrix3.fetchTempInstance();
-
- _curveController.interpolateVectors(_curveController.getControlFrom(), _curveController.getControlTo(),
- _curveController.getDelta(), interpolated);
-
- MathUtils.matrixLookAt(_previous, interpolated, _worldUp, rotation);
-
- if (isLocalRotation()) {
- caller.setRotation(rotation);
- } else {
- caller.setWorldRotation(rotation);
- }
-
- _previous.set(interpolated);
-
- Matrix3.releaseTempInstance(rotation);
- Vector3.releaseTempInstance(interpolated);
- }
-
- /**
- * @param worldUp
- * The world up vector, can not be <code>null</code>.
- */
- public void setWorldUp(final ReadOnlyVector3 worldUp) {
- if (null == worldUp) {
- throw new IllegalArgumentException("worldUp can not be null!");
- }
-
- _worldUp = worldUp;
- }
-
- /**
- * @param localRotation
- * <code>true</code> to update local rotation, <code>false</code> to update world rotation.
- * @see #isLocalRotation()
- */
- public void setLocalRotation(final boolean localRotation) {
- _localRotation = localRotation;
- }
-
- /**
- * @return <code>true</code> if the local rotation is being updated, <code>false</code> if the world rotation is.
- * @see #setLocalRotation(boolean)
- */
- public boolean isLocalRotation() {
- return _localRotation;
- }
-
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+/**
+ *
+ */
+
+package com.ardor3d.scenegraph.controller.interpolation;
+
+import java.io.Serializable;
+
+import com.ardor3d.math.MathUtils;
+import com.ardor3d.math.Matrix3;
+import com.ardor3d.math.Vector3;
+import com.ardor3d.math.type.ReadOnlyVector3;
+import com.ardor3d.scenegraph.Spatial;
+import com.ardor3d.scenegraph.controller.SpatialController;
+
+/**
+ * CurveLookAtController class rotates a spatial to 'look at' a curve.
+ * <p>
+ * This class assumes the given delegate curve interpolation controller is already added to a spatial and is getting
+ * automatically updated as part of the main loop. Therefore this class doesn't call update on the delegate controller.
+ * </p>
+ */
+public class CurveLookAtController implements SpatialController<Spatial>, Serializable {
+
+ /** Serial UID */
+ private static final long serialVersionUID = 1L;
+
+ /** The world up vector to use in matrix look at */
+ private ReadOnlyVector3 _worldUp;
+
+ /** The curve interpolation controller that does the work of finding the correct position to look at */
+ private final CurveInterpolationController _curveController;
+
+ /** The previous location of the spatial on the curve */
+ private final Vector3 _previous;
+
+ /** @see #setLocalRotation(boolean) */
+ private boolean _localRotation = true;
+
+ /**
+ * Creates a new instance of <code>CurveLookAtController</code>, with {@link Vector3#UNIT_Y} as the world up vector.
+ *
+ * @param curveController
+ * The curve interpolation controller that does the work of finding the correct position to look at, can
+ * not be <code>null</code>.
+ */
+ public CurveLookAtController(final CurveInterpolationController curveController) {
+ this(curveController, Vector3.UNIT_Y);
+ }
+
+ /**
+ * Creates a new instance of <code>CurveLookAtController</code>.
+ *
+ * @param curveController
+ * The curve interpolation controller that does the work of finding the correct position to look at, can
+ * not be <code>null</code>.
+ * @param worldUp
+ * The world up vector, can not be <code>null</code>.
+ */
+ public CurveLookAtController(final CurveInterpolationController curveController, final ReadOnlyVector3 worldUp) {
+ super();
+
+ if (null == curveController) {
+ throw new IllegalArgumentException("curveController can not be null!");
+ }
+
+ _curveController = curveController;
+
+ _previous = new Vector3(_curveController.getControlFrom());
+
+ setWorldUp(worldUp);
+ }
+
+ @Override
+ public void update(final double time, final Spatial caller) {
+ if (null == caller) {
+ throw new IllegalArgumentException("caller can not be null!");
+ }
+
+ final Vector3 interpolated = Vector3.fetchTempInstance();
+ final Matrix3 rotation = Matrix3.fetchTempInstance();
+
+ _curveController.interpolateVectors(_curveController.getControlFrom(), _curveController.getControlTo(),
+ _curveController.getDelta(), interpolated);
+
+ MathUtils.matrixLookAt(_previous, interpolated, _worldUp, rotation);
+
+ if (isLocalRotation()) {
+ caller.setRotation(rotation);
+ } else {
+ caller.setWorldRotation(rotation);
+ }
+
+ _previous.set(interpolated);
+
+ Matrix3.releaseTempInstance(rotation);
+ Vector3.releaseTempInstance(interpolated);
+ }
+
+ /**
+ * @param worldUp
+ * The world up vector, can not be <code>null</code>.
+ */
+ public void setWorldUp(final ReadOnlyVector3 worldUp) {
+ if (null == worldUp) {
+ throw new IllegalArgumentException("worldUp can not be null!");
+ }
+
+ _worldUp = worldUp;
+ }
+
+ /**
+ * @param localRotation
+ * <code>true</code> to update local rotation, <code>false</code> to update world rotation.
+ * @see #isLocalRotation()
+ */
+ public void setLocalRotation(final boolean localRotation) {
+ _localRotation = localRotation;
+ }
+
+ /**
+ * @return <code>true</code> if the local rotation is being updated, <code>false</code> if the world rotation is.
+ * @see #setLocalRotation(boolean)
+ */
+ public boolean isLocalRotation() {
+ return _localRotation;
+ }
+
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/controller/interpolation/DefaultColorInterpolationController.java b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/controller/interpolation/DefaultColorInterpolationController.java
index 378e5b2..d268600 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/controller/interpolation/DefaultColorInterpolationController.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/controller/interpolation/DefaultColorInterpolationController.java
@@ -1,52 +1,52 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.scenegraph.controller.interpolation;
-
-import com.ardor3d.math.ColorRGBA;
-import com.ardor3d.math.type.ReadOnlyColorRGBA;
-import com.ardor3d.scenegraph.Mesh;
-import com.ardor3d.scenegraph.MeshData;
-
-/**
- * ColorRGBAInterpolationController class interpolates the {@link Mesh#getDefaultColor() default colour} of a mesh using
- * {@link ReadOnlyColorRGBA}s.
- * <p>
- * Note: The default colour only works if a {@link MeshData#getColorBuffer() colour buffer} has NOT been set on the
- * mesh.
- * </p>
- */
-public class DefaultColorInterpolationController extends InterpolationController<ReadOnlyColorRGBA, Mesh> {
-
- /** Serial UID */
- private static final long serialVersionUID = 1L;
-
- /**
- * Interpolates between the given colors using the
- * {@link ColorRGBA#lerpLocal(ReadOnlyColorRGBA, ReadOnlyColorRGBA, float)} method.
- */
- @Override
- protected void interpolate(final ReadOnlyColorRGBA from, final ReadOnlyColorRGBA to, final double delta,
- final Mesh caller) {
-
- assert (null != from) : "parameter 'from' can not be null";
- assert (null != to) : "parameter 'to' can not be null";
- assert (null != caller) : "parameter 'caller' can not be null";
-
- final ColorRGBA color = ColorRGBA.fetchTempInstance().set(caller.getDefaultColor());
-
- color.lerpLocal(from, to, (float) delta);
-
- caller.setDefaultColor(color);
-
- ColorRGBA.releaseTempInstance(color);
- }
-
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.scenegraph.controller.interpolation;
+
+import com.ardor3d.math.ColorRGBA;
+import com.ardor3d.math.type.ReadOnlyColorRGBA;
+import com.ardor3d.scenegraph.Mesh;
+import com.ardor3d.scenegraph.MeshData;
+
+/**
+ * ColorRGBAInterpolationController class interpolates the {@link Mesh#getDefaultColor() default colour} of a mesh using
+ * {@link ReadOnlyColorRGBA}s.
+ * <p>
+ * Note: The default colour only works if a {@link MeshData#getColorBuffer() colour buffer} has NOT been set on the
+ * mesh.
+ * </p>
+ */
+public class DefaultColorInterpolationController extends InterpolationController<ReadOnlyColorRGBA, Mesh> {
+
+ /** Serial UID */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Interpolates between the given colors using the
+ * {@link ColorRGBA#lerpLocal(ReadOnlyColorRGBA, ReadOnlyColorRGBA, float)} method.
+ */
+ @Override
+ protected void interpolate(final ReadOnlyColorRGBA from, final ReadOnlyColorRGBA to, final double delta,
+ final Mesh caller) {
+
+ assert (null != from) : "parameter 'from' can not be null";
+ assert (null != to) : "parameter 'to' can not be null";
+ assert (null != caller) : "parameter 'caller' can not be null";
+
+ final ColorRGBA color = ColorRGBA.fetchTempInstance().set(caller.getDefaultColor());
+
+ color.lerpLocal(from, to, (float) delta);
+
+ caller.setDefaultColor(color);
+
+ ColorRGBA.releaseTempInstance(color);
+ }
+
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/controller/interpolation/LinearVector3InterpolationController.java b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/controller/interpolation/LinearVector3InterpolationController.java
index 176383a..3784db9 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/controller/interpolation/LinearVector3InterpolationController.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/controller/interpolation/LinearVector3InterpolationController.java
@@ -1,36 +1,36 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.scenegraph.controller.interpolation;
-
-import com.ardor3d.math.Vector3;
-import com.ardor3d.math.type.ReadOnlyVector3;
-import com.ardor3d.scenegraph.Spatial;
-
-/**
- * LinearVector3InterpolationController class interpolates a {@link Spatial}s vectors using
- * {@link Vector3#lerpLocal(ReadOnlyVector3, ReadOnlyVector3, double)}
- */
-public class LinearVector3InterpolationController extends Vector3InterpolationController {
-
- /** Serial UID */
- private static final long serialVersionUID = 1L;
-
- @Override
- protected Vector3 interpolateVectors(final ReadOnlyVector3 from, final ReadOnlyVector3 to, final double delta,
- final Vector3 target) {
-
- assert (null != from) : "parameter 'from' can not be null";
- assert (null != to) : "parameter 'to' can not be null";
-
- return target.lerpLocal(from, to, delta);
- }
-
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.scenegraph.controller.interpolation;
+
+import com.ardor3d.math.Vector3;
+import com.ardor3d.math.type.ReadOnlyVector3;
+import com.ardor3d.scenegraph.Spatial;
+
+/**
+ * LinearVector3InterpolationController class interpolates a {@link Spatial}s vectors using
+ * {@link Vector3#lerpLocal(ReadOnlyVector3, ReadOnlyVector3, double)}
+ */
+public class LinearVector3InterpolationController extends Vector3InterpolationController {
+
+ /** Serial UID */
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected Vector3 interpolateVectors(final ReadOnlyVector3 from, final ReadOnlyVector3 to, final double delta,
+ final Vector3 target) {
+
+ assert (null != from) : "parameter 'from' can not be null";
+ assert (null != to) : "parameter 'to' can not be null";
+
+ return target.lerpLocal(from, to, delta);
+ }
+
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/controller/interpolation/QuaternionInterpolationController.java b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/controller/interpolation/QuaternionInterpolationController.java
index dfc5c2c..06d6c82 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/controller/interpolation/QuaternionInterpolationController.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/controller/interpolation/QuaternionInterpolationController.java
@@ -1,70 +1,70 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.scenegraph.controller.interpolation;
-
-import com.ardor3d.math.Quaternion;
-import com.ardor3d.math.type.ReadOnlyQuaternion;
-import com.ardor3d.scenegraph.Spatial;
-
-/**
- * QuaternionInterpolationController class interpolates a {@link Spatial}s rotation using {@link Quaternion}s.
- */
-public class QuaternionInterpolationController extends InterpolationController<ReadOnlyQuaternion, Spatial> {
-
- /** Serial UID */
- private static final long serialVersionUID = 1L;
-
- /** @see #setLocalRotation(boolean) */
- private boolean _localRotation = true;
-
- /**
- * Interpolates between the given quaternions using the
- * {@link Quaternion#slerpLocal(ReadOnlyQuaternion, ReadOnlyQuaternion, double)} method.
- */
- @Override
- protected void interpolate(final ReadOnlyQuaternion from, final ReadOnlyQuaternion to, final double delta,
- final Spatial caller) {
-
- assert (null != from) : "parameter 'from' can not be null";
- assert (null != to) : "parameter 'to' can not be null";
- assert (null != caller) : "parameter 'caller' can not be null";
-
- final Quaternion tempQuat = Quaternion.fetchTempInstance();
-
- tempQuat.slerpLocal(from, to, delta);
-
- if (isLocalRotation()) {
- caller.setRotation(tempQuat);
- } else {
- caller.setWorldRotation(tempQuat);
- }
-
- Quaternion.releaseTempInstance(tempQuat);
- }
-
- /**
- * @param localRotation
- * <code>true</code> to update local rotation, <code>false</code> to update world rotation.
- * @see #isLocalRotation()
- */
- public void setLocalRotation(final boolean localRotation) {
- _localRotation = localRotation;
- }
-
- /**
- * @return <code>true</code> if the local rotation is being updated, <code>false</code> if the world rotation is.
- * @see #setLocalRotation(boolean)
- */
- public boolean isLocalRotation() {
- return _localRotation;
- }
-
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.scenegraph.controller.interpolation;
+
+import com.ardor3d.math.Quaternion;
+import com.ardor3d.math.type.ReadOnlyQuaternion;
+import com.ardor3d.scenegraph.Spatial;
+
+/**
+ * QuaternionInterpolationController class interpolates a {@link Spatial}s rotation using {@link Quaternion}s.
+ */
+public class QuaternionInterpolationController extends InterpolationController<ReadOnlyQuaternion, Spatial> {
+
+ /** Serial UID */
+ private static final long serialVersionUID = 1L;
+
+ /** @see #setLocalRotation(boolean) */
+ private boolean _localRotation = true;
+
+ /**
+ * Interpolates between the given quaternions using the
+ * {@link Quaternion#slerpLocal(ReadOnlyQuaternion, ReadOnlyQuaternion, double)} method.
+ */
+ @Override
+ protected void interpolate(final ReadOnlyQuaternion from, final ReadOnlyQuaternion to, final double delta,
+ final Spatial caller) {
+
+ assert (null != from) : "parameter 'from' can not be null";
+ assert (null != to) : "parameter 'to' can not be null";
+ assert (null != caller) : "parameter 'caller' can not be null";
+
+ final Quaternion tempQuat = Quaternion.fetchTempInstance();
+
+ tempQuat.slerpLocal(from, to, delta);
+
+ if (isLocalRotation()) {
+ caller.setRotation(tempQuat);
+ } else {
+ caller.setWorldRotation(tempQuat);
+ }
+
+ Quaternion.releaseTempInstance(tempQuat);
+ }
+
+ /**
+ * @param localRotation
+ * <code>true</code> to update local rotation, <code>false</code> to update world rotation.
+ * @see #isLocalRotation()
+ */
+ public void setLocalRotation(final boolean localRotation) {
+ _localRotation = localRotation;
+ }
+
+ /**
+ * @return <code>true</code> if the local rotation is being updated, <code>false</code> if the world rotation is.
+ * @see #setLocalRotation(boolean)
+ */
+ public boolean isLocalRotation() {
+ return _localRotation;
+ }
+
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/event/DirtyEventListener.java b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/event/DirtyEventListener.java
index 004c7a5..fdf5bd6 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/event/DirtyEventListener.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/event/DirtyEventListener.java
@@ -1,34 +1,34 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.scenegraph.event;
-
-import com.ardor3d.scenegraph.Spatial;
-
-/**
- * DirtyEventListener is the interface for objects interested in updates when spatials get marked dirty / clean
- * (updated).
- */
-public interface DirtyEventListener {
-
- /**
- * spatialDirty is called when a spatial is changed in respect to transform, bounding, attach/dettach or renderstate
- *
- * @return true if the event should be consumed and not continue up the scenegraph.
- */
- boolean spatialDirty(Spatial spatial, DirtyType dirtyType);
-
- /**
- * spatialClean is called when a spatial is changed in respect to transform, bounding, attach/dettach or renderstate
- *
- * @return true if the event should be consumed and not continue up the scenegraph.
- */
- boolean spatialClean(Spatial spatial, DirtyType dirtyType);
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.scenegraph.event;
+
+import com.ardor3d.scenegraph.Spatial;
+
+/**
+ * DirtyEventListener is the interface for objects interested in updates when spatials get marked dirty / clean
+ * (updated).
+ */
+public interface DirtyEventListener {
+
+ /**
+ * spatialDirty is called when a spatial is changed in respect to transform, bounding, attach/dettach or renderstate
+ *
+ * @return true if the event should be consumed and not continue up the scenegraph.
+ */
+ boolean spatialDirty(Spatial spatial, DirtyType dirtyType);
+
+ /**
+ * spatialClean is called when a spatial is changed in respect to transform, bounding, attach/dettach or renderstate
+ *
+ * @return true if the event should be consumed and not continue up the scenegraph.
+ */
+ boolean spatialClean(Spatial spatial, DirtyType dirtyType);
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/event/DirtyType.java b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/event/DirtyType.java
index 3a4c91b..2c81ad9 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/event/DirtyType.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/event/DirtyType.java
@@ -1,18 +1,18 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.scenegraph.event;
-
-/**
- * DirtyType contains the types of update that can occur on a spatial.
- */
-public enum DirtyType {
- Transform, Bounding, Attached, Detached, Destroyed, RenderState
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.scenegraph.event;
+
+/**
+ * DirtyType contains the types of update that can occur on a spatial.
+ */
+public enum DirtyType {
+ Transform, Bounding, Attached, Detached, Destroyed, RenderState
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/event/SceneGraphManager.java b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/event/SceneGraphManager.java
index 9c9d95e..3300c6d 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/event/SceneGraphManager.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/event/SceneGraphManager.java
@@ -1,63 +1,63 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.scenegraph.event;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import com.ardor3d.scenegraph.Spatial;
-
-/**
- * SceneGraphManager is a convenience class for use when you want to have multiple listeners on a particular node.
- */
-public class SceneGraphManager implements DirtyEventListener {
- private static SceneGraphManager sceneGraphManagerInstance;
-
- private final List<DirtyEventListener> _listeners;
-
- private SceneGraphManager() {
- _listeners = new ArrayList<DirtyEventListener>();
- }
-
- public static SceneGraphManager getSceneGraphManager() {
- if (sceneGraphManagerInstance == null) {
- sceneGraphManagerInstance = new SceneGraphManager();
- }
-
- return sceneGraphManagerInstance;
- }
-
- public void listenOnSpatial(final Spatial spatial) {
- spatial.setListener(this);
- }
-
- public void addDirtyEventListener(final DirtyEventListener listener) {
- _listeners.add(listener);
- }
-
- public void removeDirtyEventListener(final DirtyEventListener listener) {
- _listeners.remove(listener);
- }
-
- public boolean spatialDirty(final Spatial spatial, final DirtyType dirtyType) {
- for (final DirtyEventListener listener : _listeners) {
- listener.spatialDirty(spatial, dirtyType);
- }
- return false;
- }
-
- public boolean spatialClean(final Spatial spatial, final DirtyType dirtyType) {
- for (final DirtyEventListener listener : _listeners) {
- listener.spatialClean(spatial, dirtyType);
- }
- return false;
- }
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.scenegraph.event;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.ardor3d.scenegraph.Spatial;
+
+/**
+ * SceneGraphManager is a convenience class for use when you want to have multiple listeners on a particular node.
+ */
+public class SceneGraphManager implements DirtyEventListener {
+ private static SceneGraphManager sceneGraphManagerInstance;
+
+ private final List<DirtyEventListener> _listeners;
+
+ private SceneGraphManager() {
+ _listeners = new ArrayList<DirtyEventListener>();
+ }
+
+ public static SceneGraphManager getSceneGraphManager() {
+ if (sceneGraphManagerInstance == null) {
+ sceneGraphManagerInstance = new SceneGraphManager();
+ }
+
+ return sceneGraphManagerInstance;
+ }
+
+ public void listenOnSpatial(final Spatial spatial) {
+ spatial.setListener(this);
+ }
+
+ public void addDirtyEventListener(final DirtyEventListener listener) {
+ _listeners.add(listener);
+ }
+
+ public void removeDirtyEventListener(final DirtyEventListener listener) {
+ _listeners.remove(listener);
+ }
+
+ public boolean spatialDirty(final Spatial spatial, final DirtyType dirtyType) {
+ for (final DirtyEventListener listener : _listeners) {
+ listener.spatialDirty(spatial, dirtyType);
+ }
+ return false;
+ }
+
+ public boolean spatialClean(final Spatial spatial, final DirtyType dirtyType) {
+ for (final DirtyEventListener listener : _listeners) {
+ listener.spatialClean(spatial, dirtyType);
+ }
+ return false;
+ }
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/extension/SwitchNode.java b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/extension/SwitchNode.java
index 532dace..34b3ff4 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/extension/SwitchNode.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/extension/SwitchNode.java
@@ -1,142 +1,142 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.scenegraph.extension;
-
-import java.util.BitSet;
-
-import com.ardor3d.renderer.Renderer;
-import com.ardor3d.scenegraph.Node;
-import com.ardor3d.scenegraph.Spatial;
-
-public class SwitchNode extends Node {
-
- protected BitSet _childMask = new BitSet();
-
- public SwitchNode() {
- this("SwitchNode");
- }
-
- public SwitchNode(final String name) {
- super(name);
-
- _childMask.set(0);
- }
-
- @Override
- public void draw(final Renderer r) {
- if (_children == null) {
- return;
- }
- for (int i = 0, max = Math.min(_childMask.length(), _children.size()); i < max; i++) {
- if (_childMask.get(i)) {
- final Spatial child = _children.get(i);
- if (child != null) {
- child.onDraw(r);
- }
- }
- }
- }
-
- @Override
- protected void updateChildren(final double time) {
- if (_children == null) {
- return;
- }
- for (int i = 0, max = Math.min(_childMask.length(), _children.size()); i < max; i++) {
- if (_childMask.get(i)) {
- final Spatial child = _children.get(i);
- if (child != null) {
- child.updateGeometricState(time, false);
- }
- }
- }
- }
-
- public void setAllNonVisible() {
- _childMask.clear();
- }
-
- public void setAllVisible() {
- _childMask.set(0, getNumberOfChildren());
- }
-
- public void flipAllVisible() {
- _childMask.flip(0, getNumberOfChildren());
- }
-
- public boolean getVisible(final int bitIndex) {
- return _childMask.get(bitIndex);
- }
-
- public BitSet getVisible() {
- return _childMask;
- }
-
- public void setVisible(final BitSet set) {
- _childMask = set;
- }
-
- public void setVisible(final int bitIndex, final boolean value) {
- _childMask.set(bitIndex, value);
- }
-
- public void setVisible(final int fromIndex, final int toIndex, final boolean value) {
- _childMask.set(fromIndex, toIndex, value);
- }
-
- public void setSingleVisible(final int bitIndex) {
- _childMask.clear();
- _childMask.set(bitIndex);
- }
-
- public int getNextNonVisible(final int fromIndex) {
- return _childMask.nextClearBit(fromIndex);
- }
-
- public int getNextVisible(final int fromIndex) {
- return _childMask.nextSetBit(fromIndex);
- }
-
- public void shiftVisibleRight() {
- final int nrChildren = getNumberOfChildren();
- if (nrChildren == 0) {
- return;
- }
-
- final boolean lastVal = _childMask.get(nrChildren - 1);
- for (int i = nrChildren - 1; i > 0; i--) {
- _childMask.set(i, _childMask.get(i - 1));
- }
- _childMask.set(0, lastVal);
- }
-
- public void shiftVisibleLeft() {
- final int nrChildren = getNumberOfChildren();
- if (nrChildren == 0) {
- return;
- }
-
- final boolean firstVal = _childMask.get(0);
- for (int i = 0; i < nrChildren - 1; i++) {
- _childMask.set(i, _childMask.get(i + 1));
- }
- _childMask.set(getNumberOfChildren() - 1, firstVal);
- }
-
- public void flipVisible(final int fromIndex, final int toIndex) {
- _childMask.flip(fromIndex, toIndex);
- }
-
- public void flipVisible(final int bitIndex) {
- _childMask.flip(bitIndex);
- }
-
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.scenegraph.extension;
+
+import java.util.BitSet;
+
+import com.ardor3d.renderer.Renderer;
+import com.ardor3d.scenegraph.Node;
+import com.ardor3d.scenegraph.Spatial;
+
+public class SwitchNode extends Node {
+
+ protected BitSet _childMask = new BitSet();
+
+ public SwitchNode() {
+ this("SwitchNode");
+ }
+
+ public SwitchNode(final String name) {
+ super(name);
+
+ _childMask.set(0);
+ }
+
+ @Override
+ public void draw(final Renderer r) {
+ if (_children == null) {
+ return;
+ }
+ for (int i = 0, max = Math.min(_childMask.length(), _children.size()); i < max; i++) {
+ if (_childMask.get(i)) {
+ final Spatial child = _children.get(i);
+ if (child != null) {
+ child.onDraw(r);
+ }
+ }
+ }
+ }
+
+ @Override
+ protected void updateChildren(final double time) {
+ if (_children == null) {
+ return;
+ }
+ for (int i = 0, max = Math.min(_childMask.length(), _children.size()); i < max; i++) {
+ if (_childMask.get(i)) {
+ final Spatial child = _children.get(i);
+ if (child != null) {
+ child.updateGeometricState(time, false);
+ }
+ }
+ }
+ }
+
+ public void setAllNonVisible() {
+ _childMask.clear();
+ }
+
+ public void setAllVisible() {
+ _childMask.set(0, getNumberOfChildren());
+ }
+
+ public void flipAllVisible() {
+ _childMask.flip(0, getNumberOfChildren());
+ }
+
+ public boolean getVisible(final int bitIndex) {
+ return _childMask.get(bitIndex);
+ }
+
+ public BitSet getVisible() {
+ return _childMask;
+ }
+
+ public void setVisible(final BitSet set) {
+ _childMask = set;
+ }
+
+ public void setVisible(final int bitIndex, final boolean value) {
+ _childMask.set(bitIndex, value);
+ }
+
+ public void setVisible(final int fromIndex, final int toIndex, final boolean value) {
+ _childMask.set(fromIndex, toIndex, value);
+ }
+
+ public void setSingleVisible(final int bitIndex) {
+ _childMask.clear();
+ _childMask.set(bitIndex);
+ }
+
+ public int getNextNonVisible(final int fromIndex) {
+ return _childMask.nextClearBit(fromIndex);
+ }
+
+ public int getNextVisible(final int fromIndex) {
+ return _childMask.nextSetBit(fromIndex);
+ }
+
+ public void shiftVisibleRight() {
+ final int nrChildren = getNumberOfChildren();
+ if (nrChildren == 0) {
+ return;
+ }
+
+ final boolean lastVal = _childMask.get(nrChildren - 1);
+ for (int i = nrChildren - 1; i > 0; i--) {
+ _childMask.set(i, _childMask.get(i - 1));
+ }
+ _childMask.set(0, lastVal);
+ }
+
+ public void shiftVisibleLeft() {
+ final int nrChildren = getNumberOfChildren();
+ if (nrChildren == 0) {
+ return;
+ }
+
+ final boolean firstVal = _childMask.get(0);
+ for (int i = 0; i < nrChildren - 1; i++) {
+ _childMask.set(i, _childMask.get(i + 1));
+ }
+ _childMask.set(getNumberOfChildren() - 1, firstVal);
+ }
+
+ public void flipVisible(final int fromIndex, final int toIndex) {
+ _childMask.flip(fromIndex, toIndex);
+ }
+
+ public void flipVisible(final int bitIndex) {
+ _childMask.flip(bitIndex);
+ }
+
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/hint/NormalsMode.java b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/hint/NormalsMode.java
index a6873c0..84b6a9c 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/hint/NormalsMode.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/hint/NormalsMode.java
@@ -1,39 +1,39 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.scenegraph.hint;
-
-public enum NormalsMode {
-
- /**
- * Do whatever our parent does. If no parent, we'll default to NormalizeIfScaled.
- */
- Inherit,
-
- /**
- * Send through the normals currently set as-is.
- */
- UseProvided,
-
- /**
- * Tell the card to normalize any normals data we might give it.
- */
- AlwaysNormalize,
-
- /**
- * If a scale other than 1,1,1 is being used then tell the card to normalize any normals data we might give it.
- */
- NormalizeIfScaled,
-
- /**
- * Do not send normal data to the card, even if we have some.
- */
- Off;
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.scenegraph.hint;
+
+public enum NormalsMode {
+
+ /**
+ * Do whatever our parent does. If no parent, we'll default to NormalizeIfScaled.
+ */
+ Inherit,
+
+ /**
+ * Send through the normals currently set as-is.
+ */
+ UseProvided,
+
+ /**
+ * Tell the card to normalize any normals data we might give it.
+ */
+ AlwaysNormalize,
+
+ /**
+ * If a scale other than 1,1,1 is being used then tell the card to normalize any normals data we might give it.
+ */
+ NormalizeIfScaled,
+
+ /**
+ * Do not send normal data to the card, even if we have some.
+ */
+ Off;
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/Box.java b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/Box.java
index 4b4bfdd..c4f630b 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/Box.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/Box.java
@@ -271,7 +271,7 @@ public class Box extends Mesh {
* box.
*/
private void setIndexData() {
- if (_meshData.getIndexBuffer() == null) {
+ if (_meshData.getIndices() == null) {
final byte[] indices = { 2, 1, 0, 3, 2, 0, 6, 5, 4, 7, 6, 4, 10, 9, 8, 11, 10, 8, 14, 13, 12, 15, 14, 12,
18, 17, 16, 19, 18, 16, 22, 21, 20, 23, 22, 20 };
final ByteBuffer buf = BufferUtils.createByteBuffer(indices.length);
diff --git a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/Capsule.java b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/Capsule.java
index fb184d4..7dce5dd 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/Capsule.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/Capsule.java
@@ -221,7 +221,7 @@ public class Capsule extends Mesh {
}
private void setIndexData() {
- _meshData.getIndexBuffer().rewind();
+ _meshData.getIndices().rewind();
// start with top of top dome.
for (int samples = 1; samples <= radialSamples; samples++) {
diff --git a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/Cylinder.java b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/Cylinder.java
index 5b4c7f7..fd56cb6 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/Cylinder.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/Cylinder.java
@@ -322,7 +322,7 @@ public class Cylinder extends Mesh {
}
private void setIndexData() {
- _meshData.getIndexBuffer().rewind();
+ _meshData.getIndices().rewind();
// generate connectivity
for (int axisCount = 0, axisStart = 0; axisCount < _axisSamples - 1; axisCount++) {
diff --git a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/Dodecahedron.java b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/Dodecahedron.java
index 11e00e9..adf1ce5 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/Dodecahedron.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/Dodecahedron.java
@@ -11,12 +11,12 @@
package com.ardor3d.scenegraph.shape;
import java.io.IOException;
-import java.nio.ByteBuffer;
import java.nio.FloatBuffer;
import com.ardor3d.math.MathUtils;
import com.ardor3d.math.Vector2;
import com.ardor3d.math.Vector3;
+import com.ardor3d.scenegraph.IndexBufferData;
import com.ardor3d.scenegraph.Mesh;
import com.ardor3d.util.export.InputCapsule;
import com.ardor3d.util.export.OutputCapsule;
@@ -58,44 +58,44 @@ public class Dodecahedron extends Mesh {
}
private void setIndexData() {
- final ByteBuffer indices = (ByteBuffer) _meshData.getIndexBuffer();
+ final IndexBufferData<?> indices = _meshData.getIndices();
indices.rewind();
- indices.put((byte) 0).put((byte) 8).put((byte) 9);
- indices.put((byte) 0).put((byte) 9).put((byte) 4);
- indices.put((byte) 0).put((byte) 4).put((byte) 16);
- indices.put((byte) 0).put((byte) 12).put((byte) 13);
- indices.put((byte) 0).put((byte) 13).put((byte) 1);
- indices.put((byte) 0).put((byte) 1).put((byte) 8);
- indices.put((byte) 0).put((byte) 16).put((byte) 17);
- indices.put((byte) 0).put((byte) 17).put((byte) 2);
- indices.put((byte) 0).put((byte) 2).put((byte) 12);
- indices.put((byte) 8).put((byte) 1).put((byte) 18);
- indices.put((byte) 8).put((byte) 18).put((byte) 5);
- indices.put((byte) 8).put((byte) 5).put((byte) 9);
- indices.put((byte) 12).put((byte) 2).put((byte) 10);
- indices.put((byte) 12).put((byte) 10).put((byte) 3);
- indices.put((byte) 12).put((byte) 3).put((byte) 13);
- indices.put((byte) 16).put((byte) 4).put((byte) 14);
- indices.put((byte) 16).put((byte) 14).put((byte) 6);
- indices.put((byte) 16).put((byte) 6).put((byte) 17);
- indices.put((byte) 9).put((byte) 5).put((byte) 15);
- indices.put((byte) 9).put((byte) 15).put((byte) 14);
- indices.put((byte) 9).put((byte) 14).put((byte) 4);
- indices.put((byte) 6).put((byte) 11).put((byte) 10);
- indices.put((byte) 6).put((byte) 10).put((byte) 2);
- indices.put((byte) 6).put((byte) 2).put((byte) 17);
- indices.put((byte) 3).put((byte) 19).put((byte) 18);
- indices.put((byte) 3).put((byte) 18).put((byte) 1);
- indices.put((byte) 3).put((byte) 1).put((byte) 13);
- indices.put((byte) 7).put((byte) 15).put((byte) 5);
- indices.put((byte) 7).put((byte) 5).put((byte) 18);
- indices.put((byte) 7).put((byte) 18).put((byte) 19);
- indices.put((byte) 7).put((byte) 11).put((byte) 6);
- indices.put((byte) 7).put((byte) 6).put((byte) 14);
- indices.put((byte) 7).put((byte) 14).put((byte) 15);
- indices.put((byte) 7).put((byte) 19).put((byte) 3);
- indices.put((byte) 7).put((byte) 3).put((byte) 10);
- indices.put((byte) 7).put((byte) 10).put((byte) 11);
+ indices.put(0).put(8).put(9);
+ indices.put(0).put(9).put(4);
+ indices.put(0).put(4).put(16);
+ indices.put(0).put(12).put(13);
+ indices.put(0).put(13).put(1);
+ indices.put(0).put(1).put(8);
+ indices.put(0).put(16).put(17);
+ indices.put(0).put(17).put(2);
+ indices.put(0).put(2).put(12);
+ indices.put(8).put(1).put(18);
+ indices.put(8).put(18).put(5);
+ indices.put(8).put(5).put(9);
+ indices.put(12).put(2).put(10);
+ indices.put(12).put(10).put(3);
+ indices.put(12).put(3).put(13);
+ indices.put(16).put(4).put(14);
+ indices.put(16).put(14).put(6);
+ indices.put(16).put(6).put(17);
+ indices.put(9).put(5).put(15);
+ indices.put(9).put(15).put(14);
+ indices.put(9).put(14).put(4);
+ indices.put(6).put(11).put(10);
+ indices.put(6).put(10).put(2);
+ indices.put(6).put(2).put(17);
+ indices.put(3).put(19).put(18);
+ indices.put(3).put(18).put(1);
+ indices.put(3).put(1).put(13);
+ indices.put(7).put(15).put(5);
+ indices.put(7).put(5).put(18);
+ indices.put(7).put(18).put(19);
+ indices.put(7).put(11).put(6);
+ indices.put(7).put(6).put(14);
+ indices.put(7).put(14).put(15);
+ indices.put(7).put(19).put(3);
+ indices.put(7).put(3).put(10);
+ indices.put(7).put(10).put(11);
}
private void setTextureData() {
diff --git a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/Extrusion.java b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/Extrusion.java
index c6c2c13..6fb83ae 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/Extrusion.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/Extrusion.java
@@ -138,9 +138,9 @@ public class Extrusion extends Mesh {
final int numIndices = (path.size() - 1) * 2 * shapeBuffer.limit();
IndexBufferData<?> indices;
- if (_meshData.getIndexBuffer() != null && _meshData.getIndexBuffer().limit() == numIndices) {
+ if (_meshData.getIndices() != null && _meshData.getIndices().limit() == numIndices) {
indices = _meshData.getIndices();
- indices.getBuffer().rewind();
+ indices.rewind();
} else {
indices = BufferUtils.createIndexBufferData(numIndices, numVertices - 1);
}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/Hexagon.java b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/Hexagon.java
index 361fbb1..f6592ef 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/Hexagon.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/Hexagon.java
@@ -78,7 +78,7 @@ public class Hexagon extends Mesh {
*/
private void setIndexData() {
- _meshData.getIndexBuffer().rewind();
+ _meshData.getIndices().rewind();
// tri 1
_meshData.getIndices().put(0);
_meshData.getIndices().put(6);
diff --git a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/OrientedBox.java b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/OrientedBox.java
index c24b3b5..6983a9c 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/OrientedBox.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/OrientedBox.java
@@ -90,7 +90,7 @@ public class OrientedBox extends Mesh {
* Sets the correct indices array for the box.
*/
private void setIndexData() {
- if (_meshData.getIndexBuffer() == null) {
+ if (_meshData.getIndices() == null) {
_meshData.setIndexBuffer(BufferUtils.createByteBuffer(36));
for (int i = 0; i < 6; i++) {
diff --git a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/RoundedBox.java b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/RoundedBox.java
index 1f252e7..31b52d1 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/RoundedBox.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/RoundedBox.java
@@ -160,7 +160,7 @@ public class RoundedBox extends Mesh {
}
private void setIndexData() {
- if (_meshData.getIndexBuffer() == null) {
+ if (_meshData.getIndices() == null) {
final IndexBufferData<?> buff = BufferUtils.createIndexBufferData(180, 48 - 1);
final int[] data = new int[] { 0, 4, 1, 1, 4, 5, 1, 5, 3, 3, 5, 7, 3, 7, 2, 2, 7, 6, 2, 6, 0, 0, 6, 4, 4,
6, 5, 5, 6, 7 };
diff --git a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/StripBox.java b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/StripBox.java
index 9c98bee..3515494 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/StripBox.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/StripBox.java
@@ -201,7 +201,7 @@ public class StripBox extends Mesh {
*/
private void setIndexData() {
_meshData.setIndexMode(IndexMode.TriangleStrip);
- if (_meshData.getIndexBuffer() == null) {
+ if (_meshData.getIndices() == null) {
final byte[] indices = new byte[] { 2, 3, 6, 7, 5, 3, 0, 2, 1, 6, 4, 5, 1, 0 };
final ByteBuffer buf = BufferUtils.createByteBuffer(indices.length);
buf.put(indices);
diff --git a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/Tube.java b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/Tube.java
index 4f8773f..898f9e9 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/Tube.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/shape/Tube.java
@@ -202,7 +202,7 @@ public class Tube extends Mesh {
}
private void setIndexData() {
- _meshData.getIndexBuffer().rewind();
+ _meshData.getIndices().rewind();
final int outerCylinder = (_axisSamples + 1) * (_radialSamples + 1);
final int bottomEdge = 2 * outerCylinder;
diff --git a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/visitor/DeleteVBOsVisitor.java b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/visitor/DeleteVBOsVisitor.java
index 6d8ce8d..03c075a 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/visitor/DeleteVBOsVisitor.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/visitor/DeleteVBOsVisitor.java
@@ -1,40 +1,40 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.scenegraph.visitor;
-
-import com.ardor3d.renderer.Renderer;
-import com.ardor3d.scenegraph.FloatBufferData;
-import com.ardor3d.scenegraph.Mesh;
-import com.ardor3d.scenegraph.Spatial;
-
-public class DeleteVBOsVisitor implements Visitor {
- final Renderer _deleter;
-
- public DeleteVBOsVisitor(final Renderer deleter) {
- _deleter = deleter;
- }
-
- public void visit(final Spatial spatial) {
- if (spatial instanceof Mesh) {
- final Mesh mesh = (Mesh) spatial;
- _deleter.deleteVBOs(mesh.getMeshData().getVertexCoords());
- _deleter.deleteVBOs(mesh.getMeshData().getIndices());
- _deleter.deleteVBOs(mesh.getMeshData().getInterleavedData());
- _deleter.deleteVBOs(mesh.getMeshData().getNormalCoords());
- _deleter.deleteVBOs(mesh.getMeshData().getTangentCoords());
- for (final FloatBufferData coords : mesh.getMeshData().getTextureCoords()) {
- _deleter.deleteVBOs(coords);
- }
- _deleter.deleteVBOs(mesh.getMeshData().getColorCoords());
- _deleter.deleteVBOs(mesh.getMeshData().getFogCoords());
- }
- }
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.scenegraph.visitor;
+
+import com.ardor3d.renderer.Renderer;
+import com.ardor3d.scenegraph.FloatBufferData;
+import com.ardor3d.scenegraph.Mesh;
+import com.ardor3d.scenegraph.Spatial;
+
+public class DeleteVBOsVisitor implements Visitor {
+ final Renderer _deleter;
+
+ public DeleteVBOsVisitor(final Renderer deleter) {
+ _deleter = deleter;
+ }
+
+ public void visit(final Spatial spatial) {
+ if (spatial instanceof Mesh) {
+ final Mesh mesh = (Mesh) spatial;
+ _deleter.deleteVBOs(mesh.getMeshData().getVertexCoords());
+ _deleter.deleteVBOs(mesh.getMeshData().getIndices());
+ _deleter.deleteVBOs(mesh.getMeshData().getInterleavedData());
+ _deleter.deleteVBOs(mesh.getMeshData().getNormalCoords());
+ _deleter.deleteVBOs(mesh.getMeshData().getTangentCoords());
+ for (final FloatBufferData coords : mesh.getMeshData().getTextureCoords()) {
+ _deleter.deleteVBOs(coords);
+ }
+ _deleter.deleteVBOs(mesh.getMeshData().getColorCoords());
+ _deleter.deleteVBOs(mesh.getMeshData().getFogCoords());
+ }
+ }
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/visitor/UpdateModelBoundVisitor.java b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/visitor/UpdateModelBoundVisitor.java
index db2e891..b313613 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/visitor/UpdateModelBoundVisitor.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/visitor/UpdateModelBoundVisitor.java
@@ -1,22 +1,22 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.scenegraph.visitor;
-
-import com.ardor3d.scenegraph.Mesh;
-import com.ardor3d.scenegraph.Spatial;
-
-public class UpdateModelBoundVisitor implements Visitor {
- public void visit(final Spatial spatial) {
- if (spatial instanceof Mesh) {
- ((Mesh) spatial).updateModelBound();
- }
- }
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.scenegraph.visitor;
+
+import com.ardor3d.scenegraph.Mesh;
+import com.ardor3d.scenegraph.Spatial;
+
+public class UpdateModelBoundVisitor implements Visitor {
+ public void visit(final Spatial spatial) {
+ if (spatial instanceof Mesh) {
+ ((Mesh) spatial).updateModelBound();
+ }
+ }
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/visitor/Visitor.java b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/visitor/Visitor.java
index f90f8c7..d861a5c 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/scenegraph/visitor/Visitor.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/scenegraph/visitor/Visitor.java
@@ -1,23 +1,23 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.scenegraph.visitor;
-
-import com.ardor3d.scenegraph.Spatial;
-
-public interface Visitor {
-
- /**
- * Execute our logic on the given Spatial
- *
- * @param spatial
- */
- void visit(Spatial spatial);
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.scenegraph.visitor;
+
+import com.ardor3d.scenegraph.Spatial;
+
+public interface Visitor {
+
+ /**
+ * Execute our logic on the given Spatial
+ *
+ * @param spatial
+ */
+ void visit(Spatial spatial);
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/spline/Spline.java b/ardor3d-core/src/main/java/com/ardor3d/spline/Spline.java
index 311f5ba..963b0c5 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/spline/Spline.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/spline/Spline.java
@@ -1,62 +1,62 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.spline;
-
-import com.ardor3d.math.Vector3;
-import com.ardor3d.math.type.ReadOnlyVector3;
-
-/**
- * Spline interface allows an interpolated vector to be calculated along a path.
- *
- * @see <a href="http://en.wikipedia.org/wiki/Spline_(mathematics)">Spline (mathematics) - Wikipedia, the free
- * encyclopedia</a>
- */
-public interface Spline {
- /**
- * Will return an interpolated vector between parameters <code>p1</code> and <code>p2</code> using <code>t</code>.
- *
- * @param p0
- * The starting control point.
- * @param p1
- * The second control point.
- * @param p2
- * The third control point.
- * @param p3
- * The final control point.
- * @param t
- * Should be between zero and one. Zero will return point <code>p1</code> while one will return
- * <code>p2</code>, a value in between will return an interpolated vector between the two.
- * @return The interpolated vector.
- */
- public Vector3 interpolate(ReadOnlyVector3 p0, ReadOnlyVector3 p1, ReadOnlyVector3 p2, ReadOnlyVector3 p3, double t);
-
- /**
- * Will return an interpolated vector between parameters <code>p1</code> and <code>p2</code> using <code>t</code>.
- *
- * @param p0
- * The starting control point.
- * @param p1
- * The second control point.
- * @param p2
- * The third control point.
- * @param p3
- * The final control point.
- * @param t
- * Should be between zero and one. Zero will return point <code>p1</code> while one will return
- * <code>p2</code>, a value in between will return an interpolated vector between the two.
- * @param result
- * The interpolated values will be added to this vector.
- * @return The result vector passed in.
- */
- public Vector3 interpolate(ReadOnlyVector3 p0, ReadOnlyVector3 p1, ReadOnlyVector3 p2, ReadOnlyVector3 p3,
- double t, Vector3 result);
-
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.spline;
+
+import com.ardor3d.math.Vector3;
+import com.ardor3d.math.type.ReadOnlyVector3;
+
+/**
+ * Spline interface allows an interpolated vector to be calculated along a path.
+ *
+ * @see <a href="http://en.wikipedia.org/wiki/Spline_(mathematics)">Spline (mathematics) - Wikipedia, the free
+ * encyclopedia</a>
+ */
+public interface Spline {
+ /**
+ * Will return an interpolated vector between parameters <code>p1</code> and <code>p2</code> using <code>t</code>.
+ *
+ * @param p0
+ * The starting control point.
+ * @param p1
+ * The second control point.
+ * @param p2
+ * The third control point.
+ * @param p3
+ * The final control point.
+ * @param t
+ * Should be between zero and one. Zero will return point <code>p1</code> while one will return
+ * <code>p2</code>, a value in between will return an interpolated vector between the two.
+ * @return The interpolated vector.
+ */
+ public Vector3 interpolate(ReadOnlyVector3 p0, ReadOnlyVector3 p1, ReadOnlyVector3 p2, ReadOnlyVector3 p3, double t);
+
+ /**
+ * Will return an interpolated vector between parameters <code>p1</code> and <code>p2</code> using <code>t</code>.
+ *
+ * @param p0
+ * The starting control point.
+ * @param p1
+ * The second control point.
+ * @param p2
+ * The third control point.
+ * @param p3
+ * The final control point.
+ * @param t
+ * Should be between zero and one. Zero will return point <code>p1</code> while one will return
+ * <code>p2</code>, a value in between will return an interpolated vector between the two.
+ * @param result
+ * The interpolated values will be added to this vector.
+ * @return The result vector passed in.
+ */
+ public Vector3 interpolate(ReadOnlyVector3 p0, ReadOnlyVector3 p1, ReadOnlyVector3 p2, ReadOnlyVector3 p3,
+ double t, Vector3 result);
+
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/ui/text/BMFont.java b/ardor3d-core/src/main/java/com/ardor3d/ui/text/BMFont.java
index 9d5991e..c9cb42e 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/ui/text/BMFont.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/ui/text/BMFont.java
@@ -1,954 +1,954 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.ui.text;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.net.MalformedURLException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.StringTokenizer;
-import java.util.logging.Logger;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import com.ardor3d.annotation.SavableFactory;
-import com.ardor3d.image.Texture;
-import com.ardor3d.image.TextureStoreFormat;
-import com.ardor3d.renderer.queue.RenderBucketType;
-import com.ardor3d.renderer.state.BlendState;
-import com.ardor3d.renderer.state.TextureState;
-import com.ardor3d.renderer.state.ZBufferState;
-import com.ardor3d.scenegraph.Spatial;
-import com.ardor3d.util.TextureKey;
-import com.ardor3d.util.TextureManager;
-import com.ardor3d.util.export.InputCapsule;
-import com.ardor3d.util.export.OutputCapsule;
-import com.ardor3d.util.export.Savable;
-import com.ardor3d.util.resource.ResourceSource;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-
-/**
- * Loads a font generated by BMFont (http://www.angelcode.com/products/bmfont/).
- * <ul>
- * <li>Font info file *must* be in XML format.
- * <li>The texture should be saved in 32 bit PNG format - TGA does not appear to work.
- * <li>This class only supports a single page (see BMFont documentation for details on pages)
- * </ul>
- */
-public class BMFont implements Savable {
- private static Logger logger = Logger.getLogger(BMFont.class.getName());
-
- private final Map<Integer, Char> _charMap = Maps.newHashMap();
- private final Map<Integer, Map<Integer, Integer>> _kernMap = Maps.newHashMap();
-
- private String _styleName; // e.g. "Courier-12-bold"
- private final ArrayList<Page> _pages = new ArrayList<Page>();
- private Texture _pageTexture;
- private RenderStateSetter _blendStateSetter = null;
- private RenderStateSetter _alphaStateSetter = null;
- private boolean _useMipMaps;
- private int _maxCharAdv;
- private Common _common = null;
- private Info _info = null;
-
- /**
- * This constructor should be used when loading as Savable
- */
- public BMFont() {}
-
- /**
- * Reads an XML BMFont description file and loads corresponding texture. Note that the TGA written by BMFont does
- * not seem to be read properly by the Ardor3D loader. PNG works fine.
- *
- * @param fileUrl
- * - the location of the .fnt font file. Can not be null.
- * @param useMipMaps
- * if true, use trilinear filtering with max anisotropy, else min filter is bilinear. MipMaps result in
- * blurrier text, but less shimmering.
- * @throws IOException
- * if there are any problems reading the .fnt file.
- */
- public BMFont(final ResourceSource source, final boolean useMipMaps) throws IOException {
- _useMipMaps = useMipMaps;
-
- parseFontFile(source);
- initialize(source);
- }
-
- /** apply default render states to spatial */
- public void applyRenderStatesTo(final Spatial spatial, final boolean useBlend) {
- if (useBlend) {
- if (_blendStateSetter == null) {
- _blendStateSetter = new RenderStateSetter(_pageTexture, true);
- }
- _blendStateSetter.applyTo(spatial);
- } else {
- if (_alphaStateSetter == null) {
- _alphaStateSetter = new RenderStateSetter(_pageTexture, false);
- }
- _alphaStateSetter.applyTo(spatial);
- }
- }
-
- public String getStyleName() {
- return _styleName;
- }
-
- public int getSize() {
- return Math.abs(_info.size);
- }
-
- public int getLineHeight() {
- return _common.lineHeight;
- }
-
- public int getBaseHeight() {
- return _common.base;
- }
-
- public int getTextureWidth() {
- return _common.scaleW;
- }
-
- public int getTextureHeight() {
- return _common.scaleH;
- }
-
- /**
- * @param chr
- * ascii character code
- * @return character descriptor for chr. If character is not in the char set, return '?' (if '?' is not in the char
- * set, return will be null)
- */
- public BMFont.Char getChar(int chr) {
- BMFont.Char retVal = _charMap.get(chr);
- if (retVal == null) {
- chr = '?';
- retVal = _charMap.get(chr);
- if (retVal == null) { // if still null, use the first char
- final Iterator<Char> it = _charMap.values().iterator();
- retVal = it.next();
- }
- }
- return retVal;
- }
-
- /**
- * @return kerning information for this character pair
- */
- public int getKerning(final int chr, final int nextChr) {
- final Map<Integer, Integer> map = _kernMap.get(chr);
- if (map != null) {
- final Integer amt = map.get(nextChr);
- if (amt != null) {
- return amt;
- }
- }
- return 0;
- }
-
- /**
- * @return the largest xadvance in this char set
- */
- public int getMaxCharAdvance() {
- return _maxCharAdv;
- }
-
- public int getOutlineWidth() {
- return _info.outline;
- }
-
- public Info getInfo() {
- return _info;
- }
-
- /**
- * Writes the XML for this font out to the OutputStream provided.
- *
- * @param outputStream
- * the OutputStream to which the XML for this font will be written to
- * @throws IOException
- * thrown if there is any problem writing out to the OutputStream
- */
- public void writeXML(final OutputStream outputStream) throws IOException {
- final StringBuilder xml = new StringBuilder();
-
- xml.append("<?xml version=\"1.0\"?>\n");
- xml.append("<font>\n");
- xml.append(generateInfoXML());
- xml.append(generateCommonXML());
- xml.append(generatePagesXML());
- xml.append(generateCharsXML());
- xml.append(generateKerningsXML());
- xml.append("</font>");
-
- // Write out to the output stream now
- outputStream.write(xml.toString().getBytes());
- outputStream.flush();
-
- return;
- }
-
- private String generateInfoXML() {
- final StringBuilder xml = new StringBuilder();
-
- xml.append(" <info face=\"");
- xml.append(_info.face);
- xml.append("\" size=\"");
- xml.append(_info.size);
- xml.append("\" bold=\"");
- xml.append(_info.bold ? "1" : "0");
- xml.append("\" italic=\"");
- xml.append(_info.italic ? "1" : "0");
- xml.append("\" charset=\"");
- xml.append(_info.charset);
- xml.append("\" unicode=\"");
- xml.append(_info.unicode ? "1" : "0");
- xml.append("\" stretchH=\"");
- xml.append(_info.stretchH);
- xml.append("\" smooth=\"");
- xml.append(_info.smooth ? "1" : "0");
- xml.append("\" aa=\"");
- xml.append(_info.aa ? "1" : "0");
- xml.append("\" padding=\"");
-
- for (int i = 0; i < _info.padding.length; i++) {
- xml.append(_info.padding[i]);
-
- if (i < (_info.padding.length - 1)) {
- xml.append(',');
- }
- }
-
- xml.append("\" spacing=\"");
-
- for (int i = 0; i < _info.spacing.length; i++) {
- xml.append(_info.spacing[i]);
-
- if (i < (_info.spacing.length - 1)) {
- xml.append(',');
- }
- }
-
- xml.append("\" outline=\"");
- xml.append(_info.outline);
- xml.append("\"/>\n");
-
- return xml.toString();
- }
-
- private String generateCommonXML() {
- final StringBuilder xml = new StringBuilder();
-
- xml.append(" <common lineHeight=\"");
- xml.append(_common.lineHeight);
- xml.append("\" base=\"");
- xml.append(_common.base);
- xml.append("\" scaleW=\"");
- xml.append(_common.scaleW);
- xml.append("\" scaleH=\"");
- xml.append(_common.scaleH);
- xml.append("\" pages=\"");
- xml.append(_common.pages);
- xml.append("\" packed=\"");
- xml.append(_common.packed ? "1" : "0");
- xml.append("\" alphaChnl=\"");
- xml.append(_common.alphaChnl);
- xml.append("\" redChnl=\"");
- xml.append(_common.redChnl);
- xml.append("\" greenChnl=\"");
- xml.append(_common.greenChnl);
- xml.append("\" blueChnl=\"");
- xml.append(_common.blueChnl);
- xml.append("\"/>\n");
-
- return xml.toString();
- }
-
- private String generatePagesXML() {
- final StringBuilder xml = new StringBuilder();
-
- xml.append(" <pages>\n");
-
- for (final Iterator<Page> iterator = _pages.iterator(); iterator.hasNext();) {
- final Page page = iterator.next();
-
- xml.append(" <page id=\"");
- xml.append(page.id);
- xml.append("\" file=\"");
- xml.append(page.file);
- xml.append("\" />\n");
- }
-
- xml.append(" </pages>\n");
-
- return xml.toString();
- }
-
- private String generateCharsXML() {
- final StringBuilder xml = new StringBuilder();
-
- xml.append(" <chars count=\"");
- xml.append(_charMap.size());
- xml.append("\">\n");
-
- for (final Iterator<Integer> iterator = _charMap.keySet().iterator(); iterator.hasNext();) {
- final Integer key = iterator.next();
- final Char character = _charMap.get(key);
-
- xml.append(" <char id=\"");
- xml.append(character.id);
- xml.append("\" x=\"");
- xml.append(character.x);
- xml.append("\" y=\"");
- xml.append(character.y);
- xml.append("\" width=\"");
- xml.append(character.width);
- xml.append("\" height=\"");
- xml.append(character.height);
- xml.append("\" xoffset=\"");
- xml.append(character.xoffset);
- xml.append("\" yoffset=\"");
- xml.append(character.yoffset);
- xml.append("\" xadvance=\"");
- xml.append(character.xadvance);
- xml.append("\" page=\"");
- xml.append(character.page);
- xml.append("\" chnl=\"");
- xml.append(character.chnl);
- xml.append("\" />\n");
- }
-
- xml.append(" </chars>\n");
-
- return xml.toString();
- }
-
- private String generateKerningsXML() {
- final StringBuilder xml = new StringBuilder();
- int count = 0;
-
- for (final Iterator<Integer> iterator = _kernMap.keySet().iterator(); iterator.hasNext();) {
- final Integer first = iterator.next();
- final Map<Integer, Integer> amtHash = _kernMap.get(first);
-
- for (final Iterator<Integer> iterator2 = amtHash.keySet().iterator(); iterator2.hasNext();) {
- final Integer second = iterator2.next();
- final Integer amount = amtHash.get(second);
-
- xml.append(" <kerning first=\"");
- xml.append(first);
- xml.append("\" second=\"");
- xml.append(second);
- xml.append("\" amount=\"");
- xml.append(amount);
- xml.append("\" />\n");
-
- count++;
- }
- }
-
- final String xmlString = " <kernings count=\"" + count + "\">\n" + xml.toString() + " </kernings>\n";
-
- return xmlString;
- }
-
- /**
- * load the texture and create default render states. Only a single page is supported.
- *
- * @param fontUrl
- */
- // ----------------------------------------------------------
- protected void initialize(final ResourceSource source) throws MalformedURLException {
- _styleName = _info.face + "-" + _info.size;
-
- if (_info.bold) {
- _styleName += "-bold";
- } else {
- _styleName += "-medium";
- }
-
- if (_info.italic) {
- _styleName += "-italic";
- } else {
- _styleName += "-regular";
- }
-
- // only a single page is supported
- if (_pages.size() > 0) {
- final Page page = _pages.get(0);
-
- final ResourceSource texSrc = source.getRelativeSource("./" + page.file);
-
- Texture.MinificationFilter minFilter;
- Texture.MagnificationFilter magFilter;
-
- magFilter = Texture.MagnificationFilter.Bilinear;
- minFilter = Texture.MinificationFilter.BilinearNoMipMaps;
- if (_useMipMaps) {
- minFilter = Texture.MinificationFilter.Trilinear;
- }
- final TextureKey tkey = TextureKey.getKey(texSrc, false, TextureStoreFormat.GuessNoCompressedFormat,
- minFilter);
- _pageTexture = TextureManager.loadFromKey(tkey, null, null);
- _pageTexture.setMagnificationFilter(magFilter);
-
- // Add a touch higher mipmap selection.
- _pageTexture.setLodBias(-1);
-
- if (_useMipMaps) {
- _pageTexture.setAnisotropicFilterPercent(1.0f);
- }
- }
- }
-
- public Texture getPageTexture() {
- return _pageTexture;
- }
-
- public List<Integer> getMappedChars() {
- return Lists.newArrayList(_charMap.keySet());
- }
-
- public Map<Integer, Integer> getKerningsForCharacter(final int val) {
- return _kernMap.get(val);
- }
-
- public Map<Integer, Map<Integer, Integer>> getKerningMap() {
- return _kernMap;
- }
-
- /**
- *
- * @param fontUrl
- * @throws IOException
- */
- protected void parseFontFile(final ResourceSource source) throws IOException {
- _maxCharAdv = 0;
- _charMap.clear();
- _pages.clear();
- try {
- final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- final DocumentBuilder db = dbf.newDocumentBuilder();
- final Document doc = db.parse(source.openStream());
-
- doc.getDocumentElement().normalize();
- recurse(doc.getElementsByTagName("font").item(0));
-
- // db.reset();
- } catch (final Throwable t) {
- final IOException ex = new IOException("Error loading font file " + source.toString());
- ex.initCause(t);
- throw ex;
- }
- }
-
- private void recurse(final Node node) {
- final NodeList children = node.getChildNodes();
- for (int i = 0; i < children.getLength(); i++) {
- final Node child = children.item(i);
- processNode(child);
- recurse(child);
- }
- }
-
- private void processNode(final Node node) {
- final String tagName = node.getNodeName();
- if (tagName != null) {
- if (tagName.equals("info")) {
- processInfoNode(node);
- } else if (tagName.equals("common")) {
- processCommonNode(node);
- } else if (tagName.equals("page")) {
- processPageNode(node);
- } else if (tagName.equals("char")) {
- processCharNode(node);
- } else if (tagName.equals("kerning")) {
- procesKerningNode(node);
- }
- }
- }
-
- private void processInfoNode(final Node node) {
- final NamedNodeMap attribs = node.getAttributes();
- _info = new Info();
- _info.face = getStringAttrib("face", attribs);
- _info.size = getIntAttrib("size", attribs);
- _info.bold = getBoolAttrib("bold", attribs);
- _info.italic = getBoolAttrib("italic", attribs);
- _info.charset = getStringAttrib("charset", attribs);
- _info.unicode = getBoolAttrib("unicode", attribs);
- _info.stretchH = getIntAttrib("stretchH", attribs);
- _info.smooth = getBoolAttrib("smooth", attribs);
- _info.aa = getBoolAttrib("aa", attribs);
- _info.padding = getIntArrayAttrib("padding", attribs);
- _info.spacing = getIntArrayAttrib("spacing", attribs);
- _info.outline = getIntAttrib("outline", attribs);
- }
-
- private void processCommonNode(final Node node) {
- final NamedNodeMap attribs = node.getAttributes();
- _common = new Common();
- _common.lineHeight = getIntAttrib("lineHeight", attribs);
- _common.base = getIntAttrib("base", attribs);
- _common.scaleW = getIntAttrib("scaleW", attribs);
- _common.scaleH = getIntAttrib("scaleH", attribs);
- _common.pages = getIntAttrib("pages", attribs);
- _common.packed = getBoolAttrib("packed", attribs);
- _common.alphaChnl = getIntAttrib("alphaChnl", attribs);
- _common.redChnl = getIntAttrib("redChnl", attribs);
- _common.greenChnl = getIntAttrib("greenChnl", attribs);
- _common.blueChnl = getIntAttrib("blueChnl", attribs);
- }
-
- private void processCharNode(final Node node) {
- final NamedNodeMap attribs = node.getAttributes();
- final Char c = new Char();
- c.id = getIntAttrib("id", attribs);
- c.x = getIntAttrib("x", attribs);
- c.y = getIntAttrib("y", attribs);
- c.width = getIntAttrib("width", attribs);
- c.height = getIntAttrib("height", attribs);
- c.xoffset = getIntAttrib("xoffset", attribs);
- c.yoffset = getIntAttrib("yoffset", attribs);
- c.xadvance = getIntAttrib("xadvance", attribs);
- c.page = getIntAttrib("page", attribs);
- c.chnl = getIntAttrib("chnl", attribs);
- _charMap.put(c.id, c);
- if (c.xadvance > _maxCharAdv) {
- _maxCharAdv = c.xadvance;
- }
- }
-
- private void processPageNode(final Node node) {
- final NamedNodeMap attribs = node.getAttributes();
- final Page page = new Page();
- page.id = getIntAttrib("id", attribs);
- page.file = getStringAttrib("file", attribs);
- _pages.add(page);
- if (_pages.size() > 1) {
- logger.warning("multiple pages defined in font description file, but only a single page is supported.");
- }
- }
-
- private void procesKerningNode(final Node node) {
- final NamedNodeMap attribs = node.getAttributes();
- final int first = getIntAttrib("first", attribs);
- final int second = getIntAttrib("second", attribs);
- final int amount = getIntAttrib("amount", attribs);
- Map<Integer, Integer> amtHash;
- amtHash = _kernMap.get(first);
- if (amtHash == null) {
- amtHash = Maps.newHashMap();
- _kernMap.put(first, amtHash);
- }
- amtHash.put(second, amount);
- }
-
- // == xml attribute getters ============================
- int getIntAttrib(final String name, final NamedNodeMap attribs) {
- final Node node = attribs.getNamedItem(name);
- return Integer.parseInt(node.getNodeValue());
- }
-
- String getStringAttrib(final String name, final NamedNodeMap attribs) {
- final Node node = attribs.getNamedItem(name);
- return node.getNodeValue();
- }
-
- boolean getBoolAttrib(final String name, final NamedNodeMap attribs) {
- final Node node = attribs.getNamedItem(name);
- return (Integer.parseInt(node.getNodeValue()) == 1);
- }
-
- int[] getIntArrayAttrib(final String name, final NamedNodeMap attribs) {
- final Node node = attribs.getNamedItem(name);
- final String str = node.getNodeValue();
- final StringTokenizer strtok = new StringTokenizer(str, ",");
- final int sz = strtok.countTokens();
- final int[] retVal = new int[sz];
- for (int i = 0; i < sz; i++) {
- retVal[i] = Integer.parseInt(strtok.nextToken());
- }
- return retVal;
- }
-
- // == support structs ==================================
- @SavableFactory(factoryMethod = "create")
- public static class Info implements Savable {
- public String face;
- public int size;
- public boolean bold;
- public boolean italic;
- public String charset;
- public boolean unicode;
- public int stretchH;
- public boolean smooth;
- public boolean aa;
- public int[] padding;
- public int[] spacing;
- public int outline;
-
- public static Info create() {
- return new Info();
- }
-
- @Override
- public void write(final OutputCapsule capsule) throws IOException {
- capsule.write(face, "face", null);
- capsule.write(size, "size", 0);
- capsule.write(bold, "bold", false);
- capsule.write(italic, "italic", false);
- capsule.write(charset, "charset", null);
- capsule.write(unicode, "unicode", false);
- capsule.write(stretchH, "stretchH", 0);
- capsule.write(smooth, "smooth", false);
- capsule.write(aa, "aa", false);
- capsule.write(padding, "padding", null);
- capsule.write(spacing, "spacing", null);
- capsule.write(outline, "outline", 0);
- }
-
- @Override
- public void read(final InputCapsule capsule) throws IOException {
- face = capsule.readString("face", null);
- size = capsule.readInt("size", 0);
- bold = capsule.readBoolean("bold", false);
- italic = capsule.readBoolean("italic", false);
- charset = capsule.readString("charset", null);
- unicode = capsule.readBoolean("unicode", false);
- stretchH = capsule.readInt("stretchH", 0);
- smooth = capsule.readBoolean("smooth", false);
- aa = capsule.readBoolean("aa", false);
- padding = capsule.readIntArray("padding", null);
- spacing = capsule.readIntArray("spacing", null);
- outline = capsule.readInt("outline", 0);
- }
-
- @Override
- public Class<?> getClassTag() {
- return getClass();
- }
- }
-
- @SavableFactory(factoryMethod = "create")
- public static class Common implements Savable {
- public int lineHeight;
- public int base;
- public int scaleW;
- public int scaleH;
- public int pages;
- public boolean packed;
- public int alphaChnl;
- public int redChnl;
- public int greenChnl;
- public int blueChnl;
-
- public static Common create() {
- return new Common();
- }
-
- @Override
- public void write(final OutputCapsule capsule) throws IOException {
- capsule.write(lineHeight, "lineHeight", 0);
- capsule.write(base, "base", 0);
- capsule.write(scaleW, "scaleW", 1);
- capsule.write(scaleH, "scaleH", 1);
- capsule.write(pages, "pages", 0);
- capsule.write(packed, "packed", false);
- capsule.write(alphaChnl, "alphaChnl", 0);
- capsule.write(redChnl, "redChnl", 0);
- capsule.write(greenChnl, "greenChnl", 0);
- capsule.write(blueChnl, "blueChnl", 0);
- }
-
- @Override
- public void read(final InputCapsule capsule) throws IOException {
- lineHeight = capsule.readInt("lineHeight", 0);
- base = capsule.readInt("base", 0);
- scaleW = capsule.readInt("scaleW", 0);
- scaleH = capsule.readInt("scaleH", 0);
- pages = capsule.readInt("pages", 0);
- packed = capsule.readBoolean("packed", false);
- alphaChnl = capsule.readInt("alphaChnl", 0);
- redChnl = capsule.readInt("redChnl", 0);
- greenChnl = capsule.readInt("greenChnl", 0);
- blueChnl = capsule.readInt("blueChnl", 0);
- }
-
- @Override
- public Class<?> getClassTag() {
- return getClass();
- }
- }
-
- @SavableFactory(factoryMethod = "create")
- public static class Page implements Savable {
- public int id;
- public String file;
-
- public static Page create() {
- return new Page();
- }
-
- @Override
- public void write(final OutputCapsule capsule) throws IOException {
- capsule.write(id, "id", 0);
- capsule.write(file, "file", null);
- }
-
- @Override
- public void read(final InputCapsule capsule) throws IOException {
- id = capsule.readInt("id", 0);
- file = capsule.readString("file", null);
-
- }
-
- @Override
- public Class<?> getClassTag() {
- return this.getClass();
- }
- }
-
- @SavableFactory(factoryMethod = "create")
- public static class Char implements Savable {
- public int id;
- public int x;
- public int y;
- public int width;
- public int height;
- public int xoffset;
- public int yoffset;
- public int xadvance;
- public int page;
- public int chnl;
-
- public static Char create() {
- return new Char();
- }
-
- @Override
- public void write(final OutputCapsule capsule) throws IOException {
- capsule.write(id, "id", 0);
- capsule.write(x, "x", 0);
- capsule.write(y, "y", 0);
- capsule.write(width, "width", 0);
- capsule.write(height, "height", 0);
- capsule.write(xoffset, "xoffset", 0);
- capsule.write(yoffset, "yoffset", 0);
- capsule.write(xadvance, "xadvance", 0);
- capsule.write(page, "page", 0);
- capsule.write(chnl, "chnl", 0);
- }
-
- @Override
- public void read(final InputCapsule capsule) throws IOException {
- id = capsule.readInt("id", 0);
- x = capsule.readInt("x", 0);
- y = capsule.readInt("y", 0);
- width = capsule.readInt("width", 0);
- height = capsule.readInt("height", 0);
- xoffset = capsule.readInt("xoffset", 0);
- yoffset = capsule.readInt("yoffset", 0);
- xadvance = capsule.readInt("xadvance", 0);
- page = capsule.readInt("page", 0);
- chnl = capsule.readInt("chnl", 0);
- }
-
- @Override
- public Class<?> getClassTag() {
- return getClass();
- }
- }
-
- @SavableFactory(factoryMethod = "create")
- public static class Kerning implements Savable {
- public int first;
- public int second;
- public int amount;
-
- public Kerning() {}
-
- public Kerning(final int first, final int second, final int amount) {
- this.first = first;
- this.second = second;
- this.amount = amount;
- }
-
- public static Kerning create() {
- return new BMFont.Kerning();
- }
-
- @Override
- public void write(final OutputCapsule capsule) throws IOException {
- capsule.write(first, "fist", 0);
- capsule.write(second, "second", 0);
- capsule.write(amount, "amount", 0);
- }
-
- @Override
- public void read(final InputCapsule capsule) throws IOException {
- first = capsule.readInt("first", 0);
- second = capsule.readInt("second", 0);
- amount = capsule.readInt("amount", 0);
- }
-
- @Override
- public Class<?> getClassTag() {
- return getClass();
- }
- }
-
- /**
- * utility to set default render states for text
- */
- public class RenderStateSetter {
- public TextureState textureState;
- public BlendState blendState;
- public ZBufferState zBuffState;
-
- float _blendDisabledTestRef = 0.3f;
- float _blendEnabledTestRef = 0.02f;
-
- boolean _useBlend;
-
- RenderStateSetter(final Texture texture, final boolean useBlend) {
- textureState = new TextureState();
- textureState.setTexture(texture);
-
- blendState = new BlendState();
- blendState.setSourceFunction(BlendState.SourceFunction.SourceAlpha);
- blendState.setDestinationFunction(BlendState.DestinationFunction.OneMinusSourceAlpha);
- blendState.setTestEnabled(true);
- blendState.setTestFunction(BlendState.TestFunction.GreaterThan);
-
- zBuffState = new ZBufferState();
- zBuffState.setFunction(ZBufferState.TestFunction.LessThanOrEqualTo);
-
- setUseBlend(useBlend);
- }
-
- void applyTo(final Spatial spatial) {
- spatial.setRenderState(textureState);
- spatial.setRenderState(blendState);
- spatial.setRenderState(zBuffState);
- if (_useBlend) {
- spatial.getSceneHints().setRenderBucketType(RenderBucketType.Transparent);
- } else {
- spatial.getSceneHints().setRenderBucketType(RenderBucketType.Opaque);
- }
- }
-
- void setUseBlend(final boolean blend) {
- _useBlend = blend;
- if (!_useBlend) {
- blendState.setBlendEnabled(false);
- blendState.setReference(_blendDisabledTestRef);
- zBuffState.setWritable(true);
- } else {
- blendState.setBlendEnabled(true);
- blendState.setReference(_blendEnabledTestRef);
- zBuffState.setWritable(false);
- }
- }
- }
-
- @Override
- public void write(final OutputCapsule capsule) throws IOException {
- _pageTexture.setStoreImage(true);
- capsule.write(_useMipMaps, "useMipMaps", false);
- capsule.write(_styleName, "styleName", null);
- capsule.write(_pageTexture, "pageTexture", null);
-
- // Info
- capsule.write(_info, "info", null);
- // Common
- capsule.write(_common, "common", null);
- // Pages
- capsule.writeSavableList(_pages, "pages", _pages);
- // Chars
- capsule.writeSavableList(new ArrayList<Char>(_charMap.values()), "charMap", null);
-
- // Kernings
- final List<Kerning> kernings = new ArrayList<Kerning>();
- for (final Iterator<Integer> iterator = _kernMap.keySet().iterator(); iterator.hasNext();) {
- final Integer first = iterator.next();
- final Map<Integer, Integer> amtHash = _kernMap.get(first);
- for (final Iterator<Integer> iterator2 = amtHash.keySet().iterator(); iterator2.hasNext();) {
- final Integer second = iterator2.next();
- final Integer amount = amtHash.get(second);
- kernings.add(new Kerning(first, second, amount));
- }
- }
- capsule.writeSavableList(kernings, "kernings", kernings);
- }
-
- @Override
- public void read(final InputCapsule capsule) throws IOException {
- _useMipMaps = capsule.readBoolean("useMipMaps", false);
- _styleName = capsule.readString("styleName", null);
- _pageTexture = (Texture) capsule.readSavable("pageTexture", null);
- _pageTexture = TextureManager.loadFromImage(_pageTexture.getImage(), _pageTexture.getMinificationFilter());
-
- // Info
- _info = (Info) capsule.readSavable("info", _info);
- // Common
- _common = (Common) capsule.readSavable("common", _common);
- // Pages
- _pages.clear();
- final List<Savable> pages = capsule.readSavableList("pages", new ArrayList<Savable>());
- for (final Savable savable : pages) {
- _pages.add((Page) savable);
- if (_pages.size() > 1) {
- logger.warning("multiple pages defined in font description file, but only a single page is supported.");
- }
- }
- // Chars
- _charMap.clear();
- final List<Savable> chars = capsule.readSavableList("charMap", new ArrayList<Savable>());
- for (final Savable savable : chars) {
- final Char c = (Char) savable;
- _charMap.put(c.id, c);
- if (c.xadvance > _maxCharAdv) {
- _maxCharAdv = c.xadvance;
- }
- }
- // Kernings
- _kernMap.clear();
- final List<Savable> kernings = capsule.readSavableList("kernings", new ArrayList<Savable>());
- for (final Savable savable : kernings) {
- final Kerning k = (Kerning) savable;
- Map<Integer, Integer> amtHash;
- amtHash = _kernMap.get(k.first);
- if (amtHash == null) {
- amtHash = Maps.newHashMap();
- _kernMap.put(k.first, amtHash);
- }
- amtHash.put(k.second, k.amount);
- _kernMap.put(k.first, amtHash);
- }
- }
-
- @Override
- public Class<?> getClassTag() {
- return getClass();
- }
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.ui.text;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.MalformedURLException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.StringTokenizer;
+import java.util.logging.Logger;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import com.ardor3d.annotation.SavableFactory;
+import com.ardor3d.image.Texture;
+import com.ardor3d.image.TextureStoreFormat;
+import com.ardor3d.renderer.queue.RenderBucketType;
+import com.ardor3d.renderer.state.BlendState;
+import com.ardor3d.renderer.state.TextureState;
+import com.ardor3d.renderer.state.ZBufferState;
+import com.ardor3d.scenegraph.Spatial;
+import com.ardor3d.util.TextureKey;
+import com.ardor3d.util.TextureManager;
+import com.ardor3d.util.export.InputCapsule;
+import com.ardor3d.util.export.OutputCapsule;
+import com.ardor3d.util.export.Savable;
+import com.ardor3d.util.resource.ResourceSource;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
+/**
+ * Loads a font generated by BMFont (http://www.angelcode.com/products/bmfont/).
+ * <ul>
+ * <li>Font info file *must* be in XML format.
+ * <li>The texture should be saved in 32 bit PNG format - TGA does not appear to work.
+ * <li>This class only supports a single page (see BMFont documentation for details on pages)
+ * </ul>
+ */
+public class BMFont implements Savable {
+ private static Logger logger = Logger.getLogger(BMFont.class.getName());
+
+ private final Map<Integer, Char> _charMap = Maps.newHashMap();
+ private final Map<Integer, Map<Integer, Integer>> _kernMap = Maps.newHashMap();
+
+ private String _styleName; // e.g. "Courier-12-bold"
+ private final ArrayList<Page> _pages = new ArrayList<Page>();
+ private Texture _pageTexture;
+ private RenderStateSetter _blendStateSetter = null;
+ private RenderStateSetter _alphaStateSetter = null;
+ private boolean _useMipMaps;
+ private int _maxCharAdv;
+ private Common _common = null;
+ private Info _info = null;
+
+ /**
+ * This constructor should be used when loading as Savable
+ */
+ public BMFont() {}
+
+ /**
+ * Reads an XML BMFont description file and loads corresponding texture. Note that the TGA written by BMFont does
+ * not seem to be read properly by the Ardor3D loader. PNG works fine.
+ *
+ * @param fileUrl
+ * - the location of the .fnt font file. Can not be null.
+ * @param useMipMaps
+ * if true, use trilinear filtering with max anisotropy, else min filter is bilinear. MipMaps result in
+ * blurrier text, but less shimmering.
+ * @throws IOException
+ * if there are any problems reading the .fnt file.
+ */
+ public BMFont(final ResourceSource source, final boolean useMipMaps) throws IOException {
+ _useMipMaps = useMipMaps;
+
+ parseFontFile(source);
+ initialize(source);
+ }
+
+ /** apply default render states to spatial */
+ public void applyRenderStatesTo(final Spatial spatial, final boolean useBlend) {
+ if (useBlend) {
+ if (_blendStateSetter == null) {
+ _blendStateSetter = new RenderStateSetter(_pageTexture, true);
+ }
+ _blendStateSetter.applyTo(spatial);
+ } else {
+ if (_alphaStateSetter == null) {
+ _alphaStateSetter = new RenderStateSetter(_pageTexture, false);
+ }
+ _alphaStateSetter.applyTo(spatial);
+ }
+ }
+
+ public String getStyleName() {
+ return _styleName;
+ }
+
+ public int getSize() {
+ return Math.abs(_info.size);
+ }
+
+ public int getLineHeight() {
+ return _common.lineHeight;
+ }
+
+ public int getBaseHeight() {
+ return _common.base;
+ }
+
+ public int getTextureWidth() {
+ return _common.scaleW;
+ }
+
+ public int getTextureHeight() {
+ return _common.scaleH;
+ }
+
+ /**
+ * @param chr
+ * ascii character code
+ * @return character descriptor for chr. If character is not in the char set, return '?' (if '?' is not in the char
+ * set, return will be null)
+ */
+ public BMFont.Char getChar(int chr) {
+ BMFont.Char retVal = _charMap.get(chr);
+ if (retVal == null) {
+ chr = '?';
+ retVal = _charMap.get(chr);
+ if (retVal == null) { // if still null, use the first char
+ final Iterator<Char> it = _charMap.values().iterator();
+ retVal = it.next();
+ }
+ }
+ return retVal;
+ }
+
+ /**
+ * @return kerning information for this character pair
+ */
+ public int getKerning(final int chr, final int nextChr) {
+ final Map<Integer, Integer> map = _kernMap.get(chr);
+ if (map != null) {
+ final Integer amt = map.get(nextChr);
+ if (amt != null) {
+ return amt;
+ }
+ }
+ return 0;
+ }
+
+ /**
+ * @return the largest xadvance in this char set
+ */
+ public int getMaxCharAdvance() {
+ return _maxCharAdv;
+ }
+
+ public int getOutlineWidth() {
+ return _info.outline;
+ }
+
+ public Info getInfo() {
+ return _info;
+ }
+
+ /**
+ * Writes the XML for this font out to the OutputStream provided.
+ *
+ * @param outputStream
+ * the OutputStream to which the XML for this font will be written to
+ * @throws IOException
+ * thrown if there is any problem writing out to the OutputStream
+ */
+ public void writeXML(final OutputStream outputStream) throws IOException {
+ final StringBuilder xml = new StringBuilder();
+
+ xml.append("<?xml version=\"1.0\"?>\n");
+ xml.append("<font>\n");
+ xml.append(generateInfoXML());
+ xml.append(generateCommonXML());
+ xml.append(generatePagesXML());
+ xml.append(generateCharsXML());
+ xml.append(generateKerningsXML());
+ xml.append("</font>");
+
+ // Write out to the output stream now
+ outputStream.write(xml.toString().getBytes());
+ outputStream.flush();
+
+ return;
+ }
+
+ private String generateInfoXML() {
+ final StringBuilder xml = new StringBuilder();
+
+ xml.append(" <info face=\"");
+ xml.append(_info.face);
+ xml.append("\" size=\"");
+ xml.append(_info.size);
+ xml.append("\" bold=\"");
+ xml.append(_info.bold ? "1" : "0");
+ xml.append("\" italic=\"");
+ xml.append(_info.italic ? "1" : "0");
+ xml.append("\" charset=\"");
+ xml.append(_info.charset);
+ xml.append("\" unicode=\"");
+ xml.append(_info.unicode ? "1" : "0");
+ xml.append("\" stretchH=\"");
+ xml.append(_info.stretchH);
+ xml.append("\" smooth=\"");
+ xml.append(_info.smooth ? "1" : "0");
+ xml.append("\" aa=\"");
+ xml.append(_info.aa ? "1" : "0");
+ xml.append("\" padding=\"");
+
+ for (int i = 0; i < _info.padding.length; i++) {
+ xml.append(_info.padding[i]);
+
+ if (i < (_info.padding.length - 1)) {
+ xml.append(',');
+ }
+ }
+
+ xml.append("\" spacing=\"");
+
+ for (int i = 0; i < _info.spacing.length; i++) {
+ xml.append(_info.spacing[i]);
+
+ if (i < (_info.spacing.length - 1)) {
+ xml.append(',');
+ }
+ }
+
+ xml.append("\" outline=\"");
+ xml.append(_info.outline);
+ xml.append("\"/>\n");
+
+ return xml.toString();
+ }
+
+ private String generateCommonXML() {
+ final StringBuilder xml = new StringBuilder();
+
+ xml.append(" <common lineHeight=\"");
+ xml.append(_common.lineHeight);
+ xml.append("\" base=\"");
+ xml.append(_common.base);
+ xml.append("\" scaleW=\"");
+ xml.append(_common.scaleW);
+ xml.append("\" scaleH=\"");
+ xml.append(_common.scaleH);
+ xml.append("\" pages=\"");
+ xml.append(_common.pages);
+ xml.append("\" packed=\"");
+ xml.append(_common.packed ? "1" : "0");
+ xml.append("\" alphaChnl=\"");
+ xml.append(_common.alphaChnl);
+ xml.append("\" redChnl=\"");
+ xml.append(_common.redChnl);
+ xml.append("\" greenChnl=\"");
+ xml.append(_common.greenChnl);
+ xml.append("\" blueChnl=\"");
+ xml.append(_common.blueChnl);
+ xml.append("\"/>\n");
+
+ return xml.toString();
+ }
+
+ private String generatePagesXML() {
+ final StringBuilder xml = new StringBuilder();
+
+ xml.append(" <pages>\n");
+
+ for (final Iterator<Page> iterator = _pages.iterator(); iterator.hasNext();) {
+ final Page page = iterator.next();
+
+ xml.append(" <page id=\"");
+ xml.append(page.id);
+ xml.append("\" file=\"");
+ xml.append(page.file);
+ xml.append("\" />\n");
+ }
+
+ xml.append(" </pages>\n");
+
+ return xml.toString();
+ }
+
+ private String generateCharsXML() {
+ final StringBuilder xml = new StringBuilder();
+
+ xml.append(" <chars count=\"");
+ xml.append(_charMap.size());
+ xml.append("\">\n");
+
+ for (final Iterator<Integer> iterator = _charMap.keySet().iterator(); iterator.hasNext();) {
+ final Integer key = iterator.next();
+ final Char character = _charMap.get(key);
+
+ xml.append(" <char id=\"");
+ xml.append(character.id);
+ xml.append("\" x=\"");
+ xml.append(character.x);
+ xml.append("\" y=\"");
+ xml.append(character.y);
+ xml.append("\" width=\"");
+ xml.append(character.width);
+ xml.append("\" height=\"");
+ xml.append(character.height);
+ xml.append("\" xoffset=\"");
+ xml.append(character.xoffset);
+ xml.append("\" yoffset=\"");
+ xml.append(character.yoffset);
+ xml.append("\" xadvance=\"");
+ xml.append(character.xadvance);
+ xml.append("\" page=\"");
+ xml.append(character.page);
+ xml.append("\" chnl=\"");
+ xml.append(character.chnl);
+ xml.append("\" />\n");
+ }
+
+ xml.append(" </chars>\n");
+
+ return xml.toString();
+ }
+
+ private String generateKerningsXML() {
+ final StringBuilder xml = new StringBuilder();
+ int count = 0;
+
+ for (final Iterator<Integer> iterator = _kernMap.keySet().iterator(); iterator.hasNext();) {
+ final Integer first = iterator.next();
+ final Map<Integer, Integer> amtHash = _kernMap.get(first);
+
+ for (final Iterator<Integer> iterator2 = amtHash.keySet().iterator(); iterator2.hasNext();) {
+ final Integer second = iterator2.next();
+ final Integer amount = amtHash.get(second);
+
+ xml.append(" <kerning first=\"");
+ xml.append(first);
+ xml.append("\" second=\"");
+ xml.append(second);
+ xml.append("\" amount=\"");
+ xml.append(amount);
+ xml.append("\" />\n");
+
+ count++;
+ }
+ }
+
+ final String xmlString = " <kernings count=\"" + count + "\">\n" + xml.toString() + " </kernings>\n";
+
+ return xmlString;
+ }
+
+ /**
+ * load the texture and create default render states. Only a single page is supported.
+ *
+ * @param fontUrl
+ */
+ // ----------------------------------------------------------
+ protected void initialize(final ResourceSource source) throws MalformedURLException {
+ _styleName = _info.face + "-" + _info.size;
+
+ if (_info.bold) {
+ _styleName += "-bold";
+ } else {
+ _styleName += "-medium";
+ }
+
+ if (_info.italic) {
+ _styleName += "-italic";
+ } else {
+ _styleName += "-regular";
+ }
+
+ // only a single page is supported
+ if (_pages.size() > 0) {
+ final Page page = _pages.get(0);
+
+ final ResourceSource texSrc = source.getRelativeSource("./" + page.file);
+
+ Texture.MinificationFilter minFilter;
+ Texture.MagnificationFilter magFilter;
+
+ magFilter = Texture.MagnificationFilter.Bilinear;
+ minFilter = Texture.MinificationFilter.BilinearNoMipMaps;
+ if (_useMipMaps) {
+ minFilter = Texture.MinificationFilter.Trilinear;
+ }
+ final TextureKey tkey = TextureKey.getKey(texSrc, false, TextureStoreFormat.GuessNoCompressedFormat,
+ minFilter);
+ _pageTexture = TextureManager.loadFromKey(tkey, null, null);
+ _pageTexture.setMagnificationFilter(magFilter);
+
+ // Add a touch higher mipmap selection.
+ _pageTexture.setLodBias(-1);
+
+ if (_useMipMaps) {
+ _pageTexture.setAnisotropicFilterPercent(1.0f);
+ }
+ }
+ }
+
+ public Texture getPageTexture() {
+ return _pageTexture;
+ }
+
+ public List<Integer> getMappedChars() {
+ return Lists.newArrayList(_charMap.keySet());
+ }
+
+ public Map<Integer, Integer> getKerningsForCharacter(final int val) {
+ return _kernMap.get(val);
+ }
+
+ public Map<Integer, Map<Integer, Integer>> getKerningMap() {
+ return _kernMap;
+ }
+
+ /**
+ *
+ * @param fontUrl
+ * @throws IOException
+ */
+ protected void parseFontFile(final ResourceSource source) throws IOException {
+ _maxCharAdv = 0;
+ _charMap.clear();
+ _pages.clear();
+ try {
+ final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ final DocumentBuilder db = dbf.newDocumentBuilder();
+ final Document doc = db.parse(source.openStream());
+
+ doc.getDocumentElement().normalize();
+ recurse(doc.getElementsByTagName("font").item(0));
+
+ // db.reset();
+ } catch (final Throwable t) {
+ final IOException ex = new IOException("Error loading font file " + source.toString());
+ ex.initCause(t);
+ throw ex;
+ }
+ }
+
+ private void recurse(final Node node) {
+ final NodeList children = node.getChildNodes();
+ for (int i = 0; i < children.getLength(); i++) {
+ final Node child = children.item(i);
+ processNode(child);
+ recurse(child);
+ }
+ }
+
+ private void processNode(final Node node) {
+ final String tagName = node.getNodeName();
+ if (tagName != null) {
+ if (tagName.equals("info")) {
+ processInfoNode(node);
+ } else if (tagName.equals("common")) {
+ processCommonNode(node);
+ } else if (tagName.equals("page")) {
+ processPageNode(node);
+ } else if (tagName.equals("char")) {
+ processCharNode(node);
+ } else if (tagName.equals("kerning")) {
+ procesKerningNode(node);
+ }
+ }
+ }
+
+ private void processInfoNode(final Node node) {
+ final NamedNodeMap attribs = node.getAttributes();
+ _info = new Info();
+ _info.face = getStringAttrib("face", attribs);
+ _info.size = getIntAttrib("size", attribs);
+ _info.bold = getBoolAttrib("bold", attribs);
+ _info.italic = getBoolAttrib("italic", attribs);
+ _info.charset = getStringAttrib("charset", attribs);
+ _info.unicode = getBoolAttrib("unicode", attribs);
+ _info.stretchH = getIntAttrib("stretchH", attribs);
+ _info.smooth = getBoolAttrib("smooth", attribs);
+ _info.aa = getBoolAttrib("aa", attribs);
+ _info.padding = getIntArrayAttrib("padding", attribs);
+ _info.spacing = getIntArrayAttrib("spacing", attribs);
+ _info.outline = getIntAttrib("outline", attribs);
+ }
+
+ private void processCommonNode(final Node node) {
+ final NamedNodeMap attribs = node.getAttributes();
+ _common = new Common();
+ _common.lineHeight = getIntAttrib("lineHeight", attribs);
+ _common.base = getIntAttrib("base", attribs);
+ _common.scaleW = getIntAttrib("scaleW", attribs);
+ _common.scaleH = getIntAttrib("scaleH", attribs);
+ _common.pages = getIntAttrib("pages", attribs);
+ _common.packed = getBoolAttrib("packed", attribs);
+ _common.alphaChnl = getIntAttrib("alphaChnl", attribs);
+ _common.redChnl = getIntAttrib("redChnl", attribs);
+ _common.greenChnl = getIntAttrib("greenChnl", attribs);
+ _common.blueChnl = getIntAttrib("blueChnl", attribs);
+ }
+
+ private void processCharNode(final Node node) {
+ final NamedNodeMap attribs = node.getAttributes();
+ final Char c = new Char();
+ c.id = getIntAttrib("id", attribs);
+ c.x = getIntAttrib("x", attribs);
+ c.y = getIntAttrib("y", attribs);
+ c.width = getIntAttrib("width", attribs);
+ c.height = getIntAttrib("height", attribs);
+ c.xoffset = getIntAttrib("xoffset", attribs);
+ c.yoffset = getIntAttrib("yoffset", attribs);
+ c.xadvance = getIntAttrib("xadvance", attribs);
+ c.page = getIntAttrib("page", attribs);
+ c.chnl = getIntAttrib("chnl", attribs);
+ _charMap.put(c.id, c);
+ if (c.xadvance > _maxCharAdv) {
+ _maxCharAdv = c.xadvance;
+ }
+ }
+
+ private void processPageNode(final Node node) {
+ final NamedNodeMap attribs = node.getAttributes();
+ final Page page = new Page();
+ page.id = getIntAttrib("id", attribs);
+ page.file = getStringAttrib("file", attribs);
+ _pages.add(page);
+ if (_pages.size() > 1) {
+ logger.warning("multiple pages defined in font description file, but only a single page is supported.");
+ }
+ }
+
+ private void procesKerningNode(final Node node) {
+ final NamedNodeMap attribs = node.getAttributes();
+ final int first = getIntAttrib("first", attribs);
+ final int second = getIntAttrib("second", attribs);
+ final int amount = getIntAttrib("amount", attribs);
+ Map<Integer, Integer> amtHash;
+ amtHash = _kernMap.get(first);
+ if (amtHash == null) {
+ amtHash = Maps.newHashMap();
+ _kernMap.put(first, amtHash);
+ }
+ amtHash.put(second, amount);
+ }
+
+ // == xml attribute getters ============================
+ int getIntAttrib(final String name, final NamedNodeMap attribs) {
+ final Node node = attribs.getNamedItem(name);
+ return Integer.parseInt(node.getNodeValue());
+ }
+
+ String getStringAttrib(final String name, final NamedNodeMap attribs) {
+ final Node node = attribs.getNamedItem(name);
+ return node.getNodeValue();
+ }
+
+ boolean getBoolAttrib(final String name, final NamedNodeMap attribs) {
+ final Node node = attribs.getNamedItem(name);
+ return (Integer.parseInt(node.getNodeValue()) == 1);
+ }
+
+ int[] getIntArrayAttrib(final String name, final NamedNodeMap attribs) {
+ final Node node = attribs.getNamedItem(name);
+ final String str = node.getNodeValue();
+ final StringTokenizer strtok = new StringTokenizer(str, ",");
+ final int sz = strtok.countTokens();
+ final int[] retVal = new int[sz];
+ for (int i = 0; i < sz; i++) {
+ retVal[i] = Integer.parseInt(strtok.nextToken());
+ }
+ return retVal;
+ }
+
+ // == support structs ==================================
+ @SavableFactory(factoryMethod = "create")
+ public static class Info implements Savable {
+ public String face;
+ public int size;
+ public boolean bold;
+ public boolean italic;
+ public String charset;
+ public boolean unicode;
+ public int stretchH;
+ public boolean smooth;
+ public boolean aa;
+ public int[] padding;
+ public int[] spacing;
+ public int outline;
+
+ public static Info create() {
+ return new Info();
+ }
+
+ @Override
+ public void write(final OutputCapsule capsule) throws IOException {
+ capsule.write(face, "face", null);
+ capsule.write(size, "size", 0);
+ capsule.write(bold, "bold", false);
+ capsule.write(italic, "italic", false);
+ capsule.write(charset, "charset", null);
+ capsule.write(unicode, "unicode", false);
+ capsule.write(stretchH, "stretchH", 0);
+ capsule.write(smooth, "smooth", false);
+ capsule.write(aa, "aa", false);
+ capsule.write(padding, "padding", null);
+ capsule.write(spacing, "spacing", null);
+ capsule.write(outline, "outline", 0);
+ }
+
+ @Override
+ public void read(final InputCapsule capsule) throws IOException {
+ face = capsule.readString("face", null);
+ size = capsule.readInt("size", 0);
+ bold = capsule.readBoolean("bold", false);
+ italic = capsule.readBoolean("italic", false);
+ charset = capsule.readString("charset", null);
+ unicode = capsule.readBoolean("unicode", false);
+ stretchH = capsule.readInt("stretchH", 0);
+ smooth = capsule.readBoolean("smooth", false);
+ aa = capsule.readBoolean("aa", false);
+ padding = capsule.readIntArray("padding", null);
+ spacing = capsule.readIntArray("spacing", null);
+ outline = capsule.readInt("outline", 0);
+ }
+
+ @Override
+ public Class<?> getClassTag() {
+ return getClass();
+ }
+ }
+
+ @SavableFactory(factoryMethod = "create")
+ public static class Common implements Savable {
+ public int lineHeight;
+ public int base;
+ public int scaleW;
+ public int scaleH;
+ public int pages;
+ public boolean packed;
+ public int alphaChnl;
+ public int redChnl;
+ public int greenChnl;
+ public int blueChnl;
+
+ public static Common create() {
+ return new Common();
+ }
+
+ @Override
+ public void write(final OutputCapsule capsule) throws IOException {
+ capsule.write(lineHeight, "lineHeight", 0);
+ capsule.write(base, "base", 0);
+ capsule.write(scaleW, "scaleW", 1);
+ capsule.write(scaleH, "scaleH", 1);
+ capsule.write(pages, "pages", 0);
+ capsule.write(packed, "packed", false);
+ capsule.write(alphaChnl, "alphaChnl", 0);
+ capsule.write(redChnl, "redChnl", 0);
+ capsule.write(greenChnl, "greenChnl", 0);
+ capsule.write(blueChnl, "blueChnl", 0);
+ }
+
+ @Override
+ public void read(final InputCapsule capsule) throws IOException {
+ lineHeight = capsule.readInt("lineHeight", 0);
+ base = capsule.readInt("base", 0);
+ scaleW = capsule.readInt("scaleW", 0);
+ scaleH = capsule.readInt("scaleH", 0);
+ pages = capsule.readInt("pages", 0);
+ packed = capsule.readBoolean("packed", false);
+ alphaChnl = capsule.readInt("alphaChnl", 0);
+ redChnl = capsule.readInt("redChnl", 0);
+ greenChnl = capsule.readInt("greenChnl", 0);
+ blueChnl = capsule.readInt("blueChnl", 0);
+ }
+
+ @Override
+ public Class<?> getClassTag() {
+ return getClass();
+ }
+ }
+
+ @SavableFactory(factoryMethod = "create")
+ public static class Page implements Savable {
+ public int id;
+ public String file;
+
+ public static Page create() {
+ return new Page();
+ }
+
+ @Override
+ public void write(final OutputCapsule capsule) throws IOException {
+ capsule.write(id, "id", 0);
+ capsule.write(file, "file", null);
+ }
+
+ @Override
+ public void read(final InputCapsule capsule) throws IOException {
+ id = capsule.readInt("id", 0);
+ file = capsule.readString("file", null);
+
+ }
+
+ @Override
+ public Class<?> getClassTag() {
+ return this.getClass();
+ }
+ }
+
+ @SavableFactory(factoryMethod = "create")
+ public static class Char implements Savable {
+ public int id;
+ public int x;
+ public int y;
+ public int width;
+ public int height;
+ public int xoffset;
+ public int yoffset;
+ public int xadvance;
+ public int page;
+ public int chnl;
+
+ public static Char create() {
+ return new Char();
+ }
+
+ @Override
+ public void write(final OutputCapsule capsule) throws IOException {
+ capsule.write(id, "id", 0);
+ capsule.write(x, "x", 0);
+ capsule.write(y, "y", 0);
+ capsule.write(width, "width", 0);
+ capsule.write(height, "height", 0);
+ capsule.write(xoffset, "xoffset", 0);
+ capsule.write(yoffset, "yoffset", 0);
+ capsule.write(xadvance, "xadvance", 0);
+ capsule.write(page, "page", 0);
+ capsule.write(chnl, "chnl", 0);
+ }
+
+ @Override
+ public void read(final InputCapsule capsule) throws IOException {
+ id = capsule.readInt("id", 0);
+ x = capsule.readInt("x", 0);
+ y = capsule.readInt("y", 0);
+ width = capsule.readInt("width", 0);
+ height = capsule.readInt("height", 0);
+ xoffset = capsule.readInt("xoffset", 0);
+ yoffset = capsule.readInt("yoffset", 0);
+ xadvance = capsule.readInt("xadvance", 0);
+ page = capsule.readInt("page", 0);
+ chnl = capsule.readInt("chnl", 0);
+ }
+
+ @Override
+ public Class<?> getClassTag() {
+ return getClass();
+ }
+ }
+
+ @SavableFactory(factoryMethod = "create")
+ public static class Kerning implements Savable {
+ public int first;
+ public int second;
+ public int amount;
+
+ public Kerning() {}
+
+ public Kerning(final int first, final int second, final int amount) {
+ this.first = first;
+ this.second = second;
+ this.amount = amount;
+ }
+
+ public static Kerning create() {
+ return new BMFont.Kerning();
+ }
+
+ @Override
+ public void write(final OutputCapsule capsule) throws IOException {
+ capsule.write(first, "fist", 0);
+ capsule.write(second, "second", 0);
+ capsule.write(amount, "amount", 0);
+ }
+
+ @Override
+ public void read(final InputCapsule capsule) throws IOException {
+ first = capsule.readInt("first", 0);
+ second = capsule.readInt("second", 0);
+ amount = capsule.readInt("amount", 0);
+ }
+
+ @Override
+ public Class<?> getClassTag() {
+ return getClass();
+ }
+ }
+
+ /**
+ * utility to set default render states for text
+ */
+ public class RenderStateSetter {
+ public TextureState textureState;
+ public BlendState blendState;
+ public ZBufferState zBuffState;
+
+ float _blendDisabledTestRef = 0.3f;
+ float _blendEnabledTestRef = 0.02f;
+
+ boolean _useBlend;
+
+ RenderStateSetter(final Texture texture, final boolean useBlend) {
+ textureState = new TextureState();
+ textureState.setTexture(texture);
+
+ blendState = new BlendState();
+ blendState.setSourceFunction(BlendState.SourceFunction.SourceAlpha);
+ blendState.setDestinationFunction(BlendState.DestinationFunction.OneMinusSourceAlpha);
+ blendState.setTestEnabled(true);
+ blendState.setTestFunction(BlendState.TestFunction.GreaterThan);
+
+ zBuffState = new ZBufferState();
+ zBuffState.setFunction(ZBufferState.TestFunction.LessThanOrEqualTo);
+
+ setUseBlend(useBlend);
+ }
+
+ void applyTo(final Spatial spatial) {
+ spatial.setRenderState(textureState);
+ spatial.setRenderState(blendState);
+ spatial.setRenderState(zBuffState);
+ if (_useBlend) {
+ spatial.getSceneHints().setRenderBucketType(RenderBucketType.Transparent);
+ } else {
+ spatial.getSceneHints().setRenderBucketType(RenderBucketType.Opaque);
+ }
+ }
+
+ void setUseBlend(final boolean blend) {
+ _useBlend = blend;
+ if (!_useBlend) {
+ blendState.setBlendEnabled(false);
+ blendState.setReference(_blendDisabledTestRef);
+ zBuffState.setWritable(true);
+ } else {
+ blendState.setBlendEnabled(true);
+ blendState.setReference(_blendEnabledTestRef);
+ zBuffState.setWritable(false);
+ }
+ }
+ }
+
+ @Override
+ public void write(final OutputCapsule capsule) throws IOException {
+ _pageTexture.setStoreImage(true);
+ capsule.write(_useMipMaps, "useMipMaps", false);
+ capsule.write(_styleName, "styleName", null);
+ capsule.write(_pageTexture, "pageTexture", null);
+
+ // Info
+ capsule.write(_info, "info", null);
+ // Common
+ capsule.write(_common, "common", null);
+ // Pages
+ capsule.writeSavableList(_pages, "pages", _pages);
+ // Chars
+ capsule.writeSavableList(new ArrayList<Char>(_charMap.values()), "charMap", null);
+
+ // Kernings
+ final List<Kerning> kernings = new ArrayList<Kerning>();
+ for (final Iterator<Integer> iterator = _kernMap.keySet().iterator(); iterator.hasNext();) {
+ final Integer first = iterator.next();
+ final Map<Integer, Integer> amtHash = _kernMap.get(first);
+ for (final Iterator<Integer> iterator2 = amtHash.keySet().iterator(); iterator2.hasNext();) {
+ final Integer second = iterator2.next();
+ final Integer amount = amtHash.get(second);
+ kernings.add(new Kerning(first, second, amount));
+ }
+ }
+ capsule.writeSavableList(kernings, "kernings", kernings);
+ }
+
+ @Override
+ public void read(final InputCapsule capsule) throws IOException {
+ _useMipMaps = capsule.readBoolean("useMipMaps", false);
+ _styleName = capsule.readString("styleName", null);
+ _pageTexture = (Texture) capsule.readSavable("pageTexture", null);
+ _pageTexture = TextureManager.loadFromImage(_pageTexture.getImage(), _pageTexture.getMinificationFilter());
+
+ // Info
+ _info = (Info) capsule.readSavable("info", _info);
+ // Common
+ _common = (Common) capsule.readSavable("common", _common);
+ // Pages
+ _pages.clear();
+ final List<Savable> pages = capsule.readSavableList("pages", new ArrayList<Savable>());
+ for (final Savable savable : pages) {
+ _pages.add((Page) savable);
+ if (_pages.size() > 1) {
+ logger.warning("multiple pages defined in font description file, but only a single page is supported.");
+ }
+ }
+ // Chars
+ _charMap.clear();
+ final List<Savable> chars = capsule.readSavableList("charMap", new ArrayList<Savable>());
+ for (final Savable savable : chars) {
+ final Char c = (Char) savable;
+ _charMap.put(c.id, c);
+ if (c.xadvance > _maxCharAdv) {
+ _maxCharAdv = c.xadvance;
+ }
+ }
+ // Kernings
+ _kernMap.clear();
+ final List<Savable> kernings = capsule.readSavableList("kernings", new ArrayList<Savable>());
+ for (final Savable savable : kernings) {
+ final Kerning k = (Kerning) savable;
+ Map<Integer, Integer> amtHash;
+ amtHash = _kernMap.get(k.first);
+ if (amtHash == null) {
+ amtHash = Maps.newHashMap();
+ _kernMap.put(k.first, amtHash);
+ }
+ amtHash.put(k.second, k.amount);
+ _kernMap.put(k.first, amtHash);
+ }
+ }
+
+ @Override
+ public Class<?> getClassTag() {
+ return getClass();
+ }
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/ui/text/BMText.java b/ardor3d-core/src/main/java/com/ardor3d/ui/text/BMText.java
index c305c45..c270948 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/ui/text/BMText.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/ui/text/BMText.java
@@ -1,761 +1,761 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.ui.text;
-
-import java.nio.FloatBuffer;
-
-import com.ardor3d.annotation.SavableFactory;
-import com.ardor3d.math.ColorRGBA;
-import com.ardor3d.math.Matrix3;
-import com.ardor3d.math.Vector2;
-import com.ardor3d.math.Vector3;
-import com.ardor3d.math.type.ReadOnlyColorRGBA;
-import com.ardor3d.math.type.ReadOnlyVector2;
-import com.ardor3d.renderer.Camera;
-import com.ardor3d.renderer.Camera.ProjectionMode;
-import com.ardor3d.renderer.IndexMode;
-import com.ardor3d.renderer.Renderer;
-import com.ardor3d.scenegraph.Mesh;
-import com.ardor3d.scenegraph.hint.CullHint;
-import com.ardor3d.scenegraph.hint.LightCombineMode;
-import com.ardor3d.scenegraph.hint.TextureCombineMode;
-import com.ardor3d.util.geom.BufferUtils;
-
-/**
- * Text spatial which uses textures generated by BMFont
- */
-@SavableFactory(factoryMethod = "initSavable")
-public class BMText extends Mesh {
- protected BMFont _font;
-
- protected String _textString;
- private final int _tabSize = 4;
-
- protected double _fontScale = 1.0;
- protected boolean _autoRotate = true;
-
- protected int _lines = 1;
-
- protected final Vector2 _size = new Vector2(); // width and height of text string
- protected float[] _lineWidths = new float[64]; // size of each line of text
-
- protected ColorRGBA _textClr = new ColorRGBA(1, 1, 1, 1);
- protected ColorRGBA _tempClr = new ColorRGBA(1, 1, 1, 1);
-
- public enum AutoScale {
- /**
- * No auto scaling
- */
- Off,
-
- /**
- * Maintain native point size of font regardless of distance from camera
- */
- FixedScreenSize,
-
- /**
- * Do not auto scale if font screen size is smaller than native point size, otherwise maintain native point
- * size.
- */
- CapScreenSize;
- }
-
- protected AutoScale _autoScale = AutoScale.CapScreenSize;
-
- /**
- * @see BMText#setAutoFadeDistanceRange(double, double)
- * @see BMText#setAutoFadeFixedPixelSize(int)
- * @see BMText#setAutoFadeFalloff(float)
- */
- public enum AutoFade {
- /**
- * No auto fade.
- */
- Off,
-
- /**
- * Fade based on a fixed distance between text and camera.
- */
- DistanceRange,
-
- /**
- * Fade when screen size is less than fixed pixel size.
- */
- FixedPixelSize,
-
- /**
- * Fade when screen size is less than native size. Equivalent to FixedPixelSize +
- * setAutoFadeFixedPixelSize(font.getSize()).
- */
- CapScreenSize;
- }
-
- protected AutoFade _autoFade = AutoFade.FixedPixelSize;
- protected int _fixedPixelAlphaThresh = 14;
- protected float _screenSizeAlphaFalloff = 0.7f; // 0=instant, 1=half size
- protected final Vector2 _distanceAlphaRange = new Vector2(50, 75);
- protected boolean _useBlend;
-
- /**
- * Justification within a text block
- */
- public enum Justify {
- Left, Center, Right;
- }
-
- protected Justify _justify;
- protected int _spacing = 0; // additional spacing between characters
-
- /**
- * Alignment of the text block from the pivot point
- */
- public enum Align {
- North(-0.5f, 0.0f), NorthWest(0.0f, 0.0f), NorthEast(-1.0f, 0.0f), Center(-0.5f, -0.5f), West(0.0f, -0.5f), East(
- -1.0f, -0.5f), South(-0.5f, -1.0f), SouthWest(0.0f, -1.0f), SouthEast(-1.0f, -1.0f);
- public final float horizontal;
- public final float vertical;
-
- private Align(final float h, final float v) {
- horizontal = h;
- vertical = v;
- }
- }
-
- protected Align _align;
- protected final Vector2 _alignOffset = new Vector2();
- protected final Vector2 _fixedOffset = new Vector2();
-
- protected final Vector3 _look = new Vector3();
- protected final Vector3 _left = new Vector3();
- protected final Matrix3 _rot = new Matrix3();
-
- public static BMText initSavable() {
- return new BMText();
- }
-
- protected BMText() {}
-
- /**
- *
- * @param sName
- * @param text
- * @param font
- */
- public BMText(final String sName, final String text, final BMFont font) {
- this(sName, text, font, Align.SouthWest);
- }
-
- public BMText(final String sName, final String text, final BMFont font, final Align align) {
- this(sName, text, font, align, Justify.Left);
- }
-
- public BMText(final String sName, final String text, final BMFont font, final Align align, final Justify justify) {
- this(sName, text, font, align, justify, true);
- }
-
- /**
- *
- * @param sName
- * spatial name
- * @param text
- * text to render.
- * @param font
- * @param align
- * @param justify
- * @param useBlend
- * if true: use alpha blending and use transparent render bucket, else if false: alpha test only and use
- * opaque render bucket
- */
- public BMText(final String sName, final String text, final BMFont font, final Align align, final Justify justify,
- final boolean useBlend) {
- super(sName);
- _font = font;
- _align = align;
- _justify = justify;
- _spacing = 0;
- _useBlend = useBlend;
- if (_font.getOutlineWidth() > 1) {
- _spacing = _font.getOutlineWidth() - 1;
- }
-
- // -- never cull
- setModelBound(null);
- getSceneHints().setCullHint(CullHint.Never);
-
- // -- default to non-pickable
- getSceneHints().setAllPickingHints(false);
-
- // no light, basic texture
- getSceneHints().setLightCombineMode(LightCombineMode.Off);
- getSceneHints().setTextureCombineMode(TextureCombineMode.Replace);
-
- // triangles
- getMeshData().setIndexMode(IndexMode.Triangles);
-
- setText(text);
-
- _font.applyRenderStatesTo(this, useBlend);
- }
-
- public void setTextColor(final ReadOnlyColorRGBA clr) {
- _textClr.set(clr);
- setDefaultColor(_textClr);
- }
-
- public void setTextColor(final float r, final float g, final float b, final float a) {
- _textClr.set(r, g, b, a);
- setDefaultColor(_textClr);
- }
-
- /**
- * If AutoScale is enabled, this scale parameter acts as a bias. Setting the scale to 0.95 will sharpen the font and
- * increase readability a bit if you're using a bilinear min filter on the texture. When AutoScale is disabled, this
- * scales the font to world units, e.g. setScale(1) would make the font characters approximately 1 world unit in
- * size, regardless of the font point size.
- */
- public void setFontScale(final double scale) {
- _fontScale = scale;
-
- if (_autoScale == AutoScale.Off) {
- final double unit = 1.0 / _font.getSize();
- final double s = unit * _fontScale;
- this.setScale(s, s, -s);
- }
- }
-
- public double getFontScale() {
- return _fontScale;
- }
-
- /**
- * Set scaling policy
- */
- public void setAutoScale(final AutoScale autoScale) {
- _autoScale = autoScale;
- setFontScale(_fontScale);
- }
-
- public AutoScale getAutoScale() {
- return _autoScale;
- }
-
- public void setAutoFade(final AutoFade autoFade) {
- _autoFade = autoFade;
- }
-
- public AutoFade getAutoFade() {
- return _autoFade;
- }
-
- public void setAutoFadeFixedPixelSize(final int pixelSize) {
- _fixedPixelAlphaThresh = pixelSize;
- }
-
- public int getAutoFadeFixedPixelSize() {
- return _fixedPixelAlphaThresh;
- }
-
- /**
- * alpha falloff factor used when FixedPixelSize or CapScreenSize is used. Can be any positive value; useful range
- * is ~ 0-2
- * <ul>
- * <li>0 = transparent instantaneously
- * <li>1 = transparent when approximately 1/2 size
- * </ul>
- */
- public void setAutoFadeFalloff(final float factor) {
- _screenSizeAlphaFalloff = factor;
- }
-
- /**
- * @param nearOpaque
- * text is completely opaque when distance between camera and text is less than this value
- * @param farTransparent
- * text is completely transparent when distance between camera and text is greater than this value
- */
- public void setAutoFadeDistanceRange(final double nearOpaque, final double farTransparent) {
- _distanceAlphaRange.set(nearOpaque, farTransparent);
- }
-
- /**
- * automatically rotate test to face the camera
- */
- public void setAutoRotate(final boolean doAutoTransform) {
- _autoRotate = doAutoTransform;
- }
-
- public boolean getAutoRotate() {
- return _autoRotate;
- }
-
- @Override
- public synchronized void draw(final Renderer r) {
- if (_textString.length() > 0) {
- final Camera cam = Camera.getCurrentCamera();
-
- if (!(_autoScale == AutoScale.Off && _autoFade == AutoFade.Off)) {
- updateScaleAndAlpha(cam, r);
- }
- correctTransform(cam);
-
- super.draw(r);
- }
- }
-
- /**
- *
- * @param cam
- */
- public void correctTransform(final Camera cam) {
- updateWorldTransform(false);
-
- if (_autoRotate) {
- // Billboard rotation
- _look.set(cam.getDirection());
- _left.set(cam.getLeft()).negateLocal();
- _rot.fromAxes(_left, _look, cam.getUp());
- _worldTransform.setRotation(_rot);
- }
- _worldTransform.setScale(_localTransform.getScale());
- }
-
- /**
- * Update the text's scale
- *
- * @param cam
- */
- public void updateScaleAndAlpha(final Camera cam, final Renderer r) {
- // get our depth distance
- _look.set(cam.getLocation());
- _look.negateLocal().addLocal(_worldTransform.getTranslation());
-
- final double zDepth = cam.getDirection().dot(_look);
- if (zDepth > cam.getFrustumFar() || zDepth < cam.getFrustumNear()) {
- // it is out of the picture.
- return;
- }
-
- // calculate the height in world units of the screen at that depth
- final double heightAtZ;
- if (cam.getProjectionMode() == ProjectionMode.Parallel) {
- heightAtZ = cam.getFrustumTop();
- } else {
- heightAtZ = zDepth * cam.getFrustumTop() / cam.getFrustumNear();
- }
-
- // determine a unit/pixel ratio using height
- final double screenHeight = cam.getHeight();
- final double pixelRatio = heightAtZ / screenHeight;
-
- final double capSize = 1.0 / (_fontScale * _font.getSize());
-
- // scale value used to maintain uniform size in screen coords.
- // when depthScale > unitFont, text is far away
- final double depthScale = 2 * pixelRatio;
-
- if (_autoScale != AutoScale.Off) {
- double finalScale = depthScale;
- if (_autoScale == AutoScale.CapScreenSize) {
- if (finalScale > capSize) {
- finalScale = capSize;
- }
- }
- finalScale *= _fontScale;
- setScale(finalScale, finalScale, -finalScale);
- }
-
- // -- adjust alpha -------
- switch (_autoFade) {
- case Off:
- break;
- case DistanceRange:
- distanceAlphaFade(_distanceAlphaRange, _look.length());
- break;
- case FixedPixelSize:
- screenSizeCapAlphaFade(1.0 / _fixedPixelAlphaThresh, depthScale, _screenSizeAlphaFalloff);
- break;
- case CapScreenSize:
- screenSizeCapAlphaFade(capSize, depthScale, _screenSizeAlphaFalloff);
- break;
- }
- }
-
- /**
- * Set transparency based on native screen size.
- *
- * @param capSize
- * 1/(font point size)
- * @param depthScale
- * @param alphaFallof
- */
- protected void screenSizeCapAlphaFade(final double capSize, final double depthScale, final float alphaFallof) {
- if (capSize < depthScale) {
- final float unit = (float) ((depthScale - capSize) / capSize);
- float f = alphaFallof - unit;
- f = (f < 0) ? 0 : f / alphaFallof;
- final float alpha = _textClr.getAlpha() * f;
- _tempClr.set(_textClr);
- _tempClr.setAlpha(alpha);
- setDefaultColor(_tempClr);
- } else {
- setDefaultColor(_textClr);
- }
- }
-
- /**
- * Set transparency based on distance from camera to text. if (distance < range.x) then opaque, if (distance >
- * range.y) then transparent, else lerp
- */
- protected void distanceAlphaFade(final ReadOnlyVector2 range, final double distance) {
- float alpha = 1;
- if (distance > range.getY()) {
- alpha = 0;
- } else if (distance > range.getX()) {
- final float a = (float) (distance - range.getX());
- final float r = (float) (range.getY() - range.getX());
- alpha = 1.0f - a / r;
- }
- _tempClr.set(_textClr);
- _tempClr.setAlpha(_textClr.getAlpha() * alpha);
- setDefaultColor(_tempClr);
- }
-
- /** get width in world units */
- public float getWidth() {
- return (_size.getXf() * _worldTransform.getScale().getXf());
- }
-
- /** get height in world units */
- public float getHeight() {
- return (_size.getYf() * _worldTransform.getScale().getYf());
- }
-
- protected void addToLineSizes(final float sizeX, final int lineIndex) {
- if (lineIndex >= _lineWidths.length) { // make sure array is big enough
- final float[] newLineSizes = new float[_lineWidths.length * 2];
- System.arraycopy(_lineWidths, 0, newLineSizes, 0, _lineWidths.length);
- _lineWidths = newLineSizes;
- }
- _lineWidths[lineIndex] = sizeX;
- }
-
- /**
- */
- protected void calculateSize(final String text) {
- _size.set(0, 0);
-
- BMFont.Char chr;
- float cursorX = 0;
- float cursorY = 0;
- final float lineHeight = _font.getLineHeight();
- _lines = 0;
-
- _lineWidths[0] = 0;
- final int strLen = _textString.length();
- for (int i = 0; i < strLen; i++) {
- final int charVal = _textString.charAt(i);
- if (charVal == '\n') { // newline special case
-
- addToLineSizes(cursorX, _lines);
- _lines++;
- if (cursorX > _size.getX()) {
- _size.setX(cursorX);
- }
- cursorX = 0;
- cursorY = _lines * lineHeight;
- } else if (charVal == '\t') { // tab special case
- final float tabStop = _tabSize * _font.getMaxCharAdvance();
- final float stops = 1 + (float) Math.floor(cursorX / tabStop);
- cursorX = stops * tabStop;
- } else { // normal character
- chr = _font.getChar(charVal);
- int nextVal = 0;
- if (i < strLen - 1) {
- nextVal = _textString.charAt(i + 1);
- }
- final int kern = _font.getKerning(charVal, nextVal);
- cursorX += chr.xadvance + kern + _spacing;
- }
- }
- addToLineSizes(cursorX, _lines);
- if (cursorX > _size.getX()) {
- _size.setX(cursorX);
- }
-
- _size.setY(cursorY + lineHeight);
- _lines++;
- }
-
- /**
- */
- protected void calculateAlignmentOffset() {
- _alignOffset.set(0, 0);
- if (_align != null) {
- _alignOffset.setX(_size.getX() * _align.horizontal);
- _alignOffset.setY(_size.getY() * _align.vertical);
- }
- }
-
- /**
- * Check whether buffers have sufficient capacity to hold current string values; if not, increase capacity and set
- * the limit.
- *
- * @param text
- */
- protected void checkBuffers(final String text) {
- final int chunkSize = 20;
- final int vertices = 6 * text.length();
- final int chunks = 1 + (vertices / chunkSize);
- final int required = chunks * chunkSize;
- FloatBuffer vertexBuffer = getMeshData().getVertexBuffer();
- FloatBuffer texCrdBuffer = getMeshData().getTextureBuffer(0);
- if (vertexBuffer == null || vertexBuffer.capacity() < required * 3) {
- vertexBuffer = BufferUtils.createVector3Buffer(required);
- texCrdBuffer = BufferUtils.createVector2Buffer(required);
- getMeshData().setVertexBuffer(vertexBuffer);
- getMeshData().setTextureBuffer(texCrdBuffer, 0);
- }
- vertexBuffer.limit(vertices * 3).rewind();
- texCrdBuffer.limit(vertices * 2).rewind();
- }
-
- protected float getJustificationXOffset(final int lineIndex) {
- float cursorX = 0;
- switch (_justify) {
- case Left:
- cursorX = 0;
- break;
- case Center:
- cursorX = 0.5f * (_size.getXf() - _lineWidths[lineIndex]);
- break;
- case Right:
- cursorX = _size.getXf() - _lineWidths[lineIndex];
- break;
- }
- return cursorX;
- }
-
- public BMFont getFont() {
- return _font;
- }
-
- public void setFont(final BMFont font) {
- _font = font;
- _font.applyRenderStatesTo(this, _useBlend);
- setFontScale(_fontScale);
- setText(_textString);
- }
-
- /**
- * @param useBlend
- * if true: use alpha blending and use transparent render bucket, else if false: alpha test only and use
- * opaque render bucket
- */
- public void setUseBlend(final boolean useBlend) {
- _useBlend = useBlend;
- _font.applyRenderStatesTo(this, _useBlend);
- }
-
- public boolean getUseBlend() {
- return _useBlend;
- }
-
- /**
- * Set text string and recreate geometry
- */
- public synchronized void setText(final String text) {
- if (text == null) {
- _textString = "";
- } else {
- _textString = text;
- }
-
- checkBuffers(_textString);
- calculateSize(_textString);
- calculateAlignmentOffset();
-
- final FloatBuffer vertices = getMeshData().getVertexBuffer();
- final FloatBuffer texCrds = getMeshData().getTextureBuffer(0);
-
- BMFont.Char chr;
- final float txW = _font.getTextureWidth();
- final float txH = _font.getTextureHeight();
-
- int lineIndex = 0;
- float cursorX = getJustificationXOffset(lineIndex);
- float cursorY = 0;
- final float lineHeight = _font.getLineHeight();
- float t, b, l, r;
-
- float alignX = _size.getXf() * _align.horizontal;
- float alignY = _size.getYf() * _align.vertical;
- alignX = Math.round(alignX);
- alignY = Math.round(alignY);
- alignX += _fixedOffset.getX();
- alignY += _fixedOffset.getY();
-
- final int strLen = _textString.length();
- for (int i = 0; i < strLen; i++) {
- final int charVal = _textString.charAt(i);
-
- if (charVal == '\n') { // newline special case
- lineIndex++;
- cursorX = getJustificationXOffset(lineIndex);
- cursorY += lineHeight;
- addEmptyCharacter(vertices, texCrds);
- } else if (charVal == '\t') { // tab special case
- final float tabStop = _tabSize * _font.getMaxCharAdvance();
- final float stops = 1 + (float) Math.floor(cursorX / tabStop);
- cursorX = stops * tabStop;
- addEmptyCharacter(vertices, texCrds);
- } else { // normal character
- chr = _font.getChar(charVal);
-
- // -- vertices -----------------
- l = alignX + cursorX + chr.xoffset;
- t = alignY + cursorY + chr.yoffset;
- r = alignX + cursorX + chr.xoffset + chr.width;
- b = alignY + cursorY + chr.yoffset + chr.height;
-
- vertices.put(l).put(0).put(t); // left top
- vertices.put(l).put(0).put(b); // left bottom
- vertices.put(r).put(0).put(t); // right top
- vertices.put(r).put(0).put(t); // right top
- vertices.put(l).put(0).put(b); // left bottom
- vertices.put(r).put(0).put(b); // right bottom
-
- // -- tex coords ----------------
- l = chr.x / txW;
- t = chr.y / txH;
- r = (chr.x + chr.width) / txW;
- b = (chr.y + chr.height) / txH;
-
- texCrds.put(l).put(t); // left top
- texCrds.put(l).put(b); // left bottom
- texCrds.put(r).put(t); // right top
- texCrds.put(r).put(t); // right top
- texCrds.put(l).put(b); // left bottom
- texCrds.put(r).put(b); // right bottom
-
- int nextVal = 0;
- if (i < strLen - 1) {
- nextVal = _textString.charAt(i + 1);
- }
- final int kern = _font.getKerning(charVal, nextVal);
- cursorX += chr.xadvance + kern + _spacing;
- }
- }
- _meshData.setVertexBuffer(vertices);
- _meshData.setTextureBuffer(texCrds, 0);
- _meshData.setIndices(null);
- }
-
- // this is inefficient yet incredibly convenient
- // used for tab and newline
- private void addEmptyCharacter(final FloatBuffer vertices, final FloatBuffer uvs) {
- vertices.put(0).put(0).put(0);
- vertices.put(0).put(0).put(0);
- vertices.put(0).put(0).put(0);
- vertices.put(0).put(0).put(0);
- vertices.put(0).put(0).put(0);
- vertices.put(0).put(0).put(0);
- uvs.put(0).put(0);
- uvs.put(0).put(0);
- uvs.put(0).put(0);
- uvs.put(0).put(0);
- uvs.put(0).put(0);
- uvs.put(0).put(0);
- }
-
- public synchronized String getText() {
- return _textString;
- }
-
- /**
- * @param align
- */
- public void setAlign(final Align align) {
- _align = align;
- setText(_textString);
- }
-
- public Align getAlign() {
- return _align;
- }
-
- public void setJustify(final Justify justify) {
- _justify = justify;
- setText(_textString);
- }
-
- public Justify getJustify() {
- return _justify;
- }
-
- /**
- * set a fixed offset from the alignment center of rotation IN FONT UNITS
- */
- public void setFixedOffset(double x, double y) {
- x *= _font.getSize();
- y *= _font.getSize();
- _fixedOffset.set(x, y);
- setText(_textString);
- }
-
- /**
- * set a fixed offset from the alignment center of rotation IN FONT UNITS
- */
- public void setFixedOffset(final Vector2 offset) {
- final double x = offset.getX() * _font.getSize();
- final double y = offset.getY() * _font.getSize();
- _fixedOffset.set(x, y);
- setText(_textString);
- }
-
- public int getLineCount() {
- return _lines;
- }
-
- @Override
- public BMText makeCopy(final boolean shareGeometricData) {
- final BMText text = (BMText) super.makeCopy(shareGeometricData);
-
- // copy our text properties
- text._font = _font;
- text._textString = _textString;
- text._fontScale = _fontScale;
- text._autoRotate = _autoRotate;
- text._lines = _lines;
- text._size.set(_size);
- System.arraycopy(_lineWidths, 0, text._lineWidths, 0, _lineWidths.length);
-
- text._textClr.set(_textClr);
- text._tempClr.set(_tempClr);
-
- text._autoScale = _autoScale;
- text._autoFade = _autoFade;
-
- text._fixedPixelAlphaThresh = _fixedPixelAlphaThresh;
- text._screenSizeAlphaFalloff = _screenSizeAlphaFalloff;
- text._distanceAlphaRange.set(_distanceAlphaRange);
- text._useBlend = _useBlend;
-
- text._justify = _justify;
- text._spacing = _spacing;
-
- text._align = _align;
- text._alignOffset.set(_alignOffset);
- text._fixedOffset.set(_fixedOffset);
-
- // return
- return text;
- }
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.ui.text;
+
+import java.nio.FloatBuffer;
+
+import com.ardor3d.annotation.SavableFactory;
+import com.ardor3d.math.ColorRGBA;
+import com.ardor3d.math.Matrix3;
+import com.ardor3d.math.Vector2;
+import com.ardor3d.math.Vector3;
+import com.ardor3d.math.type.ReadOnlyColorRGBA;
+import com.ardor3d.math.type.ReadOnlyVector2;
+import com.ardor3d.renderer.Camera;
+import com.ardor3d.renderer.Camera.ProjectionMode;
+import com.ardor3d.renderer.IndexMode;
+import com.ardor3d.renderer.Renderer;
+import com.ardor3d.scenegraph.Mesh;
+import com.ardor3d.scenegraph.hint.CullHint;
+import com.ardor3d.scenegraph.hint.LightCombineMode;
+import com.ardor3d.scenegraph.hint.TextureCombineMode;
+import com.ardor3d.util.geom.BufferUtils;
+
+/**
+ * Text spatial which uses textures generated by BMFont
+ */
+@SavableFactory(factoryMethod = "initSavable")
+public class BMText extends Mesh {
+ protected BMFont _font;
+
+ protected String _textString;
+ private final int _tabSize = 4;
+
+ protected double _fontScale = 1.0;
+ protected boolean _autoRotate = true;
+
+ protected int _lines = 1;
+
+ protected final Vector2 _size = new Vector2(); // width and height of text string
+ protected float[] _lineWidths = new float[64]; // size of each line of text
+
+ protected ColorRGBA _textClr = new ColorRGBA(1, 1, 1, 1);
+ protected ColorRGBA _tempClr = new ColorRGBA(1, 1, 1, 1);
+
+ public enum AutoScale {
+ /**
+ * No auto scaling
+ */
+ Off,
+
+ /**
+ * Maintain native point size of font regardless of distance from camera
+ */
+ FixedScreenSize,
+
+ /**
+ * Do not auto scale if font screen size is smaller than native point size, otherwise maintain native point
+ * size.
+ */
+ CapScreenSize;
+ }
+
+ protected AutoScale _autoScale = AutoScale.CapScreenSize;
+
+ /**
+ * @see BMText#setAutoFadeDistanceRange(double, double)
+ * @see BMText#setAutoFadeFixedPixelSize(int)
+ * @see BMText#setAutoFadeFalloff(float)
+ */
+ public enum AutoFade {
+ /**
+ * No auto fade.
+ */
+ Off,
+
+ /**
+ * Fade based on a fixed distance between text and camera.
+ */
+ DistanceRange,
+
+ /**
+ * Fade when screen size is less than fixed pixel size.
+ */
+ FixedPixelSize,
+
+ /**
+ * Fade when screen size is less than native size. Equivalent to FixedPixelSize +
+ * setAutoFadeFixedPixelSize(font.getSize()).
+ */
+ CapScreenSize;
+ }
+
+ protected AutoFade _autoFade = AutoFade.FixedPixelSize;
+ protected int _fixedPixelAlphaThresh = 14;
+ protected float _screenSizeAlphaFalloff = 0.7f; // 0=instant, 1=half size
+ protected final Vector2 _distanceAlphaRange = new Vector2(50, 75);
+ protected boolean _useBlend;
+
+ /**
+ * Justification within a text block
+ */
+ public enum Justify {
+ Left, Center, Right;
+ }
+
+ protected Justify _justify;
+ protected int _spacing = 0; // additional spacing between characters
+
+ /**
+ * Alignment of the text block from the pivot point
+ */
+ public enum Align {
+ North(-0.5f, 0.0f), NorthWest(0.0f, 0.0f), NorthEast(-1.0f, 0.0f), Center(-0.5f, -0.5f), West(0.0f, -0.5f), East(
+ -1.0f, -0.5f), South(-0.5f, -1.0f), SouthWest(0.0f, -1.0f), SouthEast(-1.0f, -1.0f);
+ public final float horizontal;
+ public final float vertical;
+
+ private Align(final float h, final float v) {
+ horizontal = h;
+ vertical = v;
+ }
+ }
+
+ protected Align _align;
+ protected final Vector2 _alignOffset = new Vector2();
+ protected final Vector2 _fixedOffset = new Vector2();
+
+ protected final Vector3 _look = new Vector3();
+ protected final Vector3 _left = new Vector3();
+ protected final Matrix3 _rot = new Matrix3();
+
+ public static BMText initSavable() {
+ return new BMText();
+ }
+
+ protected BMText() {}
+
+ /**
+ *
+ * @param sName
+ * @param text
+ * @param font
+ */
+ public BMText(final String sName, final String text, final BMFont font) {
+ this(sName, text, font, Align.SouthWest);
+ }
+
+ public BMText(final String sName, final String text, final BMFont font, final Align align) {
+ this(sName, text, font, align, Justify.Left);
+ }
+
+ public BMText(final String sName, final String text, final BMFont font, final Align align, final Justify justify) {
+ this(sName, text, font, align, justify, true);
+ }
+
+ /**
+ *
+ * @param sName
+ * spatial name
+ * @param text
+ * text to render.
+ * @param font
+ * @param align
+ * @param justify
+ * @param useBlend
+ * if true: use alpha blending and use transparent render bucket, else if false: alpha test only and use
+ * opaque render bucket
+ */
+ public BMText(final String sName, final String text, final BMFont font, final Align align, final Justify justify,
+ final boolean useBlend) {
+ super(sName);
+ _font = font;
+ _align = align;
+ _justify = justify;
+ _spacing = 0;
+ _useBlend = useBlend;
+ if (_font.getOutlineWidth() > 1) {
+ _spacing = _font.getOutlineWidth() - 1;
+ }
+
+ // -- never cull
+ setModelBound(null);
+ getSceneHints().setCullHint(CullHint.Never);
+
+ // -- default to non-pickable
+ getSceneHints().setAllPickingHints(false);
+
+ // no light, basic texture
+ getSceneHints().setLightCombineMode(LightCombineMode.Off);
+ getSceneHints().setTextureCombineMode(TextureCombineMode.Replace);
+
+ // triangles
+ getMeshData().setIndexMode(IndexMode.Triangles);
+
+ setText(text);
+
+ _font.applyRenderStatesTo(this, useBlend);
+ }
+
+ public void setTextColor(final ReadOnlyColorRGBA clr) {
+ _textClr.set(clr);
+ setDefaultColor(_textClr);
+ }
+
+ public void setTextColor(final float r, final float g, final float b, final float a) {
+ _textClr.set(r, g, b, a);
+ setDefaultColor(_textClr);
+ }
+
+ /**
+ * If AutoScale is enabled, this scale parameter acts as a bias. Setting the scale to 0.95 will sharpen the font and
+ * increase readability a bit if you're using a bilinear min filter on the texture. When AutoScale is disabled, this
+ * scales the font to world units, e.g. setScale(1) would make the font characters approximately 1 world unit in
+ * size, regardless of the font point size.
+ */
+ public void setFontScale(final double scale) {
+ _fontScale = scale;
+
+ if (_autoScale == AutoScale.Off) {
+ final double unit = 1.0 / _font.getSize();
+ final double s = unit * _fontScale;
+ this.setScale(s, s, -s);
+ }
+ }
+
+ public double getFontScale() {
+ return _fontScale;
+ }
+
+ /**
+ * Set scaling policy
+ */
+ public void setAutoScale(final AutoScale autoScale) {
+ _autoScale = autoScale;
+ setFontScale(_fontScale);
+ }
+
+ public AutoScale getAutoScale() {
+ return _autoScale;
+ }
+
+ public void setAutoFade(final AutoFade autoFade) {
+ _autoFade = autoFade;
+ }
+
+ public AutoFade getAutoFade() {
+ return _autoFade;
+ }
+
+ public void setAutoFadeFixedPixelSize(final int pixelSize) {
+ _fixedPixelAlphaThresh = pixelSize;
+ }
+
+ public int getAutoFadeFixedPixelSize() {
+ return _fixedPixelAlphaThresh;
+ }
+
+ /**
+ * alpha falloff factor used when FixedPixelSize or CapScreenSize is used. Can be any positive value; useful range
+ * is ~ 0-2
+ * <ul>
+ * <li>0 = transparent instantaneously
+ * <li>1 = transparent when approximately 1/2 size
+ * </ul>
+ */
+ public void setAutoFadeFalloff(final float factor) {
+ _screenSizeAlphaFalloff = factor;
+ }
+
+ /**
+ * @param nearOpaque
+ * text is completely opaque when distance between camera and text is less than this value
+ * @param farTransparent
+ * text is completely transparent when distance between camera and text is greater than this value
+ */
+ public void setAutoFadeDistanceRange(final double nearOpaque, final double farTransparent) {
+ _distanceAlphaRange.set(nearOpaque, farTransparent);
+ }
+
+ /**
+ * automatically rotate test to face the camera
+ */
+ public void setAutoRotate(final boolean doAutoTransform) {
+ _autoRotate = doAutoTransform;
+ }
+
+ public boolean getAutoRotate() {
+ return _autoRotate;
+ }
+
+ @Override
+ public synchronized void draw(final Renderer r) {
+ if (_textString.length() > 0) {
+ final Camera cam = Camera.getCurrentCamera();
+
+ if (!(_autoScale == AutoScale.Off && _autoFade == AutoFade.Off)) {
+ updateScaleAndAlpha(cam, r);
+ }
+ correctTransform(cam);
+
+ super.draw(r);
+ }
+ }
+
+ /**
+ *
+ * @param cam
+ */
+ public void correctTransform(final Camera cam) {
+ updateWorldTransform(false);
+
+ if (_autoRotate) {
+ // Billboard rotation
+ _look.set(cam.getDirection());
+ _left.set(cam.getLeft()).negateLocal();
+ _rot.fromAxes(_left, _look, cam.getUp());
+ _worldTransform.setRotation(_rot);
+ }
+ _worldTransform.setScale(_localTransform.getScale());
+ }
+
+ /**
+ * Update the text's scale
+ *
+ * @param cam
+ */
+ public void updateScaleAndAlpha(final Camera cam, final Renderer r) {
+ // get our depth distance
+ _look.set(cam.getLocation());
+ _look.negateLocal().addLocal(_worldTransform.getTranslation());
+
+ final double zDepth = cam.getDirection().dot(_look);
+ if (zDepth > cam.getFrustumFar() || zDepth < cam.getFrustumNear()) {
+ // it is out of the picture.
+ return;
+ }
+
+ // calculate the height in world units of the screen at that depth
+ final double heightAtZ;
+ if (cam.getProjectionMode() == ProjectionMode.Parallel) {
+ heightAtZ = cam.getFrustumTop();
+ } else {
+ heightAtZ = zDepth * cam.getFrustumTop() / cam.getFrustumNear();
+ }
+
+ // determine a unit/pixel ratio using height
+ final double screenHeight = cam.getHeight();
+ final double pixelRatio = heightAtZ / screenHeight;
+
+ final double capSize = 1.0 / (_fontScale * _font.getSize());
+
+ // scale value used to maintain uniform size in screen coords.
+ // when depthScale > unitFont, text is far away
+ final double depthScale = 2 * pixelRatio;
+
+ if (_autoScale != AutoScale.Off) {
+ double finalScale = depthScale;
+ if (_autoScale == AutoScale.CapScreenSize) {
+ if (finalScale > capSize) {
+ finalScale = capSize;
+ }
+ }
+ finalScale *= _fontScale;
+ setScale(finalScale, finalScale, -finalScale);
+ }
+
+ // -- adjust alpha -------
+ switch (_autoFade) {
+ case Off:
+ break;
+ case DistanceRange:
+ distanceAlphaFade(_distanceAlphaRange, _look.length());
+ break;
+ case FixedPixelSize:
+ screenSizeCapAlphaFade(1.0 / _fixedPixelAlphaThresh, depthScale, _screenSizeAlphaFalloff);
+ break;
+ case CapScreenSize:
+ screenSizeCapAlphaFade(capSize, depthScale, _screenSizeAlphaFalloff);
+ break;
+ }
+ }
+
+ /**
+ * Set transparency based on native screen size.
+ *
+ * @param capSize
+ * 1/(font point size)
+ * @param depthScale
+ * @param alphaFallof
+ */
+ protected void screenSizeCapAlphaFade(final double capSize, final double depthScale, final float alphaFallof) {
+ if (capSize < depthScale) {
+ final float unit = (float) ((depthScale - capSize) / capSize);
+ float f = alphaFallof - unit;
+ f = (f < 0) ? 0 : f / alphaFallof;
+ final float alpha = _textClr.getAlpha() * f;
+ _tempClr.set(_textClr);
+ _tempClr.setAlpha(alpha);
+ setDefaultColor(_tempClr);
+ } else {
+ setDefaultColor(_textClr);
+ }
+ }
+
+ /**
+ * Set transparency based on distance from camera to text. if (distance < range.x) then opaque, if (distance >
+ * range.y) then transparent, else lerp
+ */
+ protected void distanceAlphaFade(final ReadOnlyVector2 range, final double distance) {
+ float alpha = 1;
+ if (distance > range.getY()) {
+ alpha = 0;
+ } else if (distance > range.getX()) {
+ final float a = (float) (distance - range.getX());
+ final float r = (float) (range.getY() - range.getX());
+ alpha = 1.0f - a / r;
+ }
+ _tempClr.set(_textClr);
+ _tempClr.setAlpha(_textClr.getAlpha() * alpha);
+ setDefaultColor(_tempClr);
+ }
+
+ /** get width in world units */
+ public float getWidth() {
+ return (_size.getXf() * _worldTransform.getScale().getXf());
+ }
+
+ /** get height in world units */
+ public float getHeight() {
+ return (_size.getYf() * _worldTransform.getScale().getYf());
+ }
+
+ protected void addToLineSizes(final float sizeX, final int lineIndex) {
+ if (lineIndex >= _lineWidths.length) { // make sure array is big enough
+ final float[] newLineSizes = new float[_lineWidths.length * 2];
+ System.arraycopy(_lineWidths, 0, newLineSizes, 0, _lineWidths.length);
+ _lineWidths = newLineSizes;
+ }
+ _lineWidths[lineIndex] = sizeX;
+ }
+
+ /**
+ */
+ protected void calculateSize(final String text) {
+ _size.set(0, 0);
+
+ BMFont.Char chr;
+ float cursorX = 0;
+ float cursorY = 0;
+ final float lineHeight = _font.getLineHeight();
+ _lines = 0;
+
+ _lineWidths[0] = 0;
+ final int strLen = _textString.length();
+ for (int i = 0; i < strLen; i++) {
+ final int charVal = _textString.charAt(i);
+ if (charVal == '\n') { // newline special case
+
+ addToLineSizes(cursorX, _lines);
+ _lines++;
+ if (cursorX > _size.getX()) {
+ _size.setX(cursorX);
+ }
+ cursorX = 0;
+ cursorY = _lines * lineHeight;
+ } else if (charVal == '\t') { // tab special case
+ final float tabStop = _tabSize * _font.getMaxCharAdvance();
+ final float stops = 1 + (float) Math.floor(cursorX / tabStop);
+ cursorX = stops * tabStop;
+ } else { // normal character
+ chr = _font.getChar(charVal);
+ int nextVal = 0;
+ if (i < strLen - 1) {
+ nextVal = _textString.charAt(i + 1);
+ }
+ final int kern = _font.getKerning(charVal, nextVal);
+ cursorX += chr.xadvance + kern + _spacing;
+ }
+ }
+ addToLineSizes(cursorX, _lines);
+ if (cursorX > _size.getX()) {
+ _size.setX(cursorX);
+ }
+
+ _size.setY(cursorY + lineHeight);
+ _lines++;
+ }
+
+ /**
+ */
+ protected void calculateAlignmentOffset() {
+ _alignOffset.set(0, 0);
+ if (_align != null) {
+ _alignOffset.setX(_size.getX() * _align.horizontal);
+ _alignOffset.setY(_size.getY() * _align.vertical);
+ }
+ }
+
+ /**
+ * Check whether buffers have sufficient capacity to hold current string values; if not, increase capacity and set
+ * the limit.
+ *
+ * @param text
+ */
+ protected void checkBuffers(final String text) {
+ final int chunkSize = 20;
+ final int vertices = 6 * text.length();
+ final int chunks = 1 + (vertices / chunkSize);
+ final int required = chunks * chunkSize;
+ FloatBuffer vertexBuffer = getMeshData().getVertexBuffer();
+ FloatBuffer texCrdBuffer = getMeshData().getTextureBuffer(0);
+ if (vertexBuffer == null || vertexBuffer.capacity() < required * 3) {
+ vertexBuffer = BufferUtils.createVector3Buffer(required);
+ texCrdBuffer = BufferUtils.createVector2Buffer(required);
+ getMeshData().setVertexBuffer(vertexBuffer);
+ getMeshData().setTextureBuffer(texCrdBuffer, 0);
+ }
+ vertexBuffer.limit(vertices * 3).rewind();
+ texCrdBuffer.limit(vertices * 2).rewind();
+ }
+
+ protected float getJustificationXOffset(final int lineIndex) {
+ float cursorX = 0;
+ switch (_justify) {
+ case Left:
+ cursorX = 0;
+ break;
+ case Center:
+ cursorX = 0.5f * (_size.getXf() - _lineWidths[lineIndex]);
+ break;
+ case Right:
+ cursorX = _size.getXf() - _lineWidths[lineIndex];
+ break;
+ }
+ return cursorX;
+ }
+
+ public BMFont getFont() {
+ return _font;
+ }
+
+ public void setFont(final BMFont font) {
+ _font = font;
+ _font.applyRenderStatesTo(this, _useBlend);
+ setFontScale(_fontScale);
+ setText(_textString);
+ }
+
+ /**
+ * @param useBlend
+ * if true: use alpha blending and use transparent render bucket, else if false: alpha test only and use
+ * opaque render bucket
+ */
+ public void setUseBlend(final boolean useBlend) {
+ _useBlend = useBlend;
+ _font.applyRenderStatesTo(this, _useBlend);
+ }
+
+ public boolean getUseBlend() {
+ return _useBlend;
+ }
+
+ /**
+ * Set text string and recreate geometry
+ */
+ public synchronized void setText(final String text) {
+ if (text == null) {
+ _textString = "";
+ } else {
+ _textString = text;
+ }
+
+ checkBuffers(_textString);
+ calculateSize(_textString);
+ calculateAlignmentOffset();
+
+ final FloatBuffer vertices = getMeshData().getVertexBuffer();
+ final FloatBuffer texCrds = getMeshData().getTextureBuffer(0);
+
+ BMFont.Char chr;
+ final float txW = _font.getTextureWidth();
+ final float txH = _font.getTextureHeight();
+
+ int lineIndex = 0;
+ float cursorX = getJustificationXOffset(lineIndex);
+ float cursorY = 0;
+ final float lineHeight = _font.getLineHeight();
+ float t, b, l, r;
+
+ float alignX = _size.getXf() * _align.horizontal;
+ float alignY = _size.getYf() * _align.vertical;
+ alignX = Math.round(alignX);
+ alignY = Math.round(alignY);
+ alignX += _fixedOffset.getX();
+ alignY += _fixedOffset.getY();
+
+ final int strLen = _textString.length();
+ for (int i = 0; i < strLen; i++) {
+ final int charVal = _textString.charAt(i);
+
+ if (charVal == '\n') { // newline special case
+ lineIndex++;
+ cursorX = getJustificationXOffset(lineIndex);
+ cursorY += lineHeight;
+ addEmptyCharacter(vertices, texCrds);
+ } else if (charVal == '\t') { // tab special case
+ final float tabStop = _tabSize * _font.getMaxCharAdvance();
+ final float stops = 1 + (float) Math.floor(cursorX / tabStop);
+ cursorX = stops * tabStop;
+ addEmptyCharacter(vertices, texCrds);
+ } else { // normal character
+ chr = _font.getChar(charVal);
+
+ // -- vertices -----------------
+ l = alignX + cursorX + chr.xoffset;
+ t = alignY + cursorY + chr.yoffset;
+ r = alignX + cursorX + chr.xoffset + chr.width;
+ b = alignY + cursorY + chr.yoffset + chr.height;
+
+ vertices.put(l).put(0).put(t); // left top
+ vertices.put(l).put(0).put(b); // left bottom
+ vertices.put(r).put(0).put(t); // right top
+ vertices.put(r).put(0).put(t); // right top
+ vertices.put(l).put(0).put(b); // left bottom
+ vertices.put(r).put(0).put(b); // right bottom
+
+ // -- tex coords ----------------
+ l = chr.x / txW;
+ t = chr.y / txH;
+ r = (chr.x + chr.width) / txW;
+ b = (chr.y + chr.height) / txH;
+
+ texCrds.put(l).put(t); // left top
+ texCrds.put(l).put(b); // left bottom
+ texCrds.put(r).put(t); // right top
+ texCrds.put(r).put(t); // right top
+ texCrds.put(l).put(b); // left bottom
+ texCrds.put(r).put(b); // right bottom
+
+ int nextVal = 0;
+ if (i < strLen - 1) {
+ nextVal = _textString.charAt(i + 1);
+ }
+ final int kern = _font.getKerning(charVal, nextVal);
+ cursorX += chr.xadvance + kern + _spacing;
+ }
+ }
+ _meshData.setVertexBuffer(vertices);
+ _meshData.setTextureBuffer(texCrds, 0);
+ _meshData.setIndices(null);
+ }
+
+ // this is inefficient yet incredibly convenient
+ // used for tab and newline
+ private void addEmptyCharacter(final FloatBuffer vertices, final FloatBuffer uvs) {
+ vertices.put(0).put(0).put(0);
+ vertices.put(0).put(0).put(0);
+ vertices.put(0).put(0).put(0);
+ vertices.put(0).put(0).put(0);
+ vertices.put(0).put(0).put(0);
+ vertices.put(0).put(0).put(0);
+ uvs.put(0).put(0);
+ uvs.put(0).put(0);
+ uvs.put(0).put(0);
+ uvs.put(0).put(0);
+ uvs.put(0).put(0);
+ uvs.put(0).put(0);
+ }
+
+ public synchronized String getText() {
+ return _textString;
+ }
+
+ /**
+ * @param align
+ */
+ public void setAlign(final Align align) {
+ _align = align;
+ setText(_textString);
+ }
+
+ public Align getAlign() {
+ return _align;
+ }
+
+ public void setJustify(final Justify justify) {
+ _justify = justify;
+ setText(_textString);
+ }
+
+ public Justify getJustify() {
+ return _justify;
+ }
+
+ /**
+ * set a fixed offset from the alignment center of rotation IN FONT UNITS
+ */
+ public void setFixedOffset(double x, double y) {
+ x *= _font.getSize();
+ y *= _font.getSize();
+ _fixedOffset.set(x, y);
+ setText(_textString);
+ }
+
+ /**
+ * set a fixed offset from the alignment center of rotation IN FONT UNITS
+ */
+ public void setFixedOffset(final Vector2 offset) {
+ final double x = offset.getX() * _font.getSize();
+ final double y = offset.getY() * _font.getSize();
+ _fixedOffset.set(x, y);
+ setText(_textString);
+ }
+
+ public int getLineCount() {
+ return _lines;
+ }
+
+ @Override
+ public BMText makeCopy(final boolean shareGeometricData) {
+ final BMText text = (BMText) super.makeCopy(shareGeometricData);
+
+ // copy our text properties
+ text._font = _font;
+ text._textString = _textString;
+ text._fontScale = _fontScale;
+ text._autoRotate = _autoRotate;
+ text._lines = _lines;
+ text._size.set(_size);
+ System.arraycopy(_lineWidths, 0, text._lineWidths, 0, _lineWidths.length);
+
+ text._textClr.set(_textClr);
+ text._tempClr.set(_tempClr);
+
+ text._autoScale = _autoScale;
+ text._autoFade = _autoFade;
+
+ text._fixedPixelAlphaThresh = _fixedPixelAlphaThresh;
+ text._screenSizeAlphaFalloff = _screenSizeAlphaFalloff;
+ text._distanceAlphaRange.set(_distanceAlphaRange);
+ text._useBlend = _useBlend;
+
+ text._justify = _justify;
+ text._spacing = _spacing;
+
+ text._align = _align;
+ text._alignOffset.set(_alignOffset);
+ text._fixedOffset.set(_fixedOffset);
+
+ // return
+ return text;
+ }
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/util/export/xml/DOM_PrettyPrint.java b/ardor3d-core/src/main/java/com/ardor3d/util/export/xml/DOM_PrettyPrint.java
index 7aff34a..03d3818 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/util/export/xml/DOM_PrettyPrint.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/util/export/xml/DOM_PrettyPrint.java
@@ -1,26 +1,26 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.util.export.xml;
-
-import java.io.OutputStream;
-
-import org.w3c.dom.Document;
-
-/**
- * Part of the ardor3d XML IO system
- */
-public class DOM_PrettyPrint {
- public static void serialize(final Document doc, final OutputStream out) throws Exception {
- final DOMSerializer serializer = new DOMSerializer();
- serializer.setIndent(2);
- serializer.serialize(doc, out);
- }
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.util.export.xml;
+
+import java.io.OutputStream;
+
+import org.w3c.dom.Document;
+
+/**
+ * Part of the ardor3d XML IO system
+ */
+public class DOM_PrettyPrint {
+ public static void serialize(final Document doc, final OutputStream out) throws Exception {
+ final DOMSerializer serializer = new DOMSerializer();
+ serializer.setIndent(2);
+ serializer.serialize(doc, out);
+ }
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/util/geom/BufferUtils.java b/ardor3d-core/src/main/java/com/ardor3d/util/geom/BufferUtils.java
index 6017a8b..a0a3478 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/util/geom/BufferUtils.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/util/geom/BufferUtils.java
@@ -1552,6 +1552,31 @@ public final class BufferUtils {
}
/**
+ * Create a new IndexBufferData large enough to fit the contents of the given array. The specific implementation
+ * will be chosen based on the max value you need to store in your buffer. If that value is less than 2^8, a
+ * ByteBufferData is used. If it is less than 2^16, a ShortBufferData is used. Otherwise an IntBufferData is used.
+ *
+ * @param contents
+ * an array of index values to store in your newly created IndexBufferData.
+ * @param maxValue
+ * the largest value you will need to store in your buffer. Often this is equal to
+ * ("size of vertex buffer" - 1).
+ * @return the new IndexBufferData
+ */
+ public static IndexBufferData<?> createIndexBufferData(final int[] contents, final int maxValue) {
+ final IndexBufferData<?> buffer;
+ if (maxValue < 256) { // 2^8
+ buffer = createIndexBufferData(contents.length, ByteBufferData.class);
+ } else if (maxValue < 65536) { // 2^16
+ buffer = createIndexBufferData(contents.length, ShortBufferData.class);
+ } else {
+ buffer = createIndexBufferData(contents.length, IntBufferData.class);
+ }
+ buffer.put(contents);
+ return buffer;
+ }
+
+ /**
* Create a new IndexBufferData of the specified size and class.
*
* @param size
diff --git a/ardor3d-core/src/main/java/com/ardor3d/util/geom/CopyLogic.java b/ardor3d-core/src/main/java/com/ardor3d/util/geom/CopyLogic.java
index c68fa8f..f581103 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/util/geom/CopyLogic.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/util/geom/CopyLogic.java
@@ -1,22 +1,22 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.util.geom;
-
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import com.ardor3d.scenegraph.Spatial;
-
-@Deprecated
-public interface CopyLogic {
-
- Spatial copy(Spatial source, AtomicBoolean recurse);
-
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.util.geom;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import com.ardor3d.scenegraph.Spatial;
+
+@Deprecated
+public interface CopyLogic {
+
+ Spatial copy(Spatial source, AtomicBoolean recurse);
+
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/util/geom/MeshCombiner.java b/ardor3d-core/src/main/java/com/ardor3d/util/geom/MeshCombiner.java
index 87a3573..fdc3f7c 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/util/geom/MeshCombiner.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/util/geom/MeshCombiner.java
@@ -264,9 +264,9 @@ public class MeshCombiner {
totalVertices += md.getVertexCount();
// check for indices
- if (useIndices || md.getIndexBuffer() != null) {
+ if (useIndices || md.getIndices() != null) {
useIndices = true;
- if (md.getIndexBuffer() != null) {
+ if (md.getIndices() != null) {
totalIndices += md.getIndices().capacity();
} else {
totalIndices += md.getVertexCount();
@@ -304,7 +304,7 @@ class IndexCombiner {
public void addEntry(final MeshData source, final int vertexOffset) {
// arrays or elements?
- if (source.getIndexBuffer() == null) {
+ if (source.getIndices() == null) {
// arrays...
int offset = 0;
int indexModeCounter = 0;
diff --git a/ardor3d-core/src/main/java/com/ardor3d/util/geom/SharedCopyLogic.java b/ardor3d-core/src/main/java/com/ardor3d/util/geom/SharedCopyLogic.java
index 200ad05..048086f 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/util/geom/SharedCopyLogic.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/util/geom/SharedCopyLogic.java
@@ -1,96 +1,96 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.util.geom;
-
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import com.ardor3d.renderer.state.RenderState;
-import com.ardor3d.renderer.state.RenderState.StateType;
-import com.ardor3d.scenegraph.Mesh;
-import com.ardor3d.scenegraph.Node;
-import com.ardor3d.scenegraph.Spatial;
-
-/**
- * @deprecated use {@link Spatial#makeCopy(boolean)} instead.
- */
-@Deprecated
-public class SharedCopyLogic implements CopyLogic {
- private static final Logger logger = Logger.getLogger(SharedCopyLogic.class.getName());
-
- public Spatial copy(final Spatial source, final AtomicBoolean recurse) {
- recurse.set(false);
- if (source instanceof Node) {
- recurse.set(true);
- return clone((Node) source);
- } else if (source instanceof Mesh) {
- final Mesh result = clone((Mesh) source);
- result.setMeshData(((Mesh) source).getMeshData());
- result.updateModelBound();
- return result;
- }
- return null;
- }
-
- protected Mesh clone(final Mesh original) {
- Mesh copy = null;
- try {
- copy = original.getClass().newInstance();
- } catch (final InstantiationException e) {
- logger.log(Level.SEVERE, "Could not access final constructor of class "
- + original.getClass().getCanonicalName(), e);
- throw new RuntimeException(e);
- } catch (final IllegalAccessException e) {
- logger.log(Level.SEVERE, "Could not access final constructor of class "
- + original.getClass().getCanonicalName(), e);
- throw new RuntimeException(e);
- }
- copy.setName(original.getName() + "_copy");
- copy.getSceneHints().set(original.getSceneHints());
- copy.setTransform(original.getTransform());
- copy.setDefaultColor(original.getDefaultColor());
-
- for (final StateType type : StateType.values()) {
- final RenderState state = original.getLocalRenderState(type);
- if (state != null) {
- copy.setRenderState(state);
- }
- }
- return copy;
- }
-
- protected Node clone(final Node original) {
- Node copy = null;
- try {
- copy = original.getClass().newInstance();
- } catch (final InstantiationException e) {
- logger.log(Level.SEVERE, "Could not access final constructor of class "
- + original.getClass().getCanonicalName(), e);
- throw new RuntimeException(e);
- } catch (final IllegalAccessException e) {
- logger.log(Level.SEVERE, "Could not access final constructor of class "
- + original.getClass().getCanonicalName(), e);
- throw new RuntimeException(e);
- }
- copy.setName(original.getName() + "_copy");
- copy.getSceneHints().set(original.getSceneHints());
- copy.setTransform(original.getTransform());
-
- for (final StateType type : StateType.values()) {
- final RenderState state = original.getLocalRenderState(type);
- if (state != null) {
- copy.setRenderState(state);
- }
- }
- return copy;
- }
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.util.geom;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import com.ardor3d.renderer.state.RenderState;
+import com.ardor3d.renderer.state.RenderState.StateType;
+import com.ardor3d.scenegraph.Mesh;
+import com.ardor3d.scenegraph.Node;
+import com.ardor3d.scenegraph.Spatial;
+
+/**
+ * @deprecated use {@link Spatial#makeCopy(boolean)} instead.
+ */
+@Deprecated
+public class SharedCopyLogic implements CopyLogic {
+ private static final Logger logger = Logger.getLogger(SharedCopyLogic.class.getName());
+
+ public Spatial copy(final Spatial source, final AtomicBoolean recurse) {
+ recurse.set(false);
+ if (source instanceof Node) {
+ recurse.set(true);
+ return clone((Node) source);
+ } else if (source instanceof Mesh) {
+ final Mesh result = clone((Mesh) source);
+ result.setMeshData(((Mesh) source).getMeshData());
+ result.updateModelBound();
+ return result;
+ }
+ return null;
+ }
+
+ protected Mesh clone(final Mesh original) {
+ Mesh copy = null;
+ try {
+ copy = original.getClass().newInstance();
+ } catch (final InstantiationException e) {
+ logger.log(Level.SEVERE, "Could not access final constructor of class "
+ + original.getClass().getCanonicalName(), e);
+ throw new RuntimeException(e);
+ } catch (final IllegalAccessException e) {
+ logger.log(Level.SEVERE, "Could not access final constructor of class "
+ + original.getClass().getCanonicalName(), e);
+ throw new RuntimeException(e);
+ }
+ copy.setName(original.getName() + "_copy");
+ copy.getSceneHints().set(original.getSceneHints());
+ copy.setTransform(original.getTransform());
+ copy.setDefaultColor(original.getDefaultColor());
+
+ for (final StateType type : StateType.values()) {
+ final RenderState state = original.getLocalRenderState(type);
+ if (state != null) {
+ copy.setRenderState(state);
+ }
+ }
+ return copy;
+ }
+
+ protected Node clone(final Node original) {
+ Node copy = null;
+ try {
+ copy = original.getClass().newInstance();
+ } catch (final InstantiationException e) {
+ logger.log(Level.SEVERE, "Could not access final constructor of class "
+ + original.getClass().getCanonicalName(), e);
+ throw new RuntimeException(e);
+ } catch (final IllegalAccessException e) {
+ logger.log(Level.SEVERE, "Could not access final constructor of class "
+ + original.getClass().getCanonicalName(), e);
+ throw new RuntimeException(e);
+ }
+ copy.setName(original.getName() + "_copy");
+ copy.getSceneHints().set(original.getSceneHints());
+ copy.setTransform(original.getTransform());
+
+ for (final StateType type : StateType.values()) {
+ final RenderState state = original.getLocalRenderState(type);
+ if (state != null) {
+ copy.setRenderState(state);
+ }
+ }
+ return copy;
+ }
+}
diff --git a/ardor3d-core/src/main/java/com/ardor3d/util/shader/uniformtypes/ShaderVariablePointerFloatMatrix.java b/ardor3d-core/src/main/java/com/ardor3d/util/shader/uniformtypes/ShaderVariablePointerFloatMatrix.java
index 7f74fef..6f5a5f7 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/util/shader/uniformtypes/ShaderVariablePointerFloatMatrix.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/util/shader/uniformtypes/ShaderVariablePointerFloatMatrix.java
@@ -1,69 +1,69 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.util.shader.uniformtypes;
-
-import java.io.IOException;
-import java.nio.FloatBuffer;
-
-import com.ardor3d.scenegraph.FloatBufferData;
-import com.ardor3d.util.export.InputCapsule;
-import com.ardor3d.util.export.OutputCapsule;
-import com.ardor3d.util.shader.ShaderVariable;
-
-/**
- * ShaderVariablePointerFloatMatrix - data is stored by row... all matrices row 0, then all matrices row 1, etc.
- */
-public class ShaderVariablePointerFloatMatrix extends ShaderVariable {
- /**
- * Specifies the number of rows and cols in the matrix. Must be 2, 3, or 4.
- */
- public int size;
- /**
- * Specifies whether fixed-point data values should be normalized (true) or converted directly as fixed-point values
- * (false) when they are accessed.
- */
- public boolean normalized;
- /** The data for the attribute value */
- public FloatBufferData data;
-
- @Override
- public boolean hasData() {
- return data != null && data.getBuffer() != null;
- }
-
- @Override
- public int getSize() {
- return size;
- }
-
- @Override
- public void write(final OutputCapsule capsule) throws IOException {
- super.write(capsule);
- capsule.write(size, "size", 0);
- capsule.write(normalized, "normalized", false);
- capsule.write(data, "bdata", null);
- }
-
- @Override
- public void read(final InputCapsule capsule) throws IOException {
- super.read(capsule);
- size = capsule.readInt("size", 0);
- normalized = capsule.readBoolean("normalized", false);
- data = (FloatBufferData) capsule.readSavable("bdata", null);
- // XXX: transitional
- if (data == null) {
- final FloatBuffer buff = capsule.readFloatBuffer("data", null);
- if (buff != null) {
- data = new FloatBufferData(buff, size);
- }
- }
- }
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.util.shader.uniformtypes;
+
+import java.io.IOException;
+import java.nio.FloatBuffer;
+
+import com.ardor3d.scenegraph.FloatBufferData;
+import com.ardor3d.util.export.InputCapsule;
+import com.ardor3d.util.export.OutputCapsule;
+import com.ardor3d.util.shader.ShaderVariable;
+
+/**
+ * ShaderVariablePointerFloatMatrix - data is stored by row... all matrices row 0, then all matrices row 1, etc.
+ */
+public class ShaderVariablePointerFloatMatrix extends ShaderVariable {
+ /**
+ * Specifies the number of rows and cols in the matrix. Must be 2, 3, or 4.
+ */
+ public int size;
+ /**
+ * Specifies whether fixed-point data values should be normalized (true) or converted directly as fixed-point values
+ * (false) when they are accessed.
+ */
+ public boolean normalized;
+ /** The data for the attribute value */
+ public FloatBufferData data;
+
+ @Override
+ public boolean hasData() {
+ return data != null && data.getBuffer() != null;
+ }
+
+ @Override
+ public int getSize() {
+ return size;
+ }
+
+ @Override
+ public void write(final OutputCapsule capsule) throws IOException {
+ super.write(capsule);
+ capsule.write(size, "size", 0);
+ capsule.write(normalized, "normalized", false);
+ capsule.write(data, "bdata", null);
+ }
+
+ @Override
+ public void read(final InputCapsule capsule) throws IOException {
+ super.read(capsule);
+ size = capsule.readInt("size", 0);
+ normalized = capsule.readBoolean("normalized", false);
+ data = (FloatBufferData) capsule.readSavable("bdata", null);
+ // XXX: transitional
+ if (data == null) {
+ final FloatBuffer buff = capsule.readFloatBuffer("data", null);
+ if (buff != null) {
+ data = new FloatBufferData(buff, size);
+ }
+ }
+ }
} \ No newline at end of file
diff --git a/ardor3d-core/src/main/java/com/ardor3d/util/stat/graph/TimedAreaGrapher.java b/ardor3d-core/src/main/java/com/ardor3d/util/stat/graph/TimedAreaGrapher.java
index 4b0e5d2..bc336d5 100644
--- a/ardor3d-core/src/main/java/com/ardor3d/util/stat/graph/TimedAreaGrapher.java
+++ b/ardor3d-core/src/main/java/com/ardor3d/util/stat/graph/TimedAreaGrapher.java
@@ -172,7 +172,7 @@ public class TimedAreaGrapher extends AbstractStatGrapher implements TableLinkab
fb.rewind();
entry.area.getMeshData().setVertexBuffer(fb);
entry.area.setScale(new Vector3(scaleWidth, scaleHeight, 1));
- entry.area.getMeshData().getIndexBuffer().limit(entry.verts.size());
+ entry.area.getMeshData().getIndices().limit(entry.verts.size());
// - attach to root as needed
if (!_graphRoot.equals(entry.area.getParent())) {
@@ -272,11 +272,6 @@ public class TimedAreaGrapher extends AbstractStatGrapher implements TableLinkab
area = new Mesh("a");
area.getMeshData().setVertexBuffer(BufferUtils.createVector3Buffer(maxSamples * 2));
- area.getMeshData().setIndexBuffer(BufferUtils.createIntBuffer(maxSamples * 2));
- for (int i = 0; i < maxSamples * 2; i++) {
- area.getMeshData().getIndices().put(i);
- }
- area.getMeshData().getIndexBuffer().rewind();
area.getSceneHints().setRenderBucketType(RenderBucketType.Ortho);
area.getMeshData().setIndexMode(IndexMode.LineStrip);
diff --git a/ardor3d-core/src/main/resources/com/ardor3d/ui/text/arial-24-bold-regular.fnt b/ardor3d-core/src/main/resources/com/ardor3d/ui/text/arial-24-bold-regular.fnt
index b8f7d49..2d155f3 100644
--- a/ardor3d-core/src/main/resources/com/ardor3d/ui/text/arial-24-bold-regular.fnt
+++ b/ardor3d-core/src/main/resources/com/ardor3d/ui/text/arial-24-bold-regular.fnt
@@ -1,1403 +1,1403 @@
-<?xml version="1.0"?>
-<font>
- <info face="Arial" size="-24" bold="1" italic="0" charset="" unicode="1" stretchH="100" smooth="1" aa="2" padding="0,0,0,0" spacing="1,1" outline="0"/>
- <common lineHeight="28" base="23" scaleW="512" scaleH="512" pages="1" packed="0" alphaChnl="0" redChnl="0" greenChnl="0" blueChnl="0"/>
- <pages>
- <page id="0" file="arial-24-bold-regular_00.png" />
- </pages>
- <chars count="994">
- <char id="32" x="510" y="44" width="1" height="1" xoffset="0" yoffset="22" xadvance="6" page="0" chnl="15" />
- <char id="33" x="116" y="389" width="4" height="18" xoffset="2" yoffset="5" xadvance="7" page="0" chnl="15" />
- <char id="34" x="392" y="475" width="9" height="6" xoffset="1" yoffset="5" xadvance="11" page="0" chnl="15" />
- <char id="35" x="210" y="311" width="13" height="18" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="36" x="92" y="171" width="12" height="22" xoffset="1" yoffset="3" xadvance="13" page="0" chnl="15" />
- <char id="37" x="340" y="249" width="19" height="18" xoffset="1" yoffset="5" xadvance="21" page="0" chnl="15" />
- <char id="38" x="442" y="267" width="16" height="18" xoffset="1" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="39" x="430" y="474" width="4" height="6" xoffset="1" yoffset="5" xadvance="5" page="0" chnl="15" />
- <char id="40" x="109" y="147" width="6" height="23" xoffset="1" yoffset="5" xadvance="8" page="0" chnl="15" />
- <char id="41" x="102" y="147" width="6" height="23" xoffset="1" yoffset="5" xadvance="8" page="0" chnl="15" />
- <char id="42" x="223" y="481" width="8" height="8" xoffset="0" yoffset="5" xadvance="9" page="0" chnl="15" />
- <char id="43" x="352" y="463" width="12" height="12" xoffset="1" yoffset="8" xadvance="14" page="0" chnl="15" />
- <char id="44" x="507" y="460" width="4" height="8" xoffset="1" yoffset="19" xadvance="6" page="0" chnl="15" />
- <char id="45" x="374" y="482" width="7" height="3" xoffset="1" yoffset="15" xadvance="8" page="0" chnl="15" />
- <char id="46" x="246" y="490" width="4" height="4" xoffset="1" yoffset="19" xadvance="6" page="0" chnl="15" />
- <char id="47" x="504" y="305" width="7" height="18" xoffset="0" yoffset="5" xadvance="6" page="0" chnl="15" />
- <char id="48" x="347" y="326" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="49" x="430" y="362" width="8" height="18" xoffset="2" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="50" x="373" y="325" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="51" x="386" y="325" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="52" x="322" y="307" width="13" height="18" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="53" x="399" y="325" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="54" x="412" y="325" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="55" x="425" y="324" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="56" x="438" y="324" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="57" x="451" y="324" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="58" x="99" y="471" width="4" height="14" xoffset="2" yoffset="9" xadvance="8" page="0" chnl="15" />
- <char id="59" x="121" y="389" width="4" height="18" xoffset="2" yoffset="9" xadvance="8" page="0" chnl="15" />
- <char id="60" x="169" y="452" width="12" height="14" xoffset="1" yoffset="7" xadvance="14" page="0" chnl="15" />
- <char id="61" x="68" y="486" width="12" height="9" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="62" x="143" y="455" width="12" height="14" xoffset="1" yoffset="7" xadvance="14" page="0" chnl="15" />
- <char id="63" x="462" y="305" width="13" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="64" x="0" y="28" width="23" height="23" xoffset="1" yoffset="5" xadvance="23" page="0" chnl="15" />
- <char id="65" x="318" y="269" width="17" height="18" xoffset="0" yoffset="5" xadvance="16" page="0" chnl="15" />
- <char id="66" x="301" y="288" width="15" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="67" x="17" y="216" width="16" height="19" xoffset="1" yoffset="4" xadvance="17" page="0" chnl="15" />
- <char id="68" x="317" y="288" width="15" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="69" x="476" y="305" width="13" height="18" xoffset="2" yoffset="5" xadvance="16" page="0" chnl="15" />
- <char id="70" x="13" y="351" width="12" height="18" xoffset="2" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="71" x="493" y="188" width="16" height="19" xoffset="1" yoffset="4" xadvance="18" page="0" chnl="15" />
- <char id="72" x="135" y="311" width="14" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="73" x="141" y="387" width="4" height="18" xoffset="1" yoffset="5" xadvance="6" page="0" chnl="15" />
- <char id="74" x="500" y="247" width="11" height="18" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="75" x="119" y="292" width="16" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="76" x="52" y="351" width="12" height="18" xoffset="2" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="77" x="192" y="273" width="17" height="18" xoffset="2" yoffset="5" xadvance="20" page="0" chnl="15" />
- <char id="78" x="381" y="287" width="14" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="79" x="334" y="190" width="17" height="19" xoffset="1" yoffset="4" xadvance="18" page="0" chnl="15" />
- <char id="80" x="56" y="332" width="13" height="18" xoffset="2" yoffset="5" xadvance="16" page="0" chnl="15" />
- <char id="81" x="250" y="169" width="17" height="21" xoffset="1" yoffset="4" xadvance="18" page="0" chnl="15" />
- <char id="82" x="187" y="292" width="16" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="83" x="228" y="212" width="14" height="19" xoffset="1" yoffset="4" xadvance="16" page="0" chnl="15" />
- <char id="84" x="180" y="311" width="14" height="18" xoffset="1" yoffset="5" xadvance="15" page="0" chnl="15" />
- <char id="85" x="195" y="311" width="14" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="86" x="459" y="267" width="16" height="18" xoffset="0" yoffset="5" xadvance="16" page="0" chnl="15" />
- <char id="87" x="469" y="229" width="23" height="18" xoffset="0" yoffset="5" xadvance="22" page="0" chnl="15" />
- <char id="88" x="493" y="267" width="16" height="18" xoffset="0" yoffset="5" xadvance="16" page="0" chnl="15" />
- <char id="89" x="246" y="271" width="17" height="18" xoffset="0" yoffset="5" xadvance="16" page="0" chnl="15" />
- <char id="90" x="396" y="287" width="14" height="18" xoffset="0" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="91" x="74" y="148" width="6" height="23" xoffset="1" yoffset="5" xadvance="8" page="0" chnl="15" />
- <char id="92" x="59" y="389" width="7" height="18" xoffset="0" yoffset="5" xadvance="6" page="0" chnl="15" />
- <char id="93" x="123" y="147" width="6" height="23" xoffset="0" yoffset="5" xadvance="8" page="0" chnl="15" />
- <char id="94" x="495" y="460" width="11" height="10" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="95" x="272" y="490" width="14" height="3" xoffset="0" yoffset="24" xadvance="13" page="0" chnl="15" />
- <char id="96" x="203" y="490" width="5" height="4" xoffset="0" yoffset="5" xadvance="8" page="0" chnl="15" />
- <char id="97" x="104" y="455" width="12" height="14" xoffset="1" yoffset="9" xadvance="13" page="0" chnl="15" />
- <char id="98" x="104" y="351" width="12" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="99" x="91" y="456" width="12" height="14" xoffset="1" yoffset="9" xadvance="13" page="0" chnl="15" />
- <char id="100" x="130" y="349" width="12" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="101" x="78" y="456" width="12" height="14" xoffset="1" yoffset="9" xadvance="13" page="0" chnl="15" />
- <char id="102" x="400" y="363" width="9" height="18" xoffset="0" yoffset="5" xadvance="8" page="0" chnl="15" />
- <char id="103" x="208" y="232" width="12" height="19" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="104" x="156" y="349" width="12" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="105" x="111" y="389" width="4" height="18" xoffset="1" yoffset="5" xadvance="6" page="0" chnl="15" />
- <char id="106" x="116" y="147" width="6" height="23" xoffset="-1" yoffset="5" xadvance="6" page="0" chnl="15" />
- <char id="107" x="182" y="349" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="108" x="106" y="389" width="4" height="18" xoffset="1" yoffset="5" xadvance="6" page="0" chnl="15" />
- <char id="109" x="244" y="422" width="19" height="14" xoffset="1" yoffset="9" xadvance="21" page="0" chnl="15" />
- <char id="110" x="65" y="456" width="12" height="14" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="111" x="294" y="435" width="13" height="14" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="112" x="52" y="236" width="12" height="19" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="113" x="65" y="236" width="12" height="19" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="114" x="10" y="472" width="9" height="14" xoffset="1" yoffset="9" xadvance="9" page="0" chnl="15" />
- <char id="115" x="52" y="456" width="12" height="14" xoffset="0" yoffset="9" xadvance="13" page="0" chnl="15" />
- <char id="116" x="9" y="389" width="8" height="18" xoffset="0" yoffset="5" xadvance="8" page="0" chnl="15" />
- <char id="117" x="39" y="456" width="12" height="14" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="118" x="124" y="440" width="14" height="14" xoffset="0" yoffset="9" xadvance="13" page="0" chnl="15" />
- <char id="119" x="181" y="422" width="20" height="14" xoffset="0" yoffset="9" xadvance="19" page="0" chnl="15" />
- <char id="120" x="139" y="440" width="14" height="14" xoffset="0" yoffset="9" xadvance="13" page="0" chnl="15" />
- <char id="121" x="348" y="210" width="14" height="19" xoffset="0" yoffset="9" xadvance="13" page="0" chnl="15" />
- <char id="122" x="269" y="452" width="11" height="14" xoffset="0" yoffset="9" xadvance="12" page="0" chnl="15" />
- <char id="123" x="0" y="148" width="9" height="23" xoffset="0" yoffset="5" xadvance="9" page="0" chnl="15" />
- <char id="124" x="169" y="147" width="3" height="23" xoffset="2" yoffset="5" xadvance="6" page="0" chnl="15" />
- <char id="125" x="10" y="148" width="9" height="23" xoffset="0" yoffset="5" xadvance="9" page="0" chnl="15" />
- <char id="126" x="439" y="473" width="13" height="5" xoffset="1" yoffset="12" xadvance="14" page="0" chnl="15" />
- <char id="160" x="510" y="46" width="1" height="1" xoffset="0" yoffset="22" xadvance="6" page="0" chnl="15" />
- <char id="161" x="281" y="231" width="4" height="19" xoffset="2" yoffset="9" xadvance="7" page="0" chnl="15" />
- <char id="162" x="202" y="123" width="12" height="23" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="163" x="238" y="309" width="13" height="18" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="164" x="193" y="467" width="13" height="13" xoffset="0" yoffset="8" xadvance="13" page="0" chnl="15" />
- <char id="165" x="224" y="311" width="13" height="18" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="166" x="165" y="147" width="3" height="23" xoffset="2" yoffset="5" xadvance="6" page="0" chnl="15" />
- <char id="167" x="215" y="123" width="12" height="23" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="168" x="339" y="484" width="8" height="3" xoffset="0" yoffset="5" xadvance="8" page="0" chnl="15" />
- <char id="169" x="40" y="275" width="18" height="18" xoffset="0" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="170" x="104" y="485" width="8" height="9" xoffset="0" yoffset="5" xadvance="9" page="0" chnl="15" />
- <char id="171" x="378" y="462" width="12" height="12" xoffset="1" yoffset="10" xadvance="13" page="0" chnl="15" />
- <char id="172" x="55" y="486" width="12" height="9" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="173" x="366" y="483" width="7" height="3" xoffset="1" yoffset="15" xadvance="8" page="0" chnl="15" />
- <char id="174" x="59" y="275" width="18" height="18" xoffset="0" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="175" x="287" y="490" width="14" height="3" xoffset="0" yoffset="2" xadvance="13" page="0" chnl="15" />
- <char id="176" x="232" y="481" width="8" height="8" xoffset="1" yoffset="5" xadvance="9" page="0" chnl="15" />
- <char id="177" x="452" y="381" width="12" height="17" xoffset="0" yoffset="6" xadvance="13" page="0" chnl="15" />
- <char id="178" x="140" y="484" width="7" height="9" xoffset="0" yoffset="5" xadvance="8" page="0" chnl="15" />
- <char id="179" x="148" y="484" width="7" height="9" xoffset="0" yoffset="5" xadvance="8" page="0" chnl="15" />
- <char id="180" x="185" y="490" width="5" height="4" xoffset="2" yoffset="5" xadvance="8" page="0" chnl="15" />
- <char id="181" x="462" y="209" width="12" height="19" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="182" x="495" y="144" width="13" height="22" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="183" x="241" y="490" width="4" height="4" xoffset="1" yoffset="12" xadvance="6" page="0" chnl="15" />
- <char id="184" x="471" y="472" width="7" height="5" xoffset="0" yoffset="22" xadvance="8" page="0" chnl="15" />
- <char id="185" x="163" y="484" width="5" height="9" xoffset="1" yoffset="5" xadvance="8" page="0" chnl="15" />
- <char id="186" x="113" y="485" width="8" height="9" xoffset="0" yoffset="5" xadvance="9" page="0" chnl="15" />
- <char id="187" x="391" y="462" width="12" height="12" xoffset="1" yoffset="10" xadvance="13" page="0" chnl="15" />
- <char id="188" x="420" y="248" width="19" height="18" xoffset="1" yoffset="5" xadvance="20" page="0" chnl="15" />
- <char id="189" x="480" y="248" width="19" height="18" xoffset="1" yoffset="5" xadvance="20" page="0" chnl="15" />
- <char id="190" x="153" y="254" width="20" height="18" xoffset="0" yoffset="5" xadvance="20" page="0" chnl="15" />
- <char id="191" x="91" y="235" width="12" height="19" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="192" x="252" y="49" width="17" height="23" xoffset="0" yoffset="0" xadvance="17" page="0" chnl="15" />
- <char id="193" x="270" y="49" width="17" height="23" xoffset="0" yoffset="0" xadvance="17" page="0" chnl="15" />
- <char id="194" x="288" y="49" width="17" height="23" xoffset="0" yoffset="0" xadvance="17" page="0" chnl="15" />
- <char id="195" x="306" y="49" width="17" height="23" xoffset="0" yoffset="0" xadvance="17" page="0" chnl="15" />
- <char id="196" x="468" y="48" width="17" height="23" xoffset="0" yoffset="0" xadvance="17" page="0" chnl="15" />
- <char id="197" x="292" y="145" width="17" height="22" xoffset="0" yoffset="1" xadvance="17" page="0" chnl="15" />
- <char id="198" x="396" y="229" width="24" height="18" xoffset="-1" yoffset="5" xadvance="24" page="0" chnl="15" />
- <char id="199" x="17" y="76" width="16" height="23" xoffset="1" yoffset="4" xadvance="17" page="0" chnl="15" />
- <char id="200" x="283" y="97" width="13" height="23" xoffset="2" yoffset="0" xadvance="16" page="0" chnl="15" />
- <char id="201" x="297" y="97" width="13" height="23" xoffset="2" yoffset="0" xadvance="16" page="0" chnl="15" />
- <char id="202" x="311" y="97" width="13" height="23" xoffset="2" yoffset="0" xadvance="16" page="0" chnl="15" />
- <char id="203" x="84" y="123" width="13" height="23" xoffset="2" yoffset="0" xadvance="16" page="0" chnl="15" />
- <char id="204" x="149" y="147" width="5" height="23" xoffset="0" yoffset="0" xadvance="6" page="0" chnl="15" />
- <char id="205" x="143" y="147" width="5" height="23" xoffset="1" yoffset="0" xadvance="6" page="0" chnl="15" />
- <char id="206" x="38" y="148" width="8" height="23" xoffset="0" yoffset="0" xadvance="6" page="0" chnl="15" />
- <char id="207" x="503" y="48" width="8" height="23" xoffset="0" yoffset="0" xadvance="6" page="0" chnl="15" />
- <char id="208" x="336" y="268" width="17" height="18" xoffset="0" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="209" x="75" y="99" width="14" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
- <char id="210" x="342" y="49" width="17" height="23" xoffset="1" yoffset="0" xadvance="18" page="0" chnl="15" />
- <char id="211" x="360" y="49" width="17" height="23" xoffset="1" yoffset="0" xadvance="18" page="0" chnl="15" />
- <char id="212" x="378" y="49" width="17" height="23" xoffset="1" yoffset="0" xadvance="18" page="0" chnl="15" />
- <char id="213" x="396" y="49" width="17" height="23" xoffset="1" yoffset="0" xadvance="18" page="0" chnl="15" />
- <char id="214" x="414" y="49" width="17" height="23" xoffset="1" yoffset="0" xadvance="18" page="0" chnl="15" />
- <char id="215" x="365" y="462" width="12" height="12" xoffset="1" yoffset="8" xadvance="14" page="0" chnl="15" />
- <char id="216" x="231" y="170" width="18" height="21" xoffset="0" yoffset="3" xadvance="18" page="0" chnl="15" />
- <char id="217" x="45" y="100" width="14" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
- <char id="218" x="210" y="99" width="14" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
- <char id="219" x="233" y="74" width="14" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
- <char id="220" x="248" y="74" width="14" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
- <char id="221" x="54" y="51" width="17" height="23" xoffset="0" yoffset="0" xadvance="16" page="0" chnl="15" />
- <char id="222" x="0" y="332" width="13" height="18" xoffset="2" yoffset="5" xadvance="16" page="0" chnl="15" />
- <char id="223" x="416" y="344" width="12" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="224" x="429" y="343" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="225" x="442" y="343" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="226" x="455" y="343" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="227" x="468" y="343" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="228" x="481" y="343" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="229" x="473" y="167" width="12" height="20" xoffset="1" yoffset="3" xadvance="13" page="0" chnl="15" />
- <char id="230" x="223" y="422" width="20" height="14" xoffset="1" yoffset="9" xadvance="21" page="0" chnl="15" />
- <char id="231" x="0" y="370" width="12" height="18" xoffset="1" yoffset="9" xadvance="13" page="0" chnl="15" />
- <char id="232" x="13" y="370" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="233" x="143" y="349" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="234" x="169" y="349" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="235" x="221" y="349" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="236" x="88" y="389" width="5" height="18" xoffset="0" yoffset="5" xadvance="6" page="0" chnl="15" />
- <char id="237" x="100" y="389" width="5" height="18" xoffset="1" yoffset="5" xadvance="6" page="0" chnl="15" />
- <char id="238" x="448" y="362" width="8" height="18" xoffset="0" yoffset="5" xadvance="6" page="0" chnl="15" />
- <char id="239" x="502" y="362" width="8" height="18" xoffset="0" yoffset="5" xadvance="6" page="0" chnl="15" />
- <char id="240" x="168" y="330" width="13" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="241" x="299" y="346" width="12" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="242" x="154" y="330" width="13" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="243" x="140" y="330" width="13" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="244" x="112" y="332" width="13" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="245" x="84" y="332" width="13" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="246" x="14" y="332" width="13" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="247" x="207" y="467" width="12" height="13" xoffset="0" yoffset="8" xadvance="13" page="0" chnl="15" />
- <char id="248" x="478" y="399" width="13" height="15" xoffset="1" yoffset="8" xadvance="14" page="0" chnl="15" />
- <char id="249" x="65" y="370" width="12" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="250" x="78" y="370" width="12" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="251" x="321" y="326" width="12" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="252" x="334" y="326" width="12" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="253" x="428" y="73" width="14" height="23" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="254" x="254" y="122" width="12" height="23" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="255" x="413" y="73" width="14" height="23" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="256" x="256" y="146" width="17" height="22" xoffset="0" yoffset="1" xadvance="16" page="0" chnl="15" />
- <char id="257" x="426" y="382" width="12" height="17" xoffset="1" yoffset="6" xadvance="13" page="0" chnl="15" />
- <char id="258" x="294" y="25" width="17" height="23" xoffset="0" yoffset="0" xadvance="16" page="0" chnl="15" />
- <char id="259" x="117" y="370" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="260" x="179" y="27" width="19" height="23" xoffset="0" yoffset="5" xadvance="16" page="0" chnl="15" />
- <char id="261" x="288" y="211" width="14" height="19" xoffset="1" yoffset="9" xadvance="13" page="0" chnl="15" />
- <char id="262" x="51" y="76" width="16" height="23" xoffset="1" yoffset="0" xadvance="17" page="0" chnl="15" />
- <char id="263" x="26" y="370" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="264" x="170" y="75" width="16" height="23" xoffset="1" yoffset="0" xadvance="17" page="0" chnl="15" />
- <char id="265" x="208" y="349" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="266" x="486" y="48" width="16" height="23" xoffset="1" yoffset="0" xadvance="17" page="0" chnl="15" />
- <char id="267" x="477" y="324" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="268" x="34" y="76" width="16" height="23" xoffset="1" yoffset="0" xadvance="17" page="0" chnl="15" />
- <char id="269" x="308" y="326" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="270" x="187" y="75" width="15" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
- <char id="271" x="17" y="294" width="16" height="18" xoffset="1" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="272" x="264" y="271" width="17" height="18" xoffset="0" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="273" x="486" y="286" width="14" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="274" x="467" y="144" width="13" height="22" xoffset="2" yoffset="1" xadvance="16" page="0" chnl="15" />
- <char id="275" x="465" y="381" width="12" height="17" xoffset="1" yoffset="6" xadvance="13" page="0" chnl="15" />
- <char id="276" x="367" y="97" width="13" height="23" xoffset="2" yoffset="0" xadvance="16" page="0" chnl="15" />
- <char id="277" x="403" y="344" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="278" x="353" y="97" width="13" height="23" xoffset="2" yoffset="0" xadvance="16" page="0" chnl="15" />
- <char id="279" x="494" y="343" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="280" x="70" y="124" width="13" height="23" xoffset="2" yoffset="5" xadvance="16" page="0" chnl="15" />
- <char id="281" x="104" y="234" width="12" height="19" xoffset="1" yoffset="9" xadvance="13" page="0" chnl="15" />
- <char id="282" x="479" y="96" width="13" height="23" xoffset="2" yoffset="0" xadvance="16" page="0" chnl="15" />
- <char id="283" x="52" y="370" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="284" x="102" y="75" width="16" height="23" xoffset="1" yoffset="0" xadvance="18" page="0" chnl="15" />
- <char id="285" x="267" y="122" width="12" height="23" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="286" x="85" y="75" width="16" height="23" xoffset="1" yoffset="0" xadvance="18" page="0" chnl="15" />
- <char id="287" x="280" y="121" width="12" height="23" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="288" x="68" y="75" width="16" height="23" xoffset="1" yoffset="0" xadvance="18" page="0" chnl="15" />
- <char id="289" x="293" y="121" width="12" height="23" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="290" x="323" y="0" width="16" height="24" xoffset="1" yoffset="4" xadvance="18" page="0" chnl="15" />
- <char id="291" x="207" y="0" width="12" height="25" xoffset="1" yoffset="3" xadvance="14" page="0" chnl="15" />
- <char id="292" x="353" y="73" width="14" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
- <char id="293" x="306" y="121" width="12" height="23" xoffset="1" yoffset="0" xadvance="14" page="0" chnl="15" />
- <char id="294" x="390" y="268" width="17" height="18" xoffset="0" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="295" x="336" y="307" width="13" height="18" xoffset="0" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="296" x="20" y="148" width="8" height="23" xoffset="0" yoffset="0" xadvance="6" page="0" chnl="15" />
- <char id="297" x="475" y="362" width="8" height="18" xoffset="0" yoffset="5" xadvance="6" page="0" chnl="15" />
- <char id="298" x="166" y="171" width="8" height="22" xoffset="0" yoffset="1" xadvance="6" page="0" chnl="15" />
- <char id="299" x="0" y="408" width="8" height="17" xoffset="0" yoffset="6" xadvance="6" page="0" chnl="15" />
- <char id="300" x="503" y="72" width="8" height="23" xoffset="0" yoffset="0" xadvance="6" page="0" chnl="15" />
- <char id="301" x="439" y="362" width="8" height="18" xoffset="0" yoffset="5" xadvance="6" page="0" chnl="15" />
- <char id="302" x="81" y="148" width="6" height="23" xoffset="0" yoffset="5" xadvance="6" page="0" chnl="15" />
- <char id="303" x="88" y="147" width="6" height="23" xoffset="0" yoffset="5" xadvance="6" page="0" chnl="15" />
- <char id="304" x="160" y="147" width="4" height="23" xoffset="1" yoffset="0" xadvance="6" page="0" chnl="15" />
- <char id="305" x="119" y="470" width="4" height="14" xoffset="1" yoffset="9" xadvance="6" page="0" chnl="15" />
- <char id="306" x="408" y="267" width="16" height="18" xoffset="1" yoffset="5" xadvance="19" page="0" chnl="15" />
- <char id="307" x="493" y="120" width="10" height="23" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="308" x="0" y="124" width="13" height="23" xoffset="0" yoffset="0" xadvance="13" page="0" chnl="15" />
- <char id="309" x="56" y="148" width="8" height="23" xoffset="-1" yoffset="5" xadvance="6" page="0" chnl="15" />
- <char id="310" x="327" y="145" width="16" height="22" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="311" x="118" y="171" width="12" height="22" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="312" x="117" y="455" width="12" height="14" xoffset="1" yoffset="9" xadvance="13" page="0" chnl="15" />
- <char id="313" x="319" y="121" width="12" height="23" xoffset="2" yoffset="0" xadvance="14" page="0" chnl="15" />
- <char id="314" x="137" y="147" width="5" height="23" xoffset="1" yoffset="0" xadvance="6" page="0" chnl="15" />
- <char id="315" x="27" y="172" width="12" height="22" xoffset="2" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="316" x="175" y="170" width="7" height="22" xoffset="0" yoffset="5" xadvance="6" page="0" chnl="15" />
- <char id="317" x="91" y="351" width="12" height="18" xoffset="2" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="318" x="503" y="324" width="8" height="18" xoffset="1" yoffset="5" xadvance="9" page="0" chnl="15" />
- <char id="319" x="234" y="349" width="12" height="18" xoffset="2" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="320" x="410" y="363" width="9" height="18" xoffset="1" yoffset="5" xadvance="11" page="0" chnl="15" />
- <char id="321" x="165" y="311" width="14" height="18" xoffset="0" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="322" x="35" y="389" width="7" height="18" xoffset="0" yoffset="5" xadvance="6" page="0" chnl="15" />
- <char id="323" x="165" y="99" width="14" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
- <char id="324" x="312" y="345" width="12" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="325" x="438" y="145" width="14" height="22" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="326" x="325" y="345" width="12" height="18" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="327" x="105" y="99" width="14" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
- <char id="328" x="338" y="345" width="12" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="329" x="354" y="268" width="17" height="18" xoffset="-1" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="330" x="119" y="214" width="15" height="19" xoffset="2" yoffset="4" xadvance="17" page="0" chnl="15" />
- <char id="331" x="169" y="234" width="12" height="19" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="332" x="274" y="146" width="17" height="22" xoffset="1" yoffset="1" xadvance="18" page="0" chnl="15" />
- <char id="333" x="358" y="383" width="13" height="17" xoffset="1" yoffset="6" xadvance="14" page="0" chnl="15" />
- <char id="334" x="0" y="52" width="17" height="23" xoffset="1" yoffset="0" xadvance="18" page="0" chnl="15" />
- <char id="335" x="420" y="305" width="13" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="336" x="492" y="24" width="17" height="23" xoffset="1" yoffset="0" xadvance="18" page="0" chnl="15" />
- <char id="337" x="434" y="305" width="13" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="338" x="121" y="194" width="23" height="19" xoffset="1" yoffset="4" xadvance="24" page="0" chnl="15" />
- <char id="339" x="159" y="422" width="21" height="14" xoffset="1" yoffset="9" xadvance="22" page="0" chnl="15" />
- <char id="340" x="0" y="76" width="16" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
- <char id="341" x="380" y="363" width="9" height="18" xoffset="1" yoffset="5" xadvance="9" page="0" chnl="15" />
- <char id="342" x="310" y="145" width="16" height="22" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="343" x="369" y="363" width="10" height="18" xoffset="0" yoffset="9" xadvance="9" page="0" chnl="15" />
- <char id="344" x="136" y="75" width="16" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
- <char id="345" x="420" y="363" width="9" height="18" xoffset="1" yoffset="5" xadvance="9" page="0" chnl="15" />
- <char id="346" x="15" y="100" width="14" height="23" xoffset="1" yoffset="0" xadvance="16" page="0" chnl="15" />
- <char id="347" x="360" y="325" width="12" height="18" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="348" x="0" y="100" width="14" height="23" xoffset="1" yoffset="0" xadvance="16" page="0" chnl="15" />
- <char id="349" x="286" y="347" width="12" height="18" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="350" x="473" y="72" width="14" height="23" xoffset="1" yoffset="4" xadvance="16" page="0" chnl="15" />
- <char id="351" x="260" y="347" width="12" height="18" xoffset="0" yoffset="9" xadvance="13" page="0" chnl="15" />
- <char id="352" x="458" y="72" width="14" height="23" xoffset="1" yoffset="0" xadvance="16" page="0" chnl="15" />
- <char id="353" x="26" y="351" width="12" height="18" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="354" x="192" y="0" width="14" height="25" xoffset="1" yoffset="3" xadvance="15" page="0" chnl="15" />
- <char id="355" x="410" y="0" width="8" height="24" xoffset="0" yoffset="4" xadvance="8" page="0" chnl="15" />
- <char id="356" x="398" y="73" width="14" height="23" xoffset="1" yoffset="0" xadvance="15" page="0" chnl="15" />
- <char id="357" x="351" y="345" width="12" height="18" xoffset="0" yoffset="5" xadvance="11" page="0" chnl="15" />
- <char id="358" x="60" y="313" width="14" height="18" xoffset="1" yoffset="5" xadvance="15" page="0" chnl="15" />
- <char id="359" x="18" y="389" width="8" height="18" xoffset="0" yoffset="5" xadvance="8" page="0" chnl="15" />
- <char id="360" x="383" y="73" width="14" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
- <char id="361" x="117" y="351" width="12" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="362" x="393" y="145" width="14" height="22" xoffset="2" yoffset="1" xadvance="17" page="0" chnl="15" />
- <char id="363" x="439" y="381" width="12" height="17" xoffset="1" yoffset="6" xadvance="14" page="0" chnl="15" />
- <char id="364" x="368" y="73" width="14" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
- <char id="365" x="247" y="347" width="12" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="366" x="338" y="73" width="14" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
- <char id="367" x="486" y="167" width="12" height="20" xoffset="1" yoffset="3" xadvance="14" page="0" chnl="15" />
- <char id="368" x="308" y="73" width="14" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
- <char id="369" x="39" y="370" width="12" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="370" x="293" y="73" width="14" height="23" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="371" x="213" y="212" width="14" height="19" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="372" x="48" y="27" width="23" height="23" xoffset="0" yoffset="0" xadvance="22" page="0" chnl="15" />
- <char id="373" x="237" y="252" width="20" height="18" xoffset="0" yoffset="5" xadvance="19" page="0" chnl="15" />
- <char id="374" x="312" y="25" width="17" height="23" xoffset="0" yoffset="0" xadvance="16" page="0" chnl="15" />
- <char id="375" x="263" y="73" width="14" height="23" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="376" x="324" y="49" width="17" height="23" xoffset="0" yoffset="0" xadvance="16" page="0" chnl="15" />
- <char id="377" x="218" y="74" width="14" height="23" xoffset="0" yoffset="0" xadvance="14" page="0" chnl="15" />
- <char id="378" x="238" y="368" width="11" height="18" xoffset="0" yoffset="5" xadvance="12" page="0" chnl="15" />
- <char id="379" x="150" y="99" width="14" height="23" xoffset="0" yoffset="0" xadvance="14" page="0" chnl="15" />
- <char id="380" x="178" y="368" width="11" height="18" xoffset="0" yoffset="5" xadvance="12" page="0" chnl="15" />
- <char id="381" x="135" y="99" width="14" height="23" xoffset="0" yoffset="0" xadvance="14" page="0" chnl="15" />
- <char id="382" x="142" y="368" width="11" height="18" xoffset="0" yoffset="5" xadvance="12" page="0" chnl="15" />
- <char id="383" x="51" y="389" width="7" height="18" xoffset="1" yoffset="5" xadvance="6" page="0" chnl="15" />
- <char id="399" x="459" y="189" width="16" height="19" xoffset="1" yoffset="4" xadvance="17" page="0" chnl="15" />
- <char id="402" x="120" y="99" width="14" height="23" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="416" x="256" y="191" width="20" height="19" xoffset="1" yoffset="4" xadvance="20" page="0" chnl="15" />
- <char id="417" x="468" y="415" width="16" height="14" xoffset="1" yoffset="9" xadvance="17" page="0" chnl="15" />
- <char id="431" x="97" y="275" width="18" height="18" xoffset="2" yoffset="5" xadvance="20" page="0" chnl="15" />
- <char id="432" x="485" y="415" width="16" height="14" xoffset="1" yoffset="9" xadvance="17" page="0" chnl="15" />
- <char id="461" x="474" y="24" width="17" height="23" xoffset="0" yoffset="0" xadvance="16" page="0" chnl="15" />
- <char id="462" x="65" y="351" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="463" x="29" y="148" width="8" height="23" xoffset="0" yoffset="0" xadvance="6" page="0" chnl="15" />
- <char id="464" x="0" y="389" width="8" height="18" xoffset="0" yoffset="5" xadvance="6" page="0" chnl="15" />
- <char id="465" x="450" y="48" width="17" height="23" xoffset="1" yoffset="0" xadvance="18" page="0" chnl="15" />
- <char id="466" x="280" y="309" width="13" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="467" x="195" y="99" width="14" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
- <char id="468" x="273" y="347" width="12" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="469" x="225" y="98" width="14" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
- <char id="470" x="384" y="121" width="12" height="23" xoffset="1" yoffset="0" xadvance="14" page="0" chnl="15" />
- <char id="471" x="240" y="98" width="14" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
- <char id="472" x="131" y="171" width="12" height="22" xoffset="1" yoffset="1" xadvance="14" page="0" chnl="15" />
- <char id="473" x="443" y="72" width="14" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
- <char id="474" x="79" y="172" width="12" height="22" xoffset="1" yoffset="1" xadvance="14" page="0" chnl="15" />
- <char id="475" x="30" y="100" width="14" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
- <char id="476" x="105" y="171" width="12" height="22" xoffset="1" yoffset="1" xadvance="14" page="0" chnl="15" />
- <char id="506" x="287" y="0" width="17" height="24" xoffset="0" yoffset="-1" xadvance="16" page="0" chnl="15" />
- <char id="507" x="332" y="121" width="12" height="23" xoffset="1" yoffset="0" xadvance="13" page="0" chnl="15" />
- <char id="508" x="419" y="0" width="24" height="23" xoffset="-1" yoffset="0" xadvance="24" page="0" chnl="15" />
- <char id="509" x="258" y="252" width="20" height="18" xoffset="1" yoffset="5" xadvance="21" page="0" chnl="15" />
- <char id="510" x="249" y="0" width="18" height="24" xoffset="0" yoffset="0" xadvance="18" page="0" chnl="15" />
- <char id="511" x="308" y="307" width="13" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="601" x="182" y="452" width="12" height="14" xoffset="0" yoffset="9" xadvance="13" page="0" chnl="15" />
- <char id="710" x="149" y="494" width="8" height="4" xoffset="0" yoffset="5" xadvance="8" page="0" chnl="15" />
- <char id="711" x="140" y="494" width="8" height="4" xoffset="0" yoffset="5" xadvance="8" page="0" chnl="15" />
- <char id="713" x="348" y="484" width="8" height="3" xoffset="0" yoffset="5" xadvance="8" page="0" chnl="15" />
- <char id="728" x="312" y="487" width="8" height="3" xoffset="0" yoffset="5" xadvance="8" page="0" chnl="15" />
- <char id="729" x="399" y="482" width="4" height="3" xoffset="2" yoffset="5" xadvance="8" page="0" chnl="15" />
- <char id="730" x="0" y="498" width="5" height="5" xoffset="1" yoffset="5" xadvance="8" page="0" chnl="15" />
- <char id="731" x="412" y="475" width="6" height="6" xoffset="1" yoffset="22" xadvance="8" page="0" chnl="15" />
- <char id="732" x="321" y="487" width="8" height="3" xoffset="0" yoffset="5" xadvance="8" page="0" chnl="15" />
- <char id="733" x="130" y="495" width="9" height="4" xoffset="1" yoffset="5" xadvance="8" page="0" chnl="15" />
- <char id="768" x="179" y="493" width="5" height="4" xoffset="-6" yoffset="0" xadvance="0" page="0" chnl="15" />
- <char id="769" x="173" y="493" width="5" height="4" xoffset="-5" yoffset="0" xadvance="0" page="0" chnl="15" />
- <char id="771" x="357" y="483" width="8" height="3" xoffset="-10" yoffset="1" xadvance="0" page="0" chnl="15" />
- <char id="777" x="166" y="494" width="6" height="4" xoffset="-6" yoffset="0" xadvance="0" page="0" chnl="15" />
- <char id="803" x="221" y="490" width="4" height="4" xoffset="-10" yoffset="24" xadvance="0" page="0" chnl="15" />
- <char id="894" x="126" y="389" width="4" height="18" xoffset="2" yoffset="9" xadvance="8" page="0" chnl="15" />
- <char id="900" x="197" y="490" width="5" height="4" xoffset="2" yoffset="5" xadvance="8" page="0" chnl="15" />
- <char id="901" x="104" y="495" width="12" height="4" xoffset="0" yoffset="5" xadvance="11" page="0" chnl="15" />
- <char id="902" x="154" y="273" width="18" height="18" xoffset="-1" yoffset="5" xadvance="16" page="0" chnl="15" />
- <char id="903" x="226" y="490" width="4" height="4" xoffset="2" yoffset="9" xadvance="8" page="0" chnl="15" />
- <char id="904" x="45" y="256" width="21" height="18" xoffset="-1" yoffset="5" xadvance="20" page="0" chnl="15" />
- <char id="905" x="67" y="256" width="21" height="18" xoffset="-1" yoffset="5" xadvance="21" page="0" chnl="15" />
- <char id="906" x="334" y="364" width="11" height="18" xoffset="-1" yoffset="5" xadvance="11" page="0" chnl="15" />
- <char id="908" x="168" y="194" width="21" height="19" xoffset="-1" yoffset="4" xadvance="20" page="0" chnl="15" />
- <char id="910" x="445" y="229" width="23" height="18" xoffset="0" yoffset="5" xadvance="22" page="0" chnl="15" />
- <char id="911" x="190" y="192" width="21" height="19" xoffset="-1" yoffset="4" xadvance="20" page="0" chnl="15" />
- <char id="912" x="390" y="344" width="12" height="18" xoffset="-2" yoffset="5" xadvance="6" page="0" chnl="15" />
- <char id="913" x="372" y="268" width="17" height="18" xoffset="0" yoffset="5" xadvance="16" page="0" chnl="15" />
- <char id="914" x="269" y="290" width="15" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="915" x="364" y="344" width="12" height="18" xoffset="2" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="916" x="116" y="273" width="18" height="18" xoffset="0" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="917" x="350" y="306" width="13" height="18" xoffset="2" yoffset="5" xadvance="16" page="0" chnl="15" />
- <char id="918" x="150" y="311" width="14" height="18" xoffset="0" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="919" x="0" y="313" width="14" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="920" x="424" y="189" width="17" height="19" xoffset="1" yoffset="4" xadvance="18" page="0" chnl="15" />
- <char id="921" x="507" y="343" width="4" height="18" xoffset="1" yoffset="5" xadvance="6" page="0" chnl="15" />
- <char id="922" x="153" y="292" width="16" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="923" x="170" y="292" width="16" height="18" xoffset="0" yoffset="5" xadvance="16" page="0" chnl="15" />
- <char id="924" x="210" y="273" width="17" height="18" xoffset="2" yoffset="5" xadvance="20" page="0" chnl="15" />
- <char id="925" x="471" y="286" width="14" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="926" x="456" y="286" width="14" height="18" xoffset="1" yoffset="5" xadvance="15" page="0" chnl="15" />
- <char id="927" x="388" y="189" width="17" height="19" xoffset="1" yoffset="4" xadvance="18" page="0" chnl="15" />
- <char id="928" x="441" y="286" width="14" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="929" x="364" y="306" width="13" height="18" xoffset="2" yoffset="5" xadvance="16" page="0" chnl="15" />
- <char id="931" x="392" y="306" width="13" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="932" x="426" y="286" width="14" height="18" xoffset="1" yoffset="5" xadvance="15" page="0" chnl="15" />
- <char id="933" x="300" y="269" width="17" height="18" xoffset="0" yoffset="5" xadvance="16" page="0" chnl="15" />
- <char id="934" x="296" y="190" width="18" height="19" xoffset="1" yoffset="4" xadvance="19" page="0" chnl="15" />
- <char id="935" x="204" y="292" width="16" height="18" xoffset="0" yoffset="5" xadvance="16" page="0" chnl="15" />
- <char id="936" x="173" y="273" width="18" height="18" xoffset="1" yoffset="5" xadvance="19" page="0" chnl="15" />
- <char id="937" x="277" y="191" width="18" height="19" xoffset="0" yoffset="4" xadvance="19" page="0" chnl="15" />
- <char id="938" x="65" y="148" width="8" height="23" xoffset="0" yoffset="0" xadvance="6" page="0" chnl="15" />
- <char id="939" x="402" y="25" width="17" height="23" xoffset="0" yoffset="0" xadvance="16" page="0" chnl="15" />
- <char id="940" x="294" y="308" width="13" height="18" xoffset="1" yoffset="5" xadvance="15" page="0" chnl="15" />
- <char id="941" x="262" y="366" width="11" height="18" xoffset="1" yoffset="5" xadvance="11" page="0" chnl="15" />
- <char id="942" x="163" y="123" width="12" height="23" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="943" x="94" y="389" width="5" height="18" xoffset="1" yoffset="5" xadvance="6" page="0" chnl="15" />
- <char id="944" x="464" y="324" width="12" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="945" x="182" y="437" width="13" height="14" xoffset="1" yoffset="9" xadvance="15" page="0" chnl="15" />
- <char id="946" x="189" y="123" width="12" height="23" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="947" x="167" y="214" width="15" height="19" xoffset="0" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="948" x="406" y="306" width="13" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="949" x="329" y="448" width="11" height="14" xoffset="1" yoffset="9" xadvance="11" page="0" chnl="15" />
- <char id="950" x="482" y="120" width="10" height="23" xoffset="1" yoffset="5" xadvance="11" page="0" chnl="15" />
- <char id="951" x="182" y="234" width="12" height="19" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="952" x="274" y="366" width="11" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="953" x="104" y="470" width="4" height="14" xoffset="1" yoffset="9" xadvance="6" page="0" chnl="15" />
- <char id="954" x="375" y="432" width="12" height="14" xoffset="1" yoffset="9" xadvance="13" page="0" chnl="15" />
- <char id="955" x="221" y="292" width="15" height="18" xoffset="0" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="956" x="195" y="234" width="12" height="19" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="957" x="79" y="441" width="14" height="14" xoffset="0" yoffset="9" xadvance="13" page="0" chnl="15" />
- <char id="958" x="471" y="120" width="10" height="23" xoffset="1" yoffset="5" xadvance="10" page="0" chnl="15" />
- <char id="959" x="168" y="437" width="13" height="14" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="960" x="284" y="420" width="18" height="14" xoffset="0" yoffset="9" xadvance="18" page="0" chnl="15" />
- <char id="961" x="392" y="209" width="13" height="19" xoffset="1" yoffset="9" xadvance="15" page="0" chnl="15" />
- <char id="962" x="257" y="232" width="11" height="19" xoffset="1" yoffset="9" xadvance="12" page="0" chnl="15" />
- <char id="963" x="48" y="441" width="15" height="14" xoffset="1" yoffset="9" xadvance="16" page="0" chnl="15" />
- <char id="964" x="418" y="446" width="10" height="14" xoffset="0" yoffset="9" xadvance="10" page="0" chnl="15" />
- <char id="965" x="257" y="452" width="11" height="14" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="966" x="51" y="216" width="16" height="19" xoffset="1" yoffset="9" xadvance="17" page="0" chnl="15" />
- <char id="967" x="273" y="211" width="14" height="19" xoffset="0" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="968" x="85" y="215" width="16" height="19" xoffset="1" yoffset="9" xadvance="18" page="0" chnl="15" />
- <char id="969" x="264" y="422" width="19" height="14" xoffset="1" yoffset="9" xadvance="20" page="0" chnl="15" />
- <char id="970" x="466" y="362" width="8" height="18" xoffset="0" yoffset="5" xadvance="6" page="0" chnl="15" />
- <char id="971" x="310" y="365" width="11" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="972" x="490" y="305" width="13" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="973" x="322" y="364" width="11" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="974" x="440" y="248" width="19" height="18" xoffset="1" yoffset="5" xadvance="20" page="0" chnl="15" />
- <char id="1025" x="56" y="124" width="13" height="23" xoffset="2" yoffset="0" xadvance="16" page="0" chnl="15" />
- <char id="1026" x="132" y="254" width="20" height="18" xoffset="0" yoffset="5" xadvance="21" page="0" chnl="15" />
- <char id="1027" x="228" y="122" width="12" height="23" xoffset="2" yoffset="0" xadvance="14" page="0" chnl="15" />
- <char id="1028" x="151" y="214" width="15" height="19" xoffset="1" yoffset="4" xadvance="17" page="0" chnl="15" />
- <char id="1029" x="258" y="211" width="14" height="19" xoffset="1" yoffset="4" xadvance="16" page="0" chnl="15" />
- <char id="1030" x="131" y="387" width="4" height="18" xoffset="1" yoffset="5" xadvance="6" page="0" chnl="15" />
- <char id="1031" x="47" y="148" width="8" height="23" xoffset="0" yoffset="0" xadvance="6" page="0" chnl="15" />
- <char id="1032" x="346" y="364" width="11" height="18" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="1033" x="319" y="230" width="25" height="18" xoffset="0" yoffset="5" xadvance="26" page="0" chnl="15" />
- <char id="1034" x="421" y="229" width="23" height="18" xoffset="2" yoffset="5" xadvance="25" page="0" chnl="15" />
- <char id="1035" x="460" y="248" width="19" height="18" xoffset="0" yoffset="5" xadvance="21" page="0" chnl="15" />
- <char id="1036" x="493" y="96" width="13" height="23" xoffset="2" yoffset="0" xadvance="14" page="0" chnl="15" />
- <char id="1038" x="119" y="75" width="16" height="23" xoffset="0" yoffset="0" xadvance="15" page="0" chnl="15" />
- <char id="1039" x="423" y="145" width="14" height="22" xoffset="2" yoffset="5" xadvance="18" page="0" chnl="15" />
- <char id="1040" x="282" y="270" width="17" height="18" xoffset="0" yoffset="5" xadvance="16" page="0" chnl="15" />
- <char id="1041" x="349" y="287" width="15" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="1042" x="333" y="288" width="15" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="1043" x="195" y="349" width="12" height="18" xoffset="2" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="1044" x="238" y="146" width="17" height="22" xoffset="0" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="1045" x="196" y="330" width="13" height="18" xoffset="2" yoffset="5" xadvance="16" page="0" chnl="15" />
- <char id="1046" x="0" y="256" width="22" height="18" xoffset="0" yoffset="5" xadvance="21" page="0" chnl="15" />
- <char id="1047" x="303" y="210" width="14" height="19" xoffset="0" yoffset="4" xadvance="15" page="0" chnl="15" />
- <char id="1048" x="75" y="313" width="14" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="1049" x="278" y="73" width="14" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
- <char id="1050" x="210" y="330" width="13" height="18" xoffset="2" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="1051" x="285" y="289" width="15" height="18" xoffset="0" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="1052" x="228" y="271" width="17" height="18" xoffset="2" yoffset="5" xadvance="20" page="0" chnl="15" />
- <char id="1053" x="45" y="313" width="14" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="1054" x="370" y="190" width="17" height="19" xoffset="1" yoffset="4" xadvance="18" page="0" chnl="15" />
- <char id="1055" x="30" y="313" width="14" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="1056" x="252" y="328" width="13" height="18" xoffset="2" yoffset="5" xadvance="16" page="0" chnl="15" />
- <char id="1057" x="0" y="216" width="16" height="19" xoffset="1" yoffset="4" xadvance="17" page="0" chnl="15" />
- <char id="1058" x="15" y="313" width="14" height="18" xoffset="1" yoffset="5" xadvance="15" page="0" chnl="15" />
- <char id="1059" x="34" y="294" width="16" height="18" xoffset="0" yoffset="5" xadvance="15" page="0" chnl="15" />
- <char id="1060" x="380" y="249" width="19" height="18" xoffset="1" yoffset="5" xadvance="20" page="0" chnl="15" />
- <char id="1061" x="476" y="267" width="16" height="18" xoffset="0" yoffset="5" xadvance="16" page="0" chnl="15" />
- <char id="1062" x="361" y="145" width="15" height="22" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="1063" x="182" y="330" width="13" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="1064" x="89" y="256" width="21" height="18" xoffset="2" yoffset="5" xadvance="24" page="0" chnl="15" />
- <char id="1065" x="173" y="147" width="22" height="22" xoffset="2" yoffset="5" xadvance="24" page="0" chnl="15" />
- <char id="1066" x="279" y="251" width="20" height="18" xoffset="0" yoffset="5" xadvance="21" page="0" chnl="15" />
- <char id="1067" x="111" y="254" width="20" height="18" xoffset="2" yoffset="5" xadvance="23" page="0" chnl="15" />
- <char id="1068" x="365" y="287" width="15" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="1069" x="135" y="214" width="15" height="19" xoffset="1" yoffset="4" xadvance="17" page="0" chnl="15" />
- <char id="1070" x="145" y="194" width="22" height="19" xoffset="2" yoffset="4" xadvance="25" page="0" chnl="15" />
- <char id="1071" x="425" y="267" width="16" height="18" xoffset="0" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="1072" x="349" y="433" width="12" height="14" xoffset="1" yoffset="9" xadvance="13" page="0" chnl="15" />
- <char id="1073" x="434" y="209" width="13" height="19" xoffset="1" yoffset="4" xadvance="15" page="0" chnl="15" />
- <char id="1074" x="308" y="435" width="13" height="14" xoffset="1" yoffset="9" xadvance="15" page="0" chnl="15" />
- <char id="1075" x="451" y="446" width="9" height="14" xoffset="1" yoffset="9" xadvance="10" page="0" chnl="15" />
- <char id="1076" x="299" y="385" width="15" height="17" xoffset="0" yoffset="9" xadvance="15" page="0" chnl="15" />
- <char id="1077" x="453" y="430" width="12" height="14" xoffset="1" yoffset="9" xadvance="13" page="0" chnl="15" />
- <char id="1078" x="379" y="417" width="18" height="14" xoffset="0" yoffset="9" xadvance="17" page="0" chnl="15" />
- <char id="1079" x="245" y="452" width="11" height="14" xoffset="0" yoffset="9" xadvance="12" page="0" chnl="15" />
- <char id="1080" x="479" y="430" width="12" height="14" xoffset="1" yoffset="9" xadvance="15" page="0" chnl="15" />
- <char id="1081" x="91" y="370" width="12" height="18" xoffset="1" yoffset="5" xadvance="15" page="0" chnl="15" />
- <char id="1082" x="281" y="452" width="11" height="14" xoffset="1" yoffset="9" xadvance="12" page="0" chnl="15" />
- <char id="1083" x="94" y="440" width="14" height="14" xoffset="0" yoffset="9" xadvance="15" page="0" chnl="15" />
- <char id="1084" x="16" y="442" width="15" height="14" xoffset="1" yoffset="9" xadvance="17" page="0" chnl="15" />
- <char id="1085" x="13" y="457" width="12" height="14" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="1086" x="238" y="437" width="13" height="14" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="1087" x="388" y="432" width="12" height="14" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="1088" x="475" y="209" width="12" height="19" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="1089" x="466" y="430" width="12" height="14" xoffset="1" yoffset="9" xadvance="13" page="0" chnl="15" />
- <char id="1090" x="414" y="431" width="12" height="14" xoffset="0" yoffset="9" xadvance="11" page="0" chnl="15" />
- <char id="1091" x="183" y="214" width="14" height="19" xoffset="0" yoffset="9" xadvance="13" page="0" chnl="15" />
- <char id="1092" x="492" y="0" width="19" height="23" xoffset="1" yoffset="5" xadvance="20" page="0" chnl="15" />
- <char id="1093" x="109" y="440" width="14" height="14" xoffset="0" yoffset="9" xadvance="13" page="0" chnl="15" />
- <char id="1094" x="372" y="382" width="13" height="17" xoffset="1" yoffset="9" xadvance="15" page="0" chnl="15" />
- <char id="1095" x="233" y="452" width="11" height="14" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="1096" x="398" y="416" width="17" height="14" xoffset="1" yoffset="9" xadvance="19" page="0" chnl="15" />
- <char id="1097" x="229" y="387" width="18" height="17" xoffset="1" yoffset="9" xadvance="20" page="0" chnl="15" />
- <char id="1098" x="451" y="415" width="16" height="14" xoffset="1" yoffset="9" xadvance="17" page="0" chnl="15" />
- <char id="1099" x="360" y="417" width="18" height="14" xoffset="1" yoffset="9" xadvance="20" page="0" chnl="15" />
- <char id="1100" x="196" y="437" width="13" height="14" xoffset="1" yoffset="9" xadvance="15" page="0" chnl="15" />
- <char id="1101" x="26" y="457" width="12" height="14" xoffset="1" yoffset="9" xadvance="13" page="0" chnl="15" />
- <char id="1102" x="322" y="418" width="18" height="14" xoffset="1" yoffset="9" xadvance="20" page="0" chnl="15" />
- <char id="1103" x="252" y="437" width="13" height="14" xoffset="0" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="1105" x="104" y="370" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="1106" x="14" y="124" width="13" height="23" xoffset="0" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="1107" x="390" y="363" width="9" height="18" xoffset="1" yoffset="5" xadvance="10" page="0" chnl="15" />
- <char id="1108" x="0" y="457" width="12" height="14" xoffset="1" yoffset="9" xadvance="13" page="0" chnl="15" />
- <char id="1109" x="492" y="430" width="12" height="14" xoffset="0" yoffset="9" xadvance="13" page="0" chnl="15" />
- <char id="1110" x="136" y="387" width="4" height="18" xoffset="1" yoffset="5" xadvance="6" page="0" chnl="15" />
- <char id="1111" x="457" y="362" width="8" height="18" xoffset="0" yoffset="5" xadvance="6" page="0" chnl="15" />
- <char id="1112" x="130" y="147" width="6" height="23" xoffset="-1" yoffset="5" xadvance="6" page="0" chnl="15" />
- <char id="1113" x="135" y="425" width="23" height="14" xoffset="0" yoffset="9" xadvance="23" page="0" chnl="15" />
- <char id="1114" x="202" y="422" width="20" height="14" xoffset="1" yoffset="9" xadvance="22" page="0" chnl="15" />
- <char id="1115" x="126" y="330" width="13" height="18" xoffset="0" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="1116" x="226" y="368" width="11" height="18" xoffset="1" yoffset="5" xadvance="12" page="0" chnl="15" />
- <char id="1118" x="323" y="73" width="14" height="23" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="1119" x="413" y="382" width="12" height="17" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="1168" x="156" y="171" width="9" height="22" xoffset="2" yoffset="1" xadvance="11" page="0" chnl="15" />
- <char id="1169" x="490" y="381" width="9" height="17" xoffset="1" yoffset="6" xadvance="10" page="0" chnl="15" />
- <char id="1170" x="198" y="212" width="14" height="19" xoffset="0" yoffset="4" xadvance="13" page="0" chnl="15" />
- <char id="1171" x="352" y="448" width="10" height="14" xoffset="0" yoffset="9" xadvance="10" page="0" chnl="15" />
- <char id="1174" x="196" y="147" width="22" height="22" xoffset="0" yoffset="5" xadvance="21" page="0" chnl="15" />
- <char id="1175" x="248" y="387" width="18" height="17" xoffset="0" yoffset="9" xadvance="17" page="0" chnl="15" />
- <char id="1178" x="339" y="97" width="13" height="23" xoffset="2" yoffset="4" xadvance="14" page="0" chnl="15" />
- <char id="1179" x="166" y="368" width="11" height="18" xoffset="1" yoffset="8" xadvance="12" page="0" chnl="15" />
- <char id="1180" x="294" y="327" width="13" height="18" xoffset="2" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="1181" x="221" y="452" width="11" height="14" xoffset="1" yoffset="9" xadvance="12" page="0" chnl="15" />
- <char id="1186" x="377" y="145" width="15" height="22" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="1187" x="344" y="383" width="13" height="17" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="1198" x="90" y="313" width="14" height="18" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="1199" x="105" y="313" width="14" height="18" xoffset="0" yoffset="9" xadvance="13" page="0" chnl="15" />
- <char id="1200" x="120" y="311" width="14" height="18" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="1201" x="363" y="210" width="14" height="19" xoffset="0" yoffset="9" xadvance="13" page="0" chnl="15" />
- <char id="1202" x="344" y="145" width="16" height="22" xoffset="0" yoffset="5" xadvance="16" page="0" chnl="15" />
- <char id="1203" x="330" y="383" width="13" height="17" xoffset="0" yoffset="9" xadvance="13" page="0" chnl="15" />
- <char id="1208" x="252" y="309" width="13" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="1209" x="293" y="452" width="11" height="14" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="1210" x="411" y="286" width="14" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="1211" x="39" y="351" width="12" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="1240" x="476" y="188" width="16" height="19" xoffset="1" yoffset="4" xadvance="17" page="0" chnl="15" />
- <char id="1241" x="156" y="455" width="12" height="14" xoffset="0" yoffset="9" xadvance="13" page="0" chnl="15" />
- <char id="1256" x="352" y="190" width="17" height="19" xoffset="1" yoffset="4" xadvance="18" page="0" chnl="15" />
- <char id="1257" x="154" y="440" width="13" height="14" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="1456" x="17" y="498" width="2" height="5" xoffset="3" yoffset="23" xadvance="8" page="0" chnl="15" />
- <char id="1457" x="462" y="473" width="8" height="5" xoffset="0" yoffset="23" xadvance="8" page="0" chnl="15" />
- <char id="1458" x="479" y="471" width="7" height="5" xoffset="0" yoffset="23" xadvance="8" page="0" chnl="15" />
- <char id="1459" x="487" y="471" width="7" height="5" xoffset="1" yoffset="23" xadvance="8" page="0" chnl="15" />
- <char id="1460" x="175" y="467" width="2" height="2" xoffset="3" yoffset="25" xadvance="8" page="0" chnl="15" />
- <char id="1461" x="423" y="481" width="5" height="2" xoffset="1" yoffset="25" xadvance="8" page="0" chnl="15" />
- <char id="1462" x="501" y="471" width="5" height="5" xoffset="1" yoffset="23" xadvance="8" page="0" chnl="15" />
- <char id="1463" x="183" y="192" width="5" height="1" xoffset="1" yoffset="25" xadvance="8" page="0" chnl="15" />
- <char id="1464" x="209" y="490" width="5" height="4" xoffset="2" yoffset="24" xadvance="8" page="0" chnl="15" />
- <char id="1465" x="414" y="482" width="2" height="3" xoffset="3" yoffset="6" xadvance="8" page="0" chnl="15" />
- <char id="1466" x="411" y="482" width="2" height="3" xoffset="3" yoffset="6" xadvance="8" page="0" chnl="15" />
- <char id="1467" x="453" y="473" width="8" height="5" xoffset="0" yoffset="23" xadvance="8" page="0" chnl="15" />
- <char id="1468" x="408" y="482" width="2" height="3" xoffset="3" yoffset="14" xadvance="8" page="0" chnl="15" />
- <char id="1469" x="509" y="152" width="1" height="5" xoffset="3" yoffset="23" xadvance="8" page="0" chnl="15" />
- <char id="1470" x="330" y="486" width="8" height="3" xoffset="1" yoffset="9" xadvance="10" page="0" chnl="15" />
- <char id="1471" x="169" y="467" width="5" height="2" xoffset="1" yoffset="7" xadvance="8" page="0" chnl="15" />
- <char id="1472" x="146" y="387" width="3" height="18" xoffset="2" yoffset="7" xadvance="7" page="0" chnl="15" />
- <char id="1473" x="420" y="481" width="2" height="3" xoffset="9" yoffset="6" xadvance="8" page="0" chnl="15" />
- <char id="1474" x="417" y="482" width="2" height="3" xoffset="-3" yoffset="6" xadvance="8" page="0" chnl="15" />
- <char id="1475" x="109" y="470" width="4" height="14" xoffset="2" yoffset="9" xadvance="8" page="0" chnl="15" />
- <char id="1488" x="224" y="437" width="13" height="14" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="1489" x="266" y="437" width="13" height="14" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="1490" x="341" y="448" width="10" height="14" xoffset="0" yoffset="9" xadvance="11" page="0" chnl="15" />
- <char id="1491" x="195" y="452" width="12" height="14" xoffset="0" yoffset="9" xadvance="13" page="0" chnl="15" />
- <char id="1492" x="208" y="452" width="12" height="14" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="1493" x="114" y="470" width="4" height="14" xoffset="1" yoffset="9" xadvance="6" page="0" chnl="15" />
- <char id="1494" x="0" y="472" width="9" height="14" xoffset="1" yoffset="9" xadvance="10" page="0" chnl="15" />
- <char id="1495" x="336" y="433" width="12" height="14" xoffset="1" yoffset="9" xadvance="15" page="0" chnl="15" />
- <char id="1496" x="362" y="432" width="12" height="14" xoffset="1" yoffset="9" xadvance="15" page="0" chnl="15" />
- <char id="1497" x="287" y="481" width="4" height="8" xoffset="1" yoffset="9" xadvance="6" page="0" chnl="15" />
- <char id="1498" x="245" y="232" width="11" height="19" xoffset="0" yoffset="9" xadvance="12" page="0" chnl="15" />
- <char id="1499" x="429" y="446" width="10" height="14" xoffset="1" yoffset="9" xadvance="12" page="0" chnl="15" />
- <char id="1500" x="501" y="286" width="10" height="18" xoffset="1" yoffset="5" xadvance="12" page="0" chnl="15" />
- <char id="1501" x="401" y="431" width="12" height="14" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="1502" x="280" y="437" width="13" height="14" xoffset="0" yoffset="9" xadvance="15" page="0" chnl="15" />
- <char id="1503" x="286" y="231" width="4" height="19" xoffset="1" yoffset="9" xadvance="6" page="0" chnl="15" />
- <char id="1504" x="71" y="471" width="7" height="14" xoffset="1" yoffset="9" xadvance="9" page="0" chnl="15" />
- <char id="1505" x="210" y="437" width="13" height="14" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="1506" x="171" y="405" width="12" height="16" xoffset="0" yoffset="9" xadvance="13" page="0" chnl="15" />
- <char id="1507" x="488" y="208" width="12" height="19" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="1508" x="440" y="431" width="12" height="14" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="1509" x="221" y="232" width="11" height="19" xoffset="0" yoffset="9" xadvance="12" page="0" chnl="15" />
- <char id="1510" x="427" y="431" width="12" height="14" xoffset="0" yoffset="9" xadvance="12" page="0" chnl="15" />
- <char id="1511" x="0" y="236" width="12" height="19" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="1512" x="317" y="450" width="11" height="14" xoffset="0" yoffset="9" xadvance="12" page="0" chnl="15" />
- <char id="1513" x="434" y="416" width="16" height="14" xoffset="1" yoffset="9" xadvance="17" page="0" chnl="15" />
- <char id="1514" x="64" y="441" width="14" height="14" xoffset="0" yoffset="9" xadvance="16" page="0" chnl="15" />
- <char id="1520" x="385" y="447" width="10" height="14" xoffset="1" yoffset="9" xadvance="13" page="0" chnl="15" />
- <char id="1521" x="374" y="447" width="10" height="14" xoffset="1" yoffset="9" xadvance="13" page="0" chnl="15" />
- <char id="1522" x="202" y="481" width="10" height="8" xoffset="1" yoffset="9" xadvance="13" page="0" chnl="15" />
- <char id="1523" x="419" y="474" width="5" height="6" xoffset="1" yoffset="9" xadvance="7" page="0" chnl="15" />
- <char id="1524" x="349" y="476" width="10" height="6" xoffset="1" yoffset="9" xadvance="12" page="0" chnl="15" />
- <char id="1548" x="292" y="481" width="4" height="8" xoffset="2" yoffset="11" xadvance="7" page="0" chnl="15" />
- <char id="1563" x="430" y="461" width="4" height="12" xoffset="1" yoffset="7" xadvance="7" page="0" chnl="15" />
- <char id="1567" x="79" y="471" width="7" height="14" xoffset="1" yoffset="5" xadvance="8" page="0" chnl="15" />
- <char id="1569" x="404" y="462" width="9" height="12" xoffset="1" yoffset="10" xadvance="11" page="0" chnl="15" />
- <char id="1570" x="67" y="389" width="6" height="18" xoffset="0" yoffset="2" xadvance="5" page="0" chnl="15" />
- <char id="1571" x="508" y="208" width="3" height="19" xoffset="1" yoffset="1" xadvance="5" page="0" chnl="15" />
- <char id="1572" x="298" y="366" width="11" height="18" xoffset="0" yoffset="6" xadvance="11" page="0" chnl="15" />
- <char id="1573" x="65" y="195" width="3" height="20" xoffset="1" yoffset="5" xadvance="5" page="0" chnl="15" />
- <char id="1574" x="40" y="425" width="12" height="15" xoffset="2" yoffset="9" xadvance="15" page="0" chnl="15" />
- <char id="1575" x="506" y="399" width="3" height="15" xoffset="1" yoffset="5" xadvance="5" page="0" chnl="15" />
- <char id="1576" x="32" y="441" width="15" height="14" xoffset="0" yoffset="10" xadvance="15" page="0" chnl="15" />
- <char id="1577" x="291" y="403" width="7" height="16" xoffset="0" yoffset="4" xadvance="8" page="0" chnl="15" />
- <char id="1578" x="336" y="463" width="15" height="12" xoffset="0" yoffset="7" xadvance="15" page="0" chnl="15" />
- <char id="1579" x="0" y="442" width="15" height="14" xoffset="0" yoffset="5" xadvance="15" page="0" chnl="15" />
- <char id="1580" x="28" y="332" width="13" height="18" xoffset="1" yoffset="10" xadvance="14" page="0" chnl="15" />
- <char id="1581" x="70" y="332" width="13" height="18" xoffset="1" yoffset="10" xadvance="14" page="0" chnl="15" />
- <char id="1582" x="423" y="97" width="13" height="23" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="1583" x="467" y="460" width="7" height="11" xoffset="1" yoffset="8" xadvance="8" page="0" chnl="15" />
- <char id="1584" x="17" y="408" width="7" height="17" xoffset="1" yoffset="2" xadvance="8" page="0" chnl="15" />
- <char id="1585" x="246" y="467" width="11" height="13" xoffset="0" yoffset="11" xadvance="10" page="0" chnl="15" />
- <char id="1586" x="130" y="368" width="11" height="18" xoffset="0" yoffset="6" xadvance="10" page="0" chnl="15" />
- <char id="1587" x="124" y="470" width="21" height="13" xoffset="1" yoffset="11" xadvance="21" page="0" chnl="15" />
- <char id="1588" x="212" y="192" width="21" height="19" xoffset="1" yoffset="5" xadvance="21" page="0" chnl="15" />
- <char id="1589" x="109" y="425" width="25" height="14" xoffset="1" yoffset="10" xadvance="25" page="0" chnl="15" />
- <char id="1590" x="95" y="194" width="25" height="19" xoffset="1" yoffset="5" xadvance="25" page="0" chnl="15" />
- <char id="1591" x="127" y="408" width="14" height="16" xoffset="-1" yoffset="3" xadvance="12" page="0" chnl="15" />
- <char id="1592" x="142" y="406" width="14" height="16" xoffset="-1" yoffset="3" xadvance="12" page="0" chnl="15" />
- <char id="1593" x="459" y="168" width="13" height="20" xoffset="0" yoffset="8" xadvance="13" page="0" chnl="15" />
- <char id="1594" x="164" y="0" width="13" height="26" xoffset="0" yoffset="2" xadvance="13" page="0" chnl="15" />
- <char id="1600" x="382" y="482" width="6" height="3" xoffset="-1" yoffset="16" xadvance="5" page="0" chnl="15" />
- <char id="1601" x="25" y="408" width="18" height="16" xoffset="0" yoffset="4" xadvance="18" page="0" chnl="15" />
- <char id="1602" x="243" y="212" width="14" height="19" xoffset="0" yoffset="7" xadvance="14" page="0" chnl="15" />
- <char id="1603" x="492" y="399" width="13" height="15" xoffset="0" yoffset="4" xadvance="13" page="0" chnl="15" />
- <char id="1604" x="12" y="195" width="11" height="20" xoffset="0" yoffset="4" xadvance="11" page="0" chnl="15" />
- <char id="1605" x="282" y="403" width="8" height="16" xoffset="0" yoffset="12" xadvance="8" page="0" chnl="15" />
- <char id="1606" x="157" y="405" width="13" height="16" xoffset="0" yoffset="8" xadvance="13" page="0" chnl="15" />
- <char id="1607" x="17" y="487" width="6" height="10" xoffset="1" yoffset="10" xadvance="8" page="0" chnl="15" />
- <char id="1608" x="294" y="467" width="11" height="13" xoffset="0" yoffset="11" xadvance="11" page="0" chnl="15" />
- <char id="1609" x="233" y="467" width="12" height="13" xoffset="2" yoffset="11" xadvance="15" page="0" chnl="15" />
- <char id="1610" x="184" y="405" width="12" height="16" xoffset="2" yoffset="11" xadvance="15" page="0" chnl="15" />
- <char id="1611" x="251" y="490" width="4" height="4" xoffset="1" yoffset="2" xadvance="5" page="0" chnl="15" />
- <char id="1612" x="495" y="471" width="5" height="5" xoffset="0" yoffset="1" xadvance="5" page="0" chnl="15" />
- <char id="1613" x="507" y="469" width="4" height="5" xoffset="1" yoffset="21" xadvance="5" page="0" chnl="15" />
- <char id="1614" x="429" y="481" width="4" height="2" xoffset="1" yoffset="4" xadvance="5" page="0" chnl="15" />
- <char id="1615" x="6" y="498" width="5" height="5" xoffset="0" yoffset="1" xadvance="5" page="0" chnl="15" />
- <char id="1616" x="394" y="482" width="4" height="3" xoffset="1" yoffset="21" xadvance="5" page="0" chnl="15" />
- <char id="1617" x="191" y="490" width="5" height="4" xoffset="0" yoffset="2" xadvance="5" page="0" chnl="15" />
- <char id="1618" x="256" y="490" width="3" height="4" xoffset="1" yoffset="2" xadvance="4" page="0" chnl="15" />
- <char id="1619" x="159" y="437" width="6" height="2" xoffset="0" yoffset="3" xadvance="5" page="0" chnl="15" />
- <char id="1620" x="264" y="490" width="3" height="4" xoffset="1" yoffset="1" xadvance="5" page="0" chnl="15" />
- <char id="1621" x="268" y="490" width="3" height="4" xoffset="1" yoffset="22" xadvance="5" page="0" chnl="15" />
- <char id="1632" x="344" y="476" width="4" height="7" xoffset="4" yoffset="11" xadvance="13" page="0" chnl="15" />
- <char id="1633" x="93" y="471" width="5" height="14" xoffset="4" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="1634" x="63" y="471" width="7" height="14" xoffset="3" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="1635" x="407" y="446" width="10" height="14" xoffset="2" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="1636" x="505" y="430" width="6" height="14" xoffset="3" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="1637" x="0" y="487" width="9" height="10" xoffset="2" yoffset="7" xadvance="13" page="0" chnl="15" />
- <char id="1638" x="38" y="472" width="8" height="14" xoffset="2" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="1639" x="502" y="415" width="9" height="14" xoffset="2" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="1640" x="396" y="447" width="10" height="14" xoffset="2" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="1641" x="29" y="472" width="8" height="14" xoffset="3" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="1642" x="262" y="405" width="10" height="16" xoffset="1" yoffset="4" xadvance="12" page="0" chnl="15" />
- <char id="1643" x="435" y="473" width="3" height="6" xoffset="2" yoffset="16" xadvance="7" page="0" chnl="15" />
- <char id="1644" x="297" y="481" width="4" height="8" xoffset="2" yoffset="11" xadvance="7" page="0" chnl="15" />
- <char id="1645" x="122" y="485" width="8" height="9" xoffset="2" yoffset="4" xadvance="12" page="0" chnl="15" />
- <char id="1646" x="24" y="487" width="15" height="9" xoffset="0" yoffset="10" xadvance="15" page="0" chnl="15" />
- <char id="1647" x="463" y="399" width="14" height="15" xoffset="0" yoffset="11" xadvance="14" page="0" chnl="15" />
- <char id="1648" x="509" y="144" width="2" height="7" xoffset="0" yoffset="3" xadvance="0" page="0" chnl="15" />
- <char id="1649" x="275" y="231" width="5" height="19" xoffset="0" yoffset="1" xadvance="5" page="0" chnl="15" />
- <char id="1650" x="269" y="231" width="5" height="19" xoffset="0" yoffset="1" xadvance="5" page="0" chnl="15" />
- <char id="1651" x="59" y="195" width="5" height="20" xoffset="0" yoffset="5" xadvance="5" page="0" chnl="15" />
- <char id="1652" x="260" y="490" width="3" height="4" xoffset="1" yoffset="1" xadvance="5" page="0" chnl="15" />
- <char id="1653" x="315" y="402" width="6" height="16" xoffset="1" yoffset="4" xadvance="5" page="0" chnl="15" />
- <char id="1654" x="13" y="236" width="12" height="19" xoffset="0" yoffset="5" xadvance="11" page="0" chnl="15" />
- <char id="1655" x="26" y="236" width="12" height="19" xoffset="0" yoffset="5" xadvance="11" page="0" chnl="15" />
- <char id="1656" x="333" y="210" width="14" height="19" xoffset="2" yoffset="5" xadvance="15" page="0" chnl="15" />
- <char id="1657" x="267" y="385" width="15" height="17" xoffset="0" yoffset="2" xadvance="15" page="0" chnl="15" />
- <char id="1658" x="447" y="399" width="15" height="15" xoffset="0" yoffset="4" xadvance="15" page="0" chnl="15" />
- <char id="1659" x="95" y="408" width="15" height="16" xoffset="0" yoffset="10" xadvance="15" page="0" chnl="15" />
- <char id="1660" x="399" y="400" width="15" height="15" xoffset="0" yoffset="7" xadvance="15" page="0" chnl="15" />
- <char id="1661" x="415" y="400" width="15" height="15" xoffset="0" yoffset="4" xadvance="15" page="0" chnl="15" />
- <char id="1662" x="111" y="408" width="15" height="16" xoffset="0" yoffset="10" xadvance="15" page="0" chnl="15" />
- <char id="1663" x="431" y="400" width="15" height="15" xoffset="0" yoffset="4" xadvance="15" page="0" chnl="15" />
- <char id="1664" x="283" y="385" width="15" height="17" xoffset="0" yoffset="10" xadvance="15" page="0" chnl="15" />
- <char id="1665" x="355" y="0" width="13" height="24" xoffset="1" yoffset="4" xadvance="14" page="0" chnl="15" />
- <char id="1666" x="150" y="0" width="13" height="26" xoffset="1" yoffset="2" xadvance="14" page="0" chnl="15" />
- <char id="1667" x="280" y="328" width="13" height="18" xoffset="1" yoffset="10" xadvance="14" page="0" chnl="15" />
- <char id="1668" x="266" y="328" width="13" height="18" xoffset="1" yoffset="10" xadvance="14" page="0" chnl="15" />
- <char id="1669" x="14" y="0" width="13" height="27" xoffset="1" yoffset="1" xadvance="14" page="0" chnl="15" />
- <char id="1670" x="238" y="328" width="13" height="18" xoffset="1" yoffset="10" xadvance="14" page="0" chnl="15" />
- <char id="1671" x="224" y="330" width="13" height="18" xoffset="1" yoffset="10" xadvance="14" page="0" chnl="15" />
- <char id="1672" x="43" y="389" width="7" height="18" xoffset="1" yoffset="1" xadvance="8" page="0" chnl="15" />
- <char id="1673" x="55" y="471" width="7" height="14" xoffset="1" yoffset="8" xadvance="8" page="0" chnl="15" />
- <char id="1674" x="299" y="403" width="7" height="16" xoffset="1" yoffset="8" xadvance="8" page="0" chnl="15" />
- <char id="1675" x="504" y="120" width="7" height="23" xoffset="1" yoffset="1" xadvance="8" page="0" chnl="15" />
- <char id="1676" x="9" y="408" width="7" height="17" xoffset="1" yoffset="2" xadvance="8" page="0" chnl="15" />
- <char id="1677" x="307" y="403" width="7" height="16" xoffset="1" yoffset="8" xadvance="8" page="0" chnl="15" />
- <char id="1678" x="27" y="389" width="7" height="18" xoffset="1" yoffset="1" xadvance="8" page="0" chnl="15" />
- <char id="1679" x="484" y="362" width="8" height="18" xoffset="0" yoffset="1" xadvance="8" page="0" chnl="15" />
- <char id="1680" x="493" y="362" width="8" height="18" xoffset="0" yoffset="1" xadvance="8" page="0" chnl="15" />
- <char id="1681" x="144" y="171" width="11" height="22" xoffset="0" yoffset="2" xadvance="10" page="0" chnl="15" />
- <char id="1682" x="478" y="381" width="11" height="17" xoffset="0" yoffset="7" xadvance="10" page="0" chnl="15" />
- <char id="1683" x="305" y="450" width="11" height="14" xoffset="0" yoffset="11" xadvance="10" page="0" chnl="15" />
- <char id="1684" x="210" y="405" width="12" height="16" xoffset="0" yoffset="11" xadvance="10" page="0" chnl="15" />
- <char id="1685" x="223" y="405" width="12" height="16" xoffset="0" yoffset="11" xadvance="10" page="0" chnl="15" />
- <char id="1686" x="236" y="405" width="12" height="16" xoffset="0" yoffset="11" xadvance="10" page="0" chnl="15" />
- <char id="1687" x="154" y="368" width="11" height="18" xoffset="0" yoffset="6" xadvance="10" page="0" chnl="15" />
- <char id="1688" x="499" y="167" width="11" height="20" xoffset="0" yoffset="4" xadvance="10" page="0" chnl="15" />
- <char id="1689" x="296" y="168" width="11" height="21" xoffset="0" yoffset="3" xadvance="10" page="0" chnl="15" />
- <char id="1690" x="150" y="387" width="21" height="17" xoffset="1" yoffset="7" xadvance="21" page="0" chnl="15" />
- <char id="1691" x="322" y="402" width="21" height="15" xoffset="1" yoffset="11" xadvance="21" page="0" chnl="15" />
- <char id="1692" x="209" y="170" width="21" height="21" xoffset="1" yoffset="5" xadvance="21" page="0" chnl="15" />
- <char id="1693" x="83" y="425" width="25" height="14" xoffset="1" yoffset="10" xadvance="25" page="0" chnl="15" />
- <char id="1694" x="183" y="170" width="25" height="21" xoffset="1" yoffset="3" xadvance="25" page="0" chnl="15" />
- <char id="1695" x="315" y="384" width="14" height="17" xoffset="-1" yoffset="2" xadvance="12" page="0" chnl="15" />
- <char id="1696" x="0" y="0" width="13" height="27" xoffset="0" yoffset="1" xadvance="13" page="0" chnl="15" />
- <char id="1697" x="435" y="461" width="18" height="11" xoffset="0" yoffset="9" xadvance="18" page="0" chnl="15" />
- <char id="1698" x="364" y="401" width="18" height="15" xoffset="0" yoffset="9" xadvance="18" page="0" chnl="15" />
- <char id="1699" x="381" y="168" width="18" height="20" xoffset="0" yoffset="4" xadvance="18" page="0" chnl="15" />
- <char id="1700" x="315" y="190" width="18" height="19" xoffset="0" yoffset="1" xadvance="18" page="0" chnl="15" />
- <char id="1701" x="172" y="387" width="18" height="17" xoffset="0" yoffset="9" xadvance="18" page="0" chnl="15" />
- <char id="1702" x="78" y="275" width="18" height="18" xoffset="0" yoffset="2" xadvance="18" page="0" chnl="15" />
- <char id="1703" x="416" y="168" width="14" height="20" xoffset="0" yoffset="6" xadvance="14" page="0" chnl="15" />
- <char id="1704" x="408" y="145" width="14" height="22" xoffset="0" yoffset="4" xadvance="14" page="0" chnl="15" />
- <char id="1705" x="303" y="420" width="18" height="14" xoffset="0" yoffset="5" xadvance="18" page="0" chnl="15" />
- <char id="1706" x="146" y="470" width="18" height="13" xoffset="0" yoffset="6" xadvance="18" page="0" chnl="15" />
- <char id="1707" x="341" y="418" width="18" height="14" xoffset="0" yoffset="5" xadvance="18" page="0" chnl="15" />
- <char id="1708" x="448" y="305" width="13" height="18" xoffset="0" yoffset="1" xadvance="13" page="0" chnl="15" />
- <char id="1709" x="386" y="382" width="13" height="17" xoffset="0" yoffset="2" xadvance="13" page="0" chnl="15" />
- <char id="1710" x="453" y="145" width="13" height="22" xoffset="0" yoffset="4" xadvance="13" page="0" chnl="15" />
- <char id="1711" x="191" y="387" width="18" height="17" xoffset="0" yoffset="2" xadvance="18" page="0" chnl="15" />
- <char id="1712" x="210" y="387" width="18" height="17" xoffset="0" yoffset="2" xadvance="18" page="0" chnl="15" />
- <char id="1713" x="135" y="273" width="18" height="18" xoffset="0" yoffset="1" xadvance="18" page="0" chnl="15" />
- <char id="1714" x="219" y="147" width="18" height="22" xoffset="0" yoffset="2" xadvance="18" page="0" chnl="15" />
- <char id="1715" x="268" y="0" width="18" height="24" xoffset="0" yoffset="2" xadvance="18" page="0" chnl="15" />
- <char id="1716" x="493" y="228" width="18" height="18" xoffset="0" yoffset="1" xadvance="18" page="0" chnl="15" />
- <char id="1717" x="423" y="121" width="11" height="23" xoffset="0" yoffset="1" xadvance="11" page="0" chnl="15" />
- <char id="1718" x="435" y="121" width="11" height="23" xoffset="0" yoffset="1" xadvance="11" page="0" chnl="15" />
- <char id="1719" x="459" y="120" width="11" height="23" xoffset="0" yoffset="1" xadvance="11" page="0" chnl="15" />
- <char id="1720" x="447" y="121" width="11" height="23" xoffset="0" yoffset="4" xadvance="11" page="0" chnl="15" />
- <char id="1721" x="431" y="168" width="13" height="20" xoffset="0" yoffset="8" xadvance="13" page="0" chnl="15" />
- <char id="1722" x="179" y="467" width="13" height="13" xoffset="0" yoffset="11" xadvance="13" page="0" chnl="15" />
- <char id="1723" x="268" y="169" width="13" height="21" xoffset="0" yoffset="3" xadvance="13" page="0" chnl="15" />
- <char id="1724" x="420" y="209" width="13" height="19" xoffset="0" yoffset="8" xadvance="13" page="0" chnl="15" />
- <char id="1725" x="445" y="168" width="13" height="20" xoffset="0" yoffset="4" xadvance="13" page="0" chnl="15" />
- <char id="1726" x="282" y="467" width="11" height="13" xoffset="-1" yoffset="7" xadvance="11" page="0" chnl="15" />
- <char id="1727" x="369" y="0" width="13" height="24" xoffset="1" yoffset="4" xadvance="14" page="0" chnl="15" />
- <char id="1728" x="76" y="425" width="6" height="15" xoffset="1" yoffset="5" xadvance="8" page="0" chnl="15" />
- <char id="1729" x="213" y="481" width="9" height="8" xoffset="0" yoffset="13" xadvance="9" page="0" chnl="15" />
- <char id="1730" x="306" y="465" width="9" height="13" xoffset="0" yoffset="8" xadvance="9" page="0" chnl="15" />
- <char id="1731" x="481" y="445" width="9" height="14" xoffset="0" yoffset="7" xadvance="9" page="0" chnl="15" />
- <char id="1732" x="270" y="467" width="11" height="13" xoffset="0" yoffset="11" xadvance="11" page="0" chnl="15" />
- <char id="1733" x="258" y="467" width="11" height="13" xoffset="0" yoffset="11" xadvance="11" page="0" chnl="15" />
- <char id="1734" x="250" y="366" width="11" height="18" xoffset="0" yoffset="6" xadvance="11" page="0" chnl="15" />
- <char id="1735" x="0" y="195" width="11" height="20" xoffset="0" yoffset="4" xadvance="11" page="0" chnl="15" />
- <char id="1736" x="320" y="168" width="11" height="21" xoffset="0" yoffset="3" xadvance="11" page="0" chnl="15" />
- <char id="1737" x="190" y="368" width="11" height="18" xoffset="0" yoffset="6" xadvance="11" page="0" chnl="15" />
- <char id="1738" x="286" y="366" width="11" height="18" xoffset="0" yoffset="6" xadvance="11" page="0" chnl="15" />
- <char id="1739" x="308" y="168" width="11" height="21" xoffset="0" yoffset="3" xadvance="11" page="0" chnl="15" />
- <char id="1740" x="220" y="467" width="12" height="13" xoffset="2" yoffset="11" xadvance="15" page="0" chnl="15" />
- <char id="1741" x="165" y="470" width="13" height="13" xoffset="1" yoffset="11" xadvance="15" page="0" chnl="15" />
- <char id="1742" x="27" y="425" width="12" height="15" xoffset="2" yoffset="9" xadvance="15" page="0" chnl="15" />
- <char id="1743" x="233" y="232" width="11" height="19" xoffset="0" yoffset="5" xadvance="11" page="0" chnl="15" />
- <char id="1744" x="249" y="405" width="12" height="16" xoffset="2" yoffset="11" xadvance="15" page="0" chnl="15" />
- <char id="1745" x="197" y="405" width="12" height="16" xoffset="2" yoffset="11" xadvance="15" page="0" chnl="15" />
- <char id="1746" x="316" y="465" width="19" height="12" xoffset="0" yoffset="11" xadvance="19" page="0" chnl="15" />
- <char id="1747" x="344" y="401" width="19" height="15" xoffset="0" yoffset="8" xadvance="19" page="0" chnl="15" />
- <char id="1748" x="389" y="482" width="4" height="3" xoffset="0" yoffset="16" xadvance="5" page="0" chnl="15" />
- <char id="1749" x="10" y="487" width="6" height="10" xoffset="1" yoffset="10" xadvance="8" page="0" chnl="15" />
- <char id="1750" x="81" y="486" width="12" height="9" xoffset="-6" yoffset="1" xadvance="0" page="0" chnl="15" />
- <char id="1751" x="94" y="486" width="9" height="9" xoffset="-5" yoffset="1" xadvance="0" page="0" chnl="15" />
- <char id="1752" x="215" y="490" width="5" height="4" xoffset="-2" yoffset="6" xadvance="0" page="0" chnl="15" />
- <char id="1753" x="256" y="481" width="5" height="8" xoffset="-2" yoffset="2" xadvance="0" page="0" chnl="15" />
- <char id="1754" x="156" y="484" width="6" height="9" xoffset="-3" yoffset="1" xadvance="0" page="0" chnl="15" />
- <char id="1755" x="404" y="482" width="3" height="3" xoffset="-1" yoffset="7" xadvance="0" page="0" chnl="15" />
- <char id="1756" x="360" y="476" width="10" height="6" xoffset="-5" yoffset="4" xadvance="0" page="0" chnl="15" />
- <char id="1757" x="55" y="0" width="26" height="26" xoffset="0" yoffset="1" xadvance="27" page="0" chnl="15" />
- <char id="1758" x="28" y="0" width="26" height="26" xoffset="0" yoffset="1" xadvance="26" page="0" chnl="15" />
- <char id="1759" x="440" y="479" width="2" height="2" xoffset="-1" yoffset="8" xadvance="0" page="0" chnl="15" />
- <char id="1760" x="437" y="480" width="2" height="2" xoffset="-1" yoffset="8" xadvance="0" page="0" chnl="15" />
- <char id="1761" x="158" y="494" width="7" height="4" xoffset="-3" yoffset="6" xadvance="0" page="0" chnl="15" />
- <char id="1762" x="272" y="481" width="4" height="8" xoffset="-2" yoffset="2" xadvance="0" page="0" chnl="15" />
- <char id="1763" x="322" y="478" width="10" height="7" xoffset="-5" yoffset="21" xadvance="0" page="0" chnl="15" />
- <char id="1764" x="190" y="212" width="3" height="1" xoffset="-1" yoffset="9" xadvance="0" page="0" chnl="15" />
- <char id="1765" x="333" y="478" width="5" height="7" xoffset="0" yoffset="3" xadvance="5" page="0" chnl="15" />
- <char id="1766" x="402" y="475" width="9" height="6" xoffset="0" yoffset="4" xadvance="9" page="0" chnl="15" />
- <char id="1767" x="382" y="475" width="9" height="6" xoffset="-4" yoffset="4" xadvance="0" page="0" chnl="15" />
- <char id="1768" x="249" y="481" width="6" height="8" xoffset="-3" yoffset="2" xadvance="0" page="0" chnl="15" />
- <char id="1769" x="282" y="169" width="13" height="21" xoffset="1" yoffset="2" xadvance="14" page="0" chnl="15" />
- <char id="1770" x="12" y="498" width="4" height="5" xoffset="-2" yoffset="22" xadvance="0" page="0" chnl="15" />
- <char id="1771" x="231" y="490" width="4" height="4" xoffset="-2" yoffset="6" xadvance="0" page="0" chnl="15" />
- <char id="1772" x="434" y="481" width="2" height="2" xoffset="-1" yoffset="8" xadvance="0" page="0" chnl="15" />
- <char id="1773" x="282" y="481" width="4" height="8" xoffset="-2" yoffset="20" xadvance="0" page="0" chnl="15" />
- <char id="1776" x="339" y="476" width="4" height="7" xoffset="4" yoffset="11" xadvance="13" page="0" chnl="15" />
- <char id="1777" x="87" y="471" width="5" height="14" xoffset="4" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="1778" x="47" y="471" width="7" height="14" xoffset="3" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="1779" x="363" y="447" width="10" height="14" xoffset="2" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="1780" x="501" y="445" width="9" height="14" xoffset="2" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="1781" x="491" y="445" width="9" height="14" xoffset="2" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="1782" x="471" y="445" width="9" height="14" xoffset="2" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="1783" x="461" y="445" width="9" height="14" xoffset="2" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="1784" x="440" y="446" width="10" height="14" xoffset="2" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="1785" x="20" y="472" width="8" height="14" xoffset="3" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="1786" x="234" y="192" width="21" height="19" xoffset="1" yoffset="5" xadvance="21" page="0" chnl="15" />
- <char id="1787" x="69" y="195" width="25" height="19" xoffset="1" yoffset="5" xadvance="25" page="0" chnl="15" />
- <char id="1788" x="178" y="0" width="13" height="26" xoffset="0" yoffset="2" xadvance="13" page="0" chnl="15" />
- <char id="1789" x="500" y="381" width="9" height="17" xoffset="1" yoffset="10" xadvance="11" page="0" chnl="15" />
- <char id="1790" x="273" y="403" width="8" height="16" xoffset="0" yoffset="12" xadvance="8" page="0" chnl="15" />
- <char id="7808" x="468" y="0" width="23" height="23" xoffset="0" yoffset="0" xadvance="22" page="0" chnl="15" />
- <char id="7809" x="174" y="254" width="20" height="18" xoffset="0" yoffset="5" xadvance="19" page="0" chnl="15" />
- <char id="7810" x="24" y="28" width="23" height="23" xoffset="0" yoffset="0" xadvance="22" page="0" chnl="15" />
- <char id="7811" x="195" y="254" width="20" height="18" xoffset="0" yoffset="5" xadvance="19" page="0" chnl="15" />
- <char id="7812" x="444" y="0" width="23" height="23" xoffset="0" yoffset="0" xadvance="22" page="0" chnl="15" />
- <char id="7813" x="216" y="252" width="20" height="18" xoffset="0" yoffset="5" xadvance="19" page="0" chnl="15" />
- <char id="7840" x="330" y="25" width="17" height="23" xoffset="0" yoffset="5" xadvance="16" page="0" chnl="15" />
- <char id="7841" x="39" y="236" width="12" height="19" xoffset="1" yoffset="9" xadvance="13" page="0" chnl="15" />
- <char id="7842" x="348" y="25" width="17" height="23" xoffset="0" yoffset="0" xadvance="16" page="0" chnl="15" />
- <char id="7843" x="78" y="236" width="12" height="19" xoffset="1" yoffset="4" xadvance="13" page="0" chnl="15" />
- <char id="7844" x="144" y="51" width="17" height="23" xoffset="0" yoffset="0" xadvance="16" page="0" chnl="15" />
- <char id="7845" x="176" y="123" width="12" height="23" xoffset="1" yoffset="0" xadvance="13" page="0" chnl="15" />
- <char id="7846" x="36" y="52" width="17" height="23" xoffset="0" yoffset="0" xadvance="16" page="0" chnl="15" />
- <char id="7847" x="150" y="123" width="12" height="23" xoffset="1" yoffset="0" xadvance="13" page="0" chnl="15" />
- <char id="7848" x="420" y="24" width="17" height="23" xoffset="0" yoffset="0" xadvance="16" page="0" chnl="15" />
- <char id="7849" x="137" y="123" width="12" height="23" xoffset="1" yoffset="0" xadvance="13" page="0" chnl="15" />
- <char id="7850" x="432" y="48" width="17" height="23" xoffset="0" yoffset="0" xadvance="16" page="0" chnl="15" />
- <char id="7851" x="40" y="172" width="12" height="22" xoffset="1" yoffset="1" xadvance="13" page="0" chnl="15" />
- <char id="7852" x="82" y="0" width="17" height="26" xoffset="0" yoffset="2" xadvance="16" page="0" chnl="15" />
- <char id="7853" x="124" y="123" width="12" height="23" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="7854" x="198" y="51" width="17" height="23" xoffset="0" yoffset="0" xadvance="16" page="0" chnl="15" />
- <char id="7855" x="111" y="123" width="12" height="23" xoffset="1" yoffset="0" xadvance="13" page="0" chnl="15" />
- <char id="7856" x="384" y="25" width="17" height="23" xoffset="0" yoffset="0" xadvance="16" page="0" chnl="15" />
- <char id="7857" x="98" y="123" width="12" height="23" xoffset="1" yoffset="0" xadvance="13" page="0" chnl="15" />
- <char id="7858" x="456" y="24" width="17" height="23" xoffset="0" yoffset="0" xadvance="16" page="0" chnl="15" />
- <char id="7859" x="410" y="121" width="12" height="23" xoffset="1" yoffset="0" xadvance="13" page="0" chnl="15" />
- <char id="7860" x="438" y="24" width="17" height="23" xoffset="0" yoffset="0" xadvance="16" page="0" chnl="15" />
- <char id="7861" x="53" y="172" width="12" height="22" xoffset="1" yoffset="1" xadvance="13" page="0" chnl="15" />
- <char id="7862" x="118" y="0" width="17" height="26" xoffset="0" yoffset="2" xadvance="16" page="0" chnl="15" />
- <char id="7863" x="397" y="121" width="12" height="23" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="7864" x="395" y="97" width="13" height="23" xoffset="2" yoffset="5" xadvance="16" page="0" chnl="15" />
- <char id="7865" x="117" y="234" width="12" height="19" xoffset="1" yoffset="9" xadvance="13" page="0" chnl="15" />
- <char id="7866" x="255" y="98" width="13" height="23" xoffset="2" yoffset="0" xadvance="16" page="0" chnl="15" />
- <char id="7867" x="130" y="234" width="12" height="19" xoffset="1" yoffset="4" xadvance="13" page="0" chnl="15" />
- <char id="7868" x="269" y="97" width="13" height="23" xoffset="2" yoffset="0" xadvance="16" page="0" chnl="15" />
- <char id="7869" x="377" y="344" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="7870" x="381" y="97" width="13" height="23" xoffset="2" yoffset="0" xadvance="16" page="0" chnl="15" />
- <char id="7871" x="241" y="122" width="12" height="23" xoffset="1" yoffset="0" xadvance="13" page="0" chnl="15" />
- <char id="7872" x="437" y="97" width="13" height="23" xoffset="2" yoffset="0" xadvance="16" page="0" chnl="15" />
- <char id="7873" x="371" y="121" width="12" height="23" xoffset="1" yoffset="0" xadvance="13" page="0" chnl="15" />
- <char id="7874" x="451" y="96" width="13" height="23" xoffset="2" yoffset="0" xadvance="16" page="0" chnl="15" />
- <char id="7875" x="358" y="121" width="12" height="23" xoffset="1" yoffset="0" xadvance="13" page="0" chnl="15" />
- <char id="7876" x="465" y="96" width="13" height="23" xoffset="2" yoffset="0" xadvance="16" page="0" chnl="15" />
- <char id="7877" x="66" y="172" width="12" height="22" xoffset="1" yoffset="1" xadvance="13" page="0" chnl="15" />
- <char id="7878" x="136" y="0" width="13" height="26" xoffset="2" yoffset="2" xadvance="16" page="0" chnl="15" />
- <char id="7879" x="345" y="121" width="12" height="23" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="7880" x="95" y="147" width="6" height="23" xoffset="0" yoffset="0" xadvance="6" page="0" chnl="15" />
- <char id="7881" x="501" y="208" width="6" height="19" xoffset="0" yoffset="4" xadvance="6" page="0" chnl="15" />
- <char id="7882" x="507" y="96" width="4" height="23" xoffset="1" yoffset="5" xadvance="6" page="0" chnl="15" />
- <char id="7883" x="155" y="147" width="4" height="23" xoffset="1" yoffset="5" xadvance="6" page="0" chnl="15" />
- <char id="7884" x="305" y="0" width="17" height="24" xoffset="1" yoffset="4" xadvance="18" page="0" chnl="15" />
- <char id="7885" x="448" y="209" width="13" height="19" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="7886" x="180" y="51" width="17" height="23" xoffset="1" yoffset="0" xadvance="18" page="0" chnl="15" />
- <char id="7887" x="378" y="210" width="13" height="19" xoffset="1" yoffset="4" xadvance="14" page="0" chnl="15" />
- <char id="7888" x="162" y="51" width="17" height="23" xoffset="1" yoffset="0" xadvance="18" page="0" chnl="15" />
- <char id="7889" x="325" y="97" width="13" height="23" xoffset="1" yoffset="0" xadvance="14" page="0" chnl="15" />
- <char id="7890" x="366" y="25" width="17" height="23" xoffset="1" yoffset="0" xadvance="18" page="0" chnl="15" />
- <char id="7891" x="28" y="124" width="13" height="23" xoffset="1" yoffset="0" xadvance="14" page="0" chnl="15" />
- <char id="7892" x="108" y="51" width="17" height="23" xoffset="1" yoffset="0" xadvance="18" page="0" chnl="15" />
- <char id="7893" x="42" y="124" width="13" height="23" xoffset="1" yoffset="0" xadvance="14" page="0" chnl="15" />
- <char id="7894" x="90" y="51" width="17" height="23" xoffset="1" yoffset="0" xadvance="18" page="0" chnl="15" />
- <char id="7895" x="0" y="172" width="13" height="22" xoffset="1" yoffset="1" xadvance="14" page="0" chnl="15" />
- <char id="7896" x="100" y="0" width="17" height="26" xoffset="1" yoffset="2" xadvance="18" page="0" chnl="15" />
- <char id="7897" x="409" y="97" width="13" height="23" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="7898" x="116" y="27" width="20" height="23" xoffset="1" yoffset="0" xadvance="20" page="0" chnl="15" />
- <char id="7899" x="136" y="292" width="16" height="18" xoffset="1" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="7900" x="137" y="27" width="20" height="23" xoffset="1" yoffset="0" xadvance="20" page="0" chnl="15" />
- <char id="7901" x="102" y="294" width="16" height="18" xoffset="1" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="7902" x="95" y="27" width="20" height="23" xoffset="1" yoffset="0" xadvance="20" page="0" chnl="15" />
- <char id="7903" x="442" y="189" width="16" height="19" xoffset="1" yoffset="4" xadvance="17" page="0" chnl="15" />
- <char id="7904" x="158" y="27" width="20" height="23" xoffset="1" yoffset="0" xadvance="20" page="0" chnl="15" />
- <char id="7905" x="0" y="294" width="16" height="18" xoffset="1" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="7906" x="228" y="0" width="20" height="24" xoffset="1" yoffset="4" xadvance="20" page="0" chnl="15" />
- <char id="7907" x="102" y="214" width="16" height="19" xoffset="1" yoffset="9" xadvance="17" page="0" chnl="15" />
- <char id="7908" x="60" y="100" width="14" height="23" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="7909" x="143" y="234" width="12" height="19" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="7910" x="90" y="99" width="14" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
- <char id="7911" x="156" y="234" width="12" height="19" xoffset="1" yoffset="4" xadvance="14" page="0" chnl="15" />
- <char id="7912" x="218" y="26" width="18" height="23" xoffset="2" yoffset="0" xadvance="20" page="0" chnl="15" />
- <char id="7913" x="85" y="294" width="16" height="18" xoffset="1" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="7914" x="199" y="26" width="18" height="23" xoffset="2" yoffset="0" xadvance="20" page="0" chnl="15" />
- <char id="7915" x="68" y="294" width="16" height="18" xoffset="1" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="7916" x="237" y="25" width="18" height="23" xoffset="2" yoffset="0" xadvance="20" page="0" chnl="15" />
- <char id="7917" x="34" y="216" width="16" height="19" xoffset="1" yoffset="4" xadvance="17" page="0" chnl="15" />
- <char id="7918" x="275" y="25" width="18" height="23" xoffset="2" yoffset="0" xadvance="20" page="0" chnl="15" />
- <char id="7919" x="51" y="294" width="16" height="18" xoffset="1" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="7920" x="256" y="25" width="18" height="23" xoffset="2" yoffset="5" xadvance="20" page="0" chnl="15" />
- <char id="7921" x="68" y="216" width="16" height="19" xoffset="1" yoffset="9" xadvance="17" page="0" chnl="15" />
- <char id="7922" x="18" y="52" width="17" height="23" xoffset="0" yoffset="0" xadvance="16" page="0" chnl="15" />
- <char id="7923" x="180" y="99" width="14" height="23" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="7924" x="216" y="50" width="17" height="23" xoffset="0" yoffset="5" xadvance="16" page="0" chnl="15" />
- <char id="7925" x="318" y="210" width="14" height="19" xoffset="0" yoffset="9" xadvance="13" page="0" chnl="15" />
- <char id="7926" x="234" y="50" width="17" height="23" xoffset="0" yoffset="0" xadvance="16" page="0" chnl="15" />
- <char id="7927" x="340" y="0" width="14" height="24" xoffset="0" yoffset="4" xadvance="13" page="0" chnl="15" />
- <char id="7928" x="126" y="51" width="17" height="23" xoffset="0" yoffset="0" xadvance="16" page="0" chnl="15" />
- <char id="7929" x="488" y="72" width="14" height="23" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="8204" x="510" y="24" width="1" height="19" xoffset="0" yoffset="7" xadvance="0" page="0" chnl="15" />
- <char id="8205" x="346" y="168" width="6" height="21" xoffset="-2" yoffset="5" xadvance="0" page="0" chnl="15" />
- <char id="8206" x="24" y="195" width="6" height="20" xoffset="0" yoffset="6" xadvance="0" page="0" chnl="15" />
- <char id="8207" x="31" y="195" width="6" height="20" xoffset="-5" yoffset="6" xadvance="0" page="0" chnl="15" />
- <char id="8211" x="89" y="496" width="14" height="4" xoffset="0" yoffset="14" xadvance="13" page="0" chnl="15" />
- <char id="8212" x="20" y="498" width="24" height="4" xoffset="0" yoffset="14" xadvance="24" page="0" chnl="15" />
- <char id="8213" x="45" y="497" width="22" height="4" xoffset="1" yoffset="14" xadvance="24" page="0" chnl="15" />
- <char id="8215" x="307" y="479" width="14" height="7" xoffset="0" yoffset="21" xadvance="13" page="0" chnl="15" />
- <char id="8216" x="302" y="481" width="4" height="8" xoffset="1" yoffset="5" xadvance="6" page="0" chnl="15" />
- <char id="8217" x="262" y="481" width="4" height="8" xoffset="1" yoffset="5" xadvance="6" page="0" chnl="15" />
- <char id="8218" x="267" y="481" width="4" height="8" xoffset="1" yoffset="19" xadvance="6" page="0" chnl="15" />
- <char id="8219" x="277" y="481" width="4" height="8" xoffset="1" yoffset="5" xadvance="6" page="0" chnl="15" />
- <char id="8220" x="169" y="484" width="10" height="8" xoffset="1" yoffset="5" xadvance="12" page="0" chnl="15" />
- <char id="8221" x="191" y="481" width="10" height="8" xoffset="1" yoffset="5" xadvance="12" page="0" chnl="15" />
- <char id="8222" x="180" y="481" width="10" height="8" xoffset="1" yoffset="19" xadvance="12" page="0" chnl="15" />
- <char id="8224" x="14" y="172" width="12" height="22" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="8225" x="481" y="144" width="13" height="22" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="8226" x="241" y="481" width="7" height="8" xoffset="1" yoffset="10" xadvance="8" page="0" chnl="15" />
- <char id="8230" x="68" y="496" width="20" height="4" xoffset="2" yoffset="19" xadvance="24" page="0" chnl="15" />
- <char id="8234" x="81" y="389" width="6" height="18" xoffset="0" yoffset="8" xadvance="0" page="0" chnl="15" />
- <char id="8235" x="74" y="389" width="6" height="18" xoffset="-5" yoffset="8" xadvance="0" page="0" chnl="15" />
- <char id="8236" x="38" y="195" width="6" height="20" xoffset="-3" yoffset="6" xadvance="0" page="0" chnl="15" />
- <char id="8237" x="339" y="168" width="6" height="21" xoffset="-3" yoffset="5" xadvance="0" page="0" chnl="15" />
- <char id="8238" x="332" y="168" width="6" height="21" xoffset="-3" yoffset="5" xadvance="0" page="0" chnl="15" />
- <char id="8240" x="345" y="230" width="25" height="18" xoffset="0" yoffset="5" xadvance="24" page="0" chnl="15" />
- <char id="8242" x="425" y="474" width="4" height="6" xoffset="2" yoffset="5" xadvance="6" page="0" chnl="15" />
- <char id="8243" x="371" y="475" width="10" height="6" xoffset="1" yoffset="5" xadvance="11" page="0" chnl="15" />
- <char id="8249" x="422" y="461" width="7" height="12" xoffset="1" yoffset="10" xadvance="8" page="0" chnl="15" />
- <char id="8250" x="414" y="461" width="7" height="12" xoffset="1" yoffset="10" xadvance="8" page="0" chnl="15" />
- <char id="8252" x="358" y="364" width="10" height="18" xoffset="2" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="8254" x="302" y="490" width="9" height="3" xoffset="0" yoffset="6" xadvance="8" page="0" chnl="15" />
- <char id="8260" x="378" y="306" width="13" height="18" xoffset="-4" yoffset="5" xadvance="4" page="0" chnl="15" />
- <char id="8298" x="353" y="168" width="6" height="21" xoffset="-3" yoffset="5" xadvance="0" page="0" chnl="15" />
- <char id="8299" x="367" y="168" width="6" height="21" xoffset="-3" yoffset="5" xadvance="0" page="0" chnl="15" />
- <char id="8300" x="374" y="168" width="6" height="21" xoffset="-3" yoffset="5" xadvance="0" page="0" chnl="15" />
- <char id="8301" x="45" y="195" width="6" height="20" xoffset="-3" yoffset="6" xadvance="0" page="0" chnl="15" />
- <char id="8302" x="52" y="195" width="6" height="20" xoffset="-3" yoffset="6" xadvance="0" page="0" chnl="15" />
- <char id="8303" x="360" y="168" width="6" height="21" xoffset="-3" yoffset="5" xadvance="0" page="0" chnl="15" />
- <char id="8319" x="131" y="484" width="8" height="9" xoffset="1" yoffset="8" xadvance="9" page="0" chnl="15" />
- <char id="8355" x="42" y="332" width="13" height="18" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="8356" x="266" y="309" width="13" height="18" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="8359" x="291" y="231" width="27" height="18" xoffset="0" yoffset="5" xadvance="27" page="0" chnl="15" />
- <char id="8362" x="416" y="416" width="17" height="14" xoffset="1" yoffset="9" xadvance="19" page="0" chnl="15" />
- <char id="8363" x="65" y="425" width="10" height="15" xoffset="1" yoffset="5" xadvance="12" page="0" chnl="15" />
- <char id="8364" x="406" y="209" width="13" height="19" xoffset="0" yoffset="4" xadvance="13" page="0" chnl="15" />
- <char id="8453" x="23" y="256" width="21" height="18" xoffset="0" yoffset="5" xadvance="21" page="0" chnl="15" />
- <char id="8467" x="214" y="368" width="11" height="18" xoffset="0" yoffset="5" xadvance="11" page="0" chnl="15" />
- <char id="8470" x="371" y="230" width="24" height="18" xoffset="2" yoffset="5" xadvance="27" page="0" chnl="15" />
- <char id="8482" x="475" y="460" width="19" height="10" xoffset="2" yoffset="5" xadvance="24" page="0" chnl="15" />
- <char id="8486" x="406" y="189" width="17" height="19" xoffset="0" yoffset="4" xadvance="18" page="0" chnl="15" />
- <char id="8494" x="322" y="433" width="13" height="14" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
- <char id="8531" x="400" y="248" width="19" height="18" xoffset="1" yoffset="5" xadvance="20" page="0" chnl="15" />
- <char id="8532" x="360" y="249" width="19" height="18" xoffset="0" yoffset="5" xadvance="20" page="0" chnl="15" />
- <char id="8539" x="320" y="249" width="19" height="18" xoffset="1" yoffset="5" xadvance="20" page="0" chnl="15" />
- <char id="8540" x="300" y="250" width="19" height="18" xoffset="0" yoffset="5" xadvance="20" page="0" chnl="15" />
- <char id="8541" x="0" y="275" width="19" height="18" xoffset="0" yoffset="5" xadvance="20" page="0" chnl="15" />
- <char id="8542" x="20" y="275" width="19" height="18" xoffset="0" yoffset="5" xadvance="20" page="0" chnl="15" />
- <char id="8706" x="202" y="368" width="11" height="18" xoffset="0" yoffset="5" xadvance="12" page="0" chnl="15" />
- <char id="8710" x="253" y="290" width="15" height="18" xoffset="0" yoffset="5" xadvance="14" page="0" chnl="15" />
- <char id="8719" x="72" y="51" width="17" height="23" xoffset="1" yoffset="5" xadvance="20" page="0" chnl="15" />
- <char id="8721" x="203" y="75" width="14" height="23" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="8722" x="117" y="495" width="12" height="4" xoffset="1" yoffset="12" xadvance="14" page="0" chnl="15" />
- <char id="8725" x="98" y="332" width="13" height="18" xoffset="-4" yoffset="5" xadvance="4" page="0" chnl="15" />
- <char id="8729" x="236" y="490" width="4" height="4" xoffset="1" yoffset="12" xadvance="6" page="0" chnl="15" />
- <char id="8730" x="397" y="0" width="12" height="24" xoffset="1" yoffset="0" xadvance="13" page="0" chnl="15" />
- <char id="8734" x="40" y="487" width="14" height="9" xoffset="1" yoffset="9" xadvance="17" page="0" chnl="15" />
- <char id="8735" x="44" y="408" width="16" height="16" xoffset="4" yoffset="7" xadvance="23" page="0" chnl="15" />
- <char id="8745" x="237" y="290" width="15" height="18" xoffset="1" yoffset="5" xadvance="17" page="0" chnl="15" />
- <char id="8747" x="220" y="0" width="7" height="25" xoffset="0" yoffset="0" xadvance="6" page="0" chnl="15" />
- <char id="8776" x="454" y="461" width="12" height="11" xoffset="0" yoffset="9" xadvance="13" page="0" chnl="15" />
- <char id="8800" x="78" y="351" width="12" height="18" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="8801" x="130" y="455" width="12" height="14" xoffset="1" yoffset="7" xadvance="14" page="0" chnl="15" />
- <char id="8804" x="0" y="351" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="8805" x="490" y="324" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
- <char id="9786" x="61" y="408" width="16" height="16" xoffset="4" yoffset="8" xadvance="24" page="0" chnl="15" />
- <char id="9787" x="78" y="408" width="16" height="16" xoffset="5" yoffset="8" xadvance="25" page="0" chnl="15" />
- <char id="9788" x="72" y="27" width="22" height="23" xoffset="0" yoffset="3" xadvance="22" page="0" chnl="15" />
- <char id="9792" x="383" y="0" width="13" height="24" xoffset="2" yoffset="4" xadvance="18" page="0" chnl="15" />
- <char id="9794" x="153" y="75" width="16" height="23" xoffset="1" yoffset="3" xadvance="18" page="0" chnl="15" />
- <char id="9824" x="14" y="426" width="12" height="15" xoffset="0" yoffset="8" xadvance="13" page="0" chnl="15" />
- <char id="9827" x="383" y="400" width="15" height="15" xoffset="0" yoffset="8" xadvance="16" page="0" chnl="15" />
- <char id="9829" x="0" y="426" width="13" height="15" xoffset="0" yoffset="8" xadvance="14" page="0" chnl="15" />
- <char id="9830" x="53" y="425" width="11" height="15" xoffset="0" yoffset="8" xadvance="12" page="0" chnl="15" />
- <char id="9834" x="400" y="382" width="12" height="17" xoffset="0" yoffset="6" xadvance="12" page="0" chnl="15" />
- <char id="9835" x="400" y="168" width="15" height="20" xoffset="1" yoffset="4" xadvance="18" page="0" chnl="15" />
- </chars>
- <kernings count="397">
- <kerning first="32" second="65" amount="-1" />
- <kerning first="32" second="902" amount="-1" />
- <kerning first="32" second="913" amount="-1" />
- <kerning first="32" second="916" amount="-1" />
- <kerning first="32" second="923" amount="-1" />
- <kerning first="49" second="49" amount="-1" />
- <kerning first="65" second="32" amount="-1" />
- <kerning first="65" second="84" amount="-2" />
- <kerning first="65" second="86" amount="-2" />
- <kerning first="65" second="87" amount="-1" />
- <kerning first="65" second="89" amount="-2" />
- <kerning first="65" second="118" amount="-1" />
- <kerning first="65" second="121" amount="-1" />
- <kerning first="65" second="8217" amount="-1" />
- <kerning first="70" second="44" amount="-2" />
- <kerning first="70" second="46" amount="-2" />
- <kerning first="70" second="65" amount="-1" />
- <kerning first="76" second="84" amount="-2" />
- <kerning first="76" second="86" amount="-2" />
- <kerning first="76" second="87" amount="-1" />
- <kerning first="76" second="89" amount="-2" />
- <kerning first="76" second="121" amount="-1" />
- <kerning first="76" second="8217" amount="-1" />
- <kerning first="80" second="44" amount="-3" />
- <kerning first="80" second="46" amount="-3" />
- <kerning first="80" second="65" amount="-2" />
- <kerning first="82" second="89" amount="-1" />
- <kerning first="84" second="44" amount="-2" />
- <kerning first="84" second="45" amount="-1" />
- <kerning first="84" second="46" amount="-2" />
- <kerning first="84" second="58" amount="-2" />
- <kerning first="84" second="894" amount="-2" />
- <kerning first="84" second="65" amount="-2" />
- <kerning first="84" second="97" amount="-2" />
- <kerning first="84" second="99" amount="-2" />
- <kerning first="84" second="101" amount="-2" />
- <kerning first="84" second="111" amount="-2" />
- <kerning first="84" second="114" amount="-1" />
- <kerning first="84" second="115" amount="-2" />
- <kerning first="84" second="117" amount="-2" />
- <kerning first="84" second="119" amount="-2" />
- <kerning first="84" second="121" amount="-2" />
- <kerning first="86" second="44" amount="-2" />
- <kerning first="86" second="45" amount="-1" />
- <kerning first="86" second="46" amount="-2" />
- <kerning first="86" second="58" amount="-1" />
- <kerning first="86" second="894" amount="-1" />
- <kerning first="86" second="65" amount="-2" />
- <kerning first="86" second="97" amount="-1" />
- <kerning first="86" second="101" amount="-1" />
- <kerning first="86" second="111" amount="-2" />
- <kerning first="86" second="114" amount="-1" />
- <kerning first="86" second="117" amount="-1" />
- <kerning first="86" second="121" amount="-1" />
- <kerning first="87" second="44" amount="-1" />
- <kerning first="87" second="46" amount="-1" />
- <kerning first="87" second="65" amount="-1" />
- <kerning first="87" second="97" amount="-1" />
- <kerning first="89" second="44" amount="-2" />
- <kerning first="89" second="45" amount="-1" />
- <kerning first="89" second="46" amount="-2" />
- <kerning first="89" second="58" amount="-2" />
- <kerning first="89" second="894" amount="-2" />
- <kerning first="89" second="65" amount="-2" />
- <kerning first="89" second="97" amount="-1" />
- <kerning first="89" second="101" amount="-1" />
- <kerning first="89" second="105" amount="-1" />
- <kerning first="89" second="111" amount="-2" />
- <kerning first="89" second="112" amount="-1" />
- <kerning first="89" second="113" amount="-2" />
- <kerning first="89" second="117" amount="-1" />
- <kerning first="89" second="118" amount="-1" />
- <kerning first="114" second="44" amount="-1" />
- <kerning first="114" second="46" amount="-1" />
- <kerning first="114" second="8217" amount="1" />
- <kerning first="118" second="44" amount="-2" />
- <kerning first="118" second="46" amount="-2" />
- <kerning first="119" second="44" amount="-1" />
- <kerning first="119" second="46" amount="-1" />
- <kerning first="121" second="44" amount="-2" />
- <kerning first="121" second="46" amount="-2" />
- <kerning first="8216" second="8216" amount="-1" />
- <kerning first="8217" second="32" amount="-1" />
- <kerning first="8217" second="115" amount="-1" />
- <kerning first="8217" second="8217" amount="-1" />
- <kerning first="8222" second="1026" amount="-2" />
- <kerning first="8222" second="1035" amount="-2" />
- <kerning first="8222" second="1058" amount="-2" />
- <kerning first="8222" second="1063" amount="-2" />
- <kerning first="8222" second="1066" amount="-2" />
- <kerning first="915" second="44" amount="-2" />
- <kerning first="915" second="46" amount="-2" />
- <kerning first="915" second="913" amount="-2" />
- <kerning first="915" second="916" amount="-2" />
- <kerning first="915" second="923" amount="-2" />
- <kerning first="915" second="943" amount="-1" />
- <kerning first="915" second="953" amount="-1" />
- <kerning first="915" second="970" amount="1" />
- <kerning first="948" second="967" amount="-1" />
- <kerning first="966" second="967" amount="-1" />
- <kerning first="902" second="932" amount="-2" />
- <kerning first="902" second="933" amount="-2" />
- <kerning first="902" second="939" amount="-2" />
- <kerning first="902" second="947" amount="-1" />
- <kerning first="902" second="957" amount="-1" />
- <kerning first="902" second="967" amount="-1" />
- <kerning first="910" second="920" amount="-1" />
- <kerning first="910" second="934" amount="-1" />
- <kerning first="910" second="945" amount="-2" />
- <kerning first="910" second="948" amount="-1" />
- <kerning first="910" second="963" amount="-2" />
- <kerning first="910" second="966" amount="-2" />
- <kerning first="910" second="912" amount="3" />
- <kerning first="910" second="913" amount="-2" />
- <kerning first="910" second="916" amount="-2" />
- <kerning first="910" second="923" amount="-2" />
- <kerning first="910" second="927" amount="-1" />
- <kerning first="910" second="937" amount="-1" />
- <kerning first="910" second="940" amount="-2" />
- <kerning first="910" second="942" amount="-1" />
- <kerning first="910" second="943" amount="-1" />
- <kerning first="910" second="951" amount="-1" />
- <kerning first="910" second="953" amount="-1" />
- <kerning first="910" second="954" amount="-1" />
- <kerning first="910" second="956" amount="-1" />
- <kerning first="910" second="959" amount="-2" />
- <kerning first="910" second="970" amount="1" />
- <kerning first="910" second="972" amount="-2" />
- <kerning first="913" second="8217" amount="-1" />
- <kerning first="913" second="932" amount="-2" />
- <kerning first="913" second="933" amount="-2" />
- <kerning first="913" second="939" amount="-2" />
- <kerning first="913" second="947" amount="-1" />
- <kerning first="913" second="957" amount="-1" />
- <kerning first="913" second="967" amount="-1" />
- <kerning first="916" second="932" amount="-2" />
- <kerning first="916" second="933" amount="-2" />
- <kerning first="916" second="939" amount="-2" />
- <kerning first="922" second="920" amount="-1" />
- <kerning first="922" second="934" amount="-1" />
- <kerning first="922" second="927" amount="-1" />
- <kerning first="923" second="932" amount="-2" />
- <kerning first="923" second="933" amount="-2" />
- <kerning first="923" second="939" amount="-2" />
- <kerning first="929" second="44" amount="-3" />
- <kerning first="929" second="46" amount="-3" />
- <kerning first="929" second="913" amount="-2" />
- <kerning first="929" second="916" amount="-2" />
- <kerning first="929" second="923" amount="-2" />
- <kerning first="932" second="44" amount="-2" />
- <kerning first="932" second="45" amount="-1" />
- <kerning first="932" second="46" amount="-2" />
- <kerning first="932" second="58" amount="-2" />
- <kerning first="932" second="894" amount="-2" />
- <kerning first="932" second="945" amount="-2" />
- <kerning first="932" second="948" amount="-1" />
- <kerning first="932" second="949" amount="-2" />
- <kerning first="932" second="963" amount="-2" />
- <kerning first="932" second="966" amount="-2" />
- <kerning first="932" second="912" amount="3" />
- <kerning first="932" second="913" amount="-2" />
- <kerning first="932" second="916" amount="-2" />
- <kerning first="932" second="923" amount="-2" />
- <kerning first="932" second="940" amount="-2" />
- <kerning first="932" second="941" amount="-2" />
- <kerning first="932" second="947" amount="-2" />
- <kerning first="932" second="951" amount="-2" />
- <kerning first="932" second="956" amount="-2" />
- <kerning first="932" second="957" amount="-2" />
- <kerning first="932" second="959" amount="-2" />
- <kerning first="932" second="965" amount="-2" />
- <kerning first="932" second="967" amount="-1" />
- <kerning first="932" second="968" amount="-2" />
- <kerning first="932" second="970" amount="1" />
- <kerning first="932" second="971" amount="-2" />
- <kerning first="932" second="972" amount="-2" />
- <kerning first="932" second="973" amount="-2" />
- <kerning first="933" second="44" amount="-2" />
- <kerning first="933" second="45" amount="-1" />
- <kerning first="933" second="46" amount="-2" />
- <kerning first="933" second="58" amount="-2" />
- <kerning first="933" second="894" amount="-2" />
- <kerning first="933" second="920" amount="-1" />
- <kerning first="933" second="934" amount="-1" />
- <kerning first="933" second="945" amount="-2" />
- <kerning first="933" second="948" amount="-1" />
- <kerning first="933" second="963" amount="-2" />
- <kerning first="933" second="966" amount="-2" />
- <kerning first="933" second="912" amount="3" />
- <kerning first="933" second="913" amount="-2" />
- <kerning first="933" second="916" amount="-2" />
- <kerning first="933" second="923" amount="-2" />
- <kerning first="933" second="927" amount="-1" />
- <kerning first="933" second="937" amount="-1" />
- <kerning first="933" second="940" amount="-2" />
- <kerning first="933" second="942" amount="-1" />
- <kerning first="933" second="943" amount="-1" />
- <kerning first="933" second="947" amount="-1" />
- <kerning first="933" second="951" amount="-1" />
- <kerning first="933" second="953" amount="-1" />
- <kerning first="933" second="954" amount="-1" />
- <kerning first="933" second="956" amount="-1" />
- <kerning first="933" second="959" amount="-2" />
- <kerning first="933" second="970" amount="1" />
- <kerning first="933" second="972" amount="-2" />
- <kerning first="939" second="920" amount="-1" />
- <kerning first="939" second="934" amount="-1" />
- <kerning first="939" second="945" amount="-2" />
- <kerning first="939" second="948" amount="-1" />
- <kerning first="939" second="963" amount="-2" />
- <kerning first="939" second="966" amount="-2" />
- <kerning first="939" second="912" amount="3" />
- <kerning first="939" second="913" amount="-2" />
- <kerning first="939" second="916" amount="-2" />
- <kerning first="939" second="923" amount="-2" />
- <kerning first="939" second="927" amount="-1" />
- <kerning first="939" second="937" amount="-1" />
- <kerning first="939" second="940" amount="-2" />
- <kerning first="939" second="942" amount="-1" />
- <kerning first="939" second="943" amount="-1" />
- <kerning first="939" second="951" amount="-1" />
- <kerning first="939" second="953" amount="-1" />
- <kerning first="939" second="954" amount="-1" />
- <kerning first="939" second="956" amount="-1" />
- <kerning first="939" second="959" amount="-2" />
- <kerning first="939" second="970" amount="1" />
- <kerning first="939" second="972" amount="-2" />
- <kerning first="950" second="945" amount="-1" />
- <kerning first="950" second="948" amount="-1" />
- <kerning first="950" second="963" amount="-1" />
- <kerning first="950" second="964" amount="-1" />
- <kerning first="950" second="966" amount="-1" />
- <kerning first="950" second="940" amount="-1" />
- <kerning first="950" second="947" amount="-1" />
- <kerning first="950" second="952" amount="-1" />
- <kerning first="950" second="957" amount="-1" />
- <kerning first="950" second="959" amount="-1" />
- <kerning first="950" second="969" amount="-1" />
- <kerning first="950" second="972" amount="-1" />
- <kerning first="950" second="974" amount="-1" />
- <kerning first="950" second="960" amount="-1" />
- <kerning first="954" second="945" amount="-1" />
- <kerning first="954" second="948" amount="-1" />
- <kerning first="954" second="963" amount="-1" />
- <kerning first="954" second="966" amount="-1" />
- <kerning first="954" second="940" amount="-1" />
- <kerning first="954" second="950" amount="-1" />
- <kerning first="954" second="958" amount="-1" />
- <kerning first="954" second="959" amount="-1" />
- <kerning first="954" second="962" amount="-1" />
- <kerning first="954" second="969" amount="-1" />
- <kerning first="954" second="972" amount="-1" />
- <kerning first="954" second="974" amount="-1" />
- <kerning first="959" second="967" amount="-1" />
- <kerning first="967" second="945" amount="-1" />
- <kerning first="967" second="948" amount="-1" />
- <kerning first="967" second="963" amount="-1" />
- <kerning first="967" second="966" amount="-1" />
- <kerning first="967" second="940" amount="-1" />
- <kerning first="967" second="950" amount="-1" />
- <kerning first="967" second="959" amount="-1" />
- <kerning first="967" second="962" amount="-1" />
- <kerning first="967" second="972" amount="-1" />
- <kerning first="972" second="967" amount="-1" />
- <kerning first="1027" second="44" amount="-2" />
- <kerning first="1027" second="46" amount="-3" />
- <kerning first="1027" second="171" amount="-1" />
- <kerning first="1027" second="187" amount="-1" />
- <kerning first="1033" second="8217" amount="-2" />
- <kerning first="1034" second="8217" amount="-2" />
- <kerning first="1040" second="8217" amount="-1" />
- <kerning first="1040" second="1044" amount="1" />
- <kerning first="1040" second="1058" amount="-1" />
- <kerning first="1040" second="1059" amount="-1" />
- <kerning first="1040" second="1063" amount="-2" />
- <kerning first="1041" second="1040" amount="-1" />
- <kerning first="1041" second="1063" amount="-1" />
- <kerning first="1041" second="1066" amount="-1" />
- <kerning first="1042" second="1040" amount="-1" />
- <kerning first="1042" second="1046" amount="-1" />
- <kerning first="1042" second="1057" amount="-1" />
- <kerning first="1042" second="1058" amount="-1" />
- <kerning first="1042" second="1059" amount="-1" />
- <kerning first="1042" second="1061" amount="-1" />
- <kerning first="1042" second="1063" amount="-1" />
- <kerning first="1042" second="1066" amount="-1" />
- <kerning first="1042" second="1095" amount="-1" />
- <kerning first="1043" second="44" amount="-2" />
- <kerning first="1043" second="46" amount="-3" />
- <kerning first="1043" second="171" amount="-1" />
- <kerning first="1043" second="187" amount="-1" />
- <kerning first="1043" second="1040" amount="-1" />
- <kerning first="1043" second="1076" amount="-1" />
- <kerning first="1043" second="1077" amount="-1" />
- <kerning first="1043" second="1083" amount="-1" />
- <kerning first="1043" second="1084" amount="-1" />
- <kerning first="1043" second="1086" amount="-1" />
- <kerning first="1043" second="1088" amount="-1" />
- <kerning first="1043" second="1091" amount="-1" />
- <kerning first="1043" second="1099" amount="-1" />
- <kerning first="1043" second="1100" amount="-1" />
- <kerning first="1043" second="1102" amount="-1" />
- <kerning first="1043" second="1103" amount="-1" />
- <kerning first="1046" second="1066" amount="1" />
- <kerning first="1047" second="1058" amount="-1" />
- <kerning first="1047" second="1059" amount="-1" />
- <kerning first="1047" second="1063" amount="-1" />
- <kerning first="1050" second="1047" amount="1" />
- <kerning first="1054" second="1061" amount="-1" />
- <kerning first="1056" second="44" amount="-3" />
- <kerning first="1056" second="46" amount="-3" />
- <kerning first="1056" second="1040" amount="-2" />
- <kerning first="1056" second="1044" amount="-1" />
- <kerning first="1056" second="1051" amount="-1" />
- <kerning first="1056" second="1061" amount="-1" />
- <kerning first="1056" second="1076" amount="-1" />
- <kerning first="1057" second="1061" amount="-1" />
- <kerning first="1058" second="44" amount="-2" />
- <kerning first="1058" second="46" amount="-2" />
- <kerning first="1058" second="1040" amount="-1" />
- <kerning first="1058" second="1060" amount="-1" />
- <kerning first="1058" second="1074" amount="-1" />
- <kerning first="1058" second="1077" amount="-1" />
- <kerning first="1058" second="1080" amount="-1" />
- <kerning first="1058" second="1082" amount="-1" />
- <kerning first="1058" second="1083" amount="-1" />
- <kerning first="1058" second="1084" amount="-1" />
- <kerning first="1058" second="1086" amount="-1" />
- <kerning first="1058" second="1088" amount="-1" />
- <kerning first="1058" second="1089" amount="-1" />
- <kerning first="1058" second="1091" amount="-1" />
- <kerning first="1058" second="1093" amount="-1" />
- <kerning first="1059" second="44" amount="-2" />
- <kerning first="1059" second="46" amount="-3" />
- <kerning first="1059" second="171" amount="-1" />
- <kerning first="1059" second="187" amount="-1" />
- <kerning first="1059" second="1040" amount="-2" />
- <kerning first="1059" second="1044" amount="-1" />
- <kerning first="1059" second="1051" amount="-1" />
- <kerning first="1059" second="1060" amount="-1" />
- <kerning first="1059" second="1074" amount="-1" />
- <kerning first="1059" second="1075" amount="-1" />
- <kerning first="1059" second="1076" amount="-1" />
- <kerning first="1059" second="1077" amount="-1" />
- <kerning first="1059" second="1079" amount="-1" />
- <kerning first="1059" second="1080" amount="-1" />
- <kerning first="1059" second="1081" amount="-1" />
- <kerning first="1059" second="1082" amount="-1" />
- <kerning first="1059" second="1083" amount="-1" />
- <kerning first="1059" second="1084" amount="-1" />
- <kerning first="1059" second="1085" amount="-1" />
- <kerning first="1059" second="1086" amount="-1" />
- <kerning first="1059" second="1087" amount="-1" />
- <kerning first="1059" second="1088" amount="-1" />
- <kerning first="1059" second="1089" amount="-1" />
- <kerning first="1059" second="1094" amount="-1" />
- <kerning first="1059" second="1096" amount="-1" />
- <kerning first="1059" second="1097" amount="-1" />
- <kerning first="1059" second="1102" amount="-1" />
- <kerning first="1059" second="1103" amount="-1" />
- <kerning first="1060" second="1044" amount="-1" />
- <kerning first="1060" second="1051" amount="-1" />
- <kerning first="1060" second="1058" amount="-1" />
- <kerning first="1060" second="1059" amount="-1" />
- <kerning first="1061" second="1057" amount="-1" />
- <kerning first="1061" second="1060" amount="-1" />
- <kerning first="1062" second="1072" amount="1" />
- <kerning first="1066" second="8217" amount="-2" />
- <kerning first="1066" second="1071" amount="-1" />
- <kerning first="1068" second="8217" amount="-2" />
- <kerning first="1068" second="1046" amount="-1" />
- <kerning first="1068" second="1051" amount="-1" />
- <kerning first="1068" second="1058" amount="-2" />
- <kerning first="1068" second="1061" amount="-1" />
- <kerning first="1068" second="1063" amount="-2" />
- <kerning first="1068" second="1069" amount="-1" />
- <kerning first="1068" second="1071" amount="-1" />
- <kerning first="1069" second="1051" amount="-1" />
- <kerning first="1070" second="1051" amount="-1" />
- <kerning first="1070" second="1061" amount="-1" />
- <kerning first="1074" second="1095" amount="-1" />
- <kerning first="1075" second="44" amount="-2" />
- <kerning first="1075" second="46" amount="-2" />
- <kerning first="1075" second="1076" amount="-1" />
- <kerning first="1079" second="1095" amount="-1" />
- <kerning first="1090" second="44" amount="-2" />
- <kerning first="1090" second="46" amount="-2" />
- <kerning first="1091" second="44" amount="-2" />
- <kerning first="1091" second="46" amount="-2" />
- <kerning first="1100" second="1090" amount="-2" />
- <kerning first="1100" second="1095" amount="-2" />
- <kerning first="1102" second="1095" amount="-1" />
- <kerning first="1118" second="44" amount="-2" />
- <kerning first="1118" second="46" amount="-2" />
- <kerning first="1168" second="44" amount="-1" />
- <kerning first="1168" second="46" amount="-2" />
- <kerning first="960" second="955" amount="-1" />
- </kernings>
-</font>
+<?xml version="1.0"?>
+<font>
+ <info face="Arial" size="-24" bold="1" italic="0" charset="" unicode="1" stretchH="100" smooth="1" aa="2" padding="0,0,0,0" spacing="1,1" outline="0"/>
+ <common lineHeight="28" base="23" scaleW="512" scaleH="512" pages="1" packed="0" alphaChnl="0" redChnl="0" greenChnl="0" blueChnl="0"/>
+ <pages>
+ <page id="0" file="arial-24-bold-regular_00.png" />
+ </pages>
+ <chars count="994">
+ <char id="32" x="510" y="44" width="1" height="1" xoffset="0" yoffset="22" xadvance="6" page="0" chnl="15" />
+ <char id="33" x="116" y="389" width="4" height="18" xoffset="2" yoffset="5" xadvance="7" page="0" chnl="15" />
+ <char id="34" x="392" y="475" width="9" height="6" xoffset="1" yoffset="5" xadvance="11" page="0" chnl="15" />
+ <char id="35" x="210" y="311" width="13" height="18" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="36" x="92" y="171" width="12" height="22" xoffset="1" yoffset="3" xadvance="13" page="0" chnl="15" />
+ <char id="37" x="340" y="249" width="19" height="18" xoffset="1" yoffset="5" xadvance="21" page="0" chnl="15" />
+ <char id="38" x="442" y="267" width="16" height="18" xoffset="1" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="39" x="430" y="474" width="4" height="6" xoffset="1" yoffset="5" xadvance="5" page="0" chnl="15" />
+ <char id="40" x="109" y="147" width="6" height="23" xoffset="1" yoffset="5" xadvance="8" page="0" chnl="15" />
+ <char id="41" x="102" y="147" width="6" height="23" xoffset="1" yoffset="5" xadvance="8" page="0" chnl="15" />
+ <char id="42" x="223" y="481" width="8" height="8" xoffset="0" yoffset="5" xadvance="9" page="0" chnl="15" />
+ <char id="43" x="352" y="463" width="12" height="12" xoffset="1" yoffset="8" xadvance="14" page="0" chnl="15" />
+ <char id="44" x="507" y="460" width="4" height="8" xoffset="1" yoffset="19" xadvance="6" page="0" chnl="15" />
+ <char id="45" x="374" y="482" width="7" height="3" xoffset="1" yoffset="15" xadvance="8" page="0" chnl="15" />
+ <char id="46" x="246" y="490" width="4" height="4" xoffset="1" yoffset="19" xadvance="6" page="0" chnl="15" />
+ <char id="47" x="504" y="305" width="7" height="18" xoffset="0" yoffset="5" xadvance="6" page="0" chnl="15" />
+ <char id="48" x="347" y="326" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="49" x="430" y="362" width="8" height="18" xoffset="2" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="50" x="373" y="325" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="51" x="386" y="325" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="52" x="322" y="307" width="13" height="18" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="53" x="399" y="325" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="54" x="412" y="325" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="55" x="425" y="324" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="56" x="438" y="324" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="57" x="451" y="324" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="58" x="99" y="471" width="4" height="14" xoffset="2" yoffset="9" xadvance="8" page="0" chnl="15" />
+ <char id="59" x="121" y="389" width="4" height="18" xoffset="2" yoffset="9" xadvance="8" page="0" chnl="15" />
+ <char id="60" x="169" y="452" width="12" height="14" xoffset="1" yoffset="7" xadvance="14" page="0" chnl="15" />
+ <char id="61" x="68" y="486" width="12" height="9" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="62" x="143" y="455" width="12" height="14" xoffset="1" yoffset="7" xadvance="14" page="0" chnl="15" />
+ <char id="63" x="462" y="305" width="13" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="64" x="0" y="28" width="23" height="23" xoffset="1" yoffset="5" xadvance="23" page="0" chnl="15" />
+ <char id="65" x="318" y="269" width="17" height="18" xoffset="0" yoffset="5" xadvance="16" page="0" chnl="15" />
+ <char id="66" x="301" y="288" width="15" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="67" x="17" y="216" width="16" height="19" xoffset="1" yoffset="4" xadvance="17" page="0" chnl="15" />
+ <char id="68" x="317" y="288" width="15" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="69" x="476" y="305" width="13" height="18" xoffset="2" yoffset="5" xadvance="16" page="0" chnl="15" />
+ <char id="70" x="13" y="351" width="12" height="18" xoffset="2" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="71" x="493" y="188" width="16" height="19" xoffset="1" yoffset="4" xadvance="18" page="0" chnl="15" />
+ <char id="72" x="135" y="311" width="14" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="73" x="141" y="387" width="4" height="18" xoffset="1" yoffset="5" xadvance="6" page="0" chnl="15" />
+ <char id="74" x="500" y="247" width="11" height="18" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="75" x="119" y="292" width="16" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="76" x="52" y="351" width="12" height="18" xoffset="2" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="77" x="192" y="273" width="17" height="18" xoffset="2" yoffset="5" xadvance="20" page="0" chnl="15" />
+ <char id="78" x="381" y="287" width="14" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="79" x="334" y="190" width="17" height="19" xoffset="1" yoffset="4" xadvance="18" page="0" chnl="15" />
+ <char id="80" x="56" y="332" width="13" height="18" xoffset="2" yoffset="5" xadvance="16" page="0" chnl="15" />
+ <char id="81" x="250" y="169" width="17" height="21" xoffset="1" yoffset="4" xadvance="18" page="0" chnl="15" />
+ <char id="82" x="187" y="292" width="16" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="83" x="228" y="212" width="14" height="19" xoffset="1" yoffset="4" xadvance="16" page="0" chnl="15" />
+ <char id="84" x="180" y="311" width="14" height="18" xoffset="1" yoffset="5" xadvance="15" page="0" chnl="15" />
+ <char id="85" x="195" y="311" width="14" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="86" x="459" y="267" width="16" height="18" xoffset="0" yoffset="5" xadvance="16" page="0" chnl="15" />
+ <char id="87" x="469" y="229" width="23" height="18" xoffset="0" yoffset="5" xadvance="22" page="0" chnl="15" />
+ <char id="88" x="493" y="267" width="16" height="18" xoffset="0" yoffset="5" xadvance="16" page="0" chnl="15" />
+ <char id="89" x="246" y="271" width="17" height="18" xoffset="0" yoffset="5" xadvance="16" page="0" chnl="15" />
+ <char id="90" x="396" y="287" width="14" height="18" xoffset="0" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="91" x="74" y="148" width="6" height="23" xoffset="1" yoffset="5" xadvance="8" page="0" chnl="15" />
+ <char id="92" x="59" y="389" width="7" height="18" xoffset="0" yoffset="5" xadvance="6" page="0" chnl="15" />
+ <char id="93" x="123" y="147" width="6" height="23" xoffset="0" yoffset="5" xadvance="8" page="0" chnl="15" />
+ <char id="94" x="495" y="460" width="11" height="10" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="95" x="272" y="490" width="14" height="3" xoffset="0" yoffset="24" xadvance="13" page="0" chnl="15" />
+ <char id="96" x="203" y="490" width="5" height="4" xoffset="0" yoffset="5" xadvance="8" page="0" chnl="15" />
+ <char id="97" x="104" y="455" width="12" height="14" xoffset="1" yoffset="9" xadvance="13" page="0" chnl="15" />
+ <char id="98" x="104" y="351" width="12" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="99" x="91" y="456" width="12" height="14" xoffset="1" yoffset="9" xadvance="13" page="0" chnl="15" />
+ <char id="100" x="130" y="349" width="12" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="101" x="78" y="456" width="12" height="14" xoffset="1" yoffset="9" xadvance="13" page="0" chnl="15" />
+ <char id="102" x="400" y="363" width="9" height="18" xoffset="0" yoffset="5" xadvance="8" page="0" chnl="15" />
+ <char id="103" x="208" y="232" width="12" height="19" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="104" x="156" y="349" width="12" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="105" x="111" y="389" width="4" height="18" xoffset="1" yoffset="5" xadvance="6" page="0" chnl="15" />
+ <char id="106" x="116" y="147" width="6" height="23" xoffset="-1" yoffset="5" xadvance="6" page="0" chnl="15" />
+ <char id="107" x="182" y="349" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="108" x="106" y="389" width="4" height="18" xoffset="1" yoffset="5" xadvance="6" page="0" chnl="15" />
+ <char id="109" x="244" y="422" width="19" height="14" xoffset="1" yoffset="9" xadvance="21" page="0" chnl="15" />
+ <char id="110" x="65" y="456" width="12" height="14" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="111" x="294" y="435" width="13" height="14" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="112" x="52" y="236" width="12" height="19" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="113" x="65" y="236" width="12" height="19" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="114" x="10" y="472" width="9" height="14" xoffset="1" yoffset="9" xadvance="9" page="0" chnl="15" />
+ <char id="115" x="52" y="456" width="12" height="14" xoffset="0" yoffset="9" xadvance="13" page="0" chnl="15" />
+ <char id="116" x="9" y="389" width="8" height="18" xoffset="0" yoffset="5" xadvance="8" page="0" chnl="15" />
+ <char id="117" x="39" y="456" width="12" height="14" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="118" x="124" y="440" width="14" height="14" xoffset="0" yoffset="9" xadvance="13" page="0" chnl="15" />
+ <char id="119" x="181" y="422" width="20" height="14" xoffset="0" yoffset="9" xadvance="19" page="0" chnl="15" />
+ <char id="120" x="139" y="440" width="14" height="14" xoffset="0" yoffset="9" xadvance="13" page="0" chnl="15" />
+ <char id="121" x="348" y="210" width="14" height="19" xoffset="0" yoffset="9" xadvance="13" page="0" chnl="15" />
+ <char id="122" x="269" y="452" width="11" height="14" xoffset="0" yoffset="9" xadvance="12" page="0" chnl="15" />
+ <char id="123" x="0" y="148" width="9" height="23" xoffset="0" yoffset="5" xadvance="9" page="0" chnl="15" />
+ <char id="124" x="169" y="147" width="3" height="23" xoffset="2" yoffset="5" xadvance="6" page="0" chnl="15" />
+ <char id="125" x="10" y="148" width="9" height="23" xoffset="0" yoffset="5" xadvance="9" page="0" chnl="15" />
+ <char id="126" x="439" y="473" width="13" height="5" xoffset="1" yoffset="12" xadvance="14" page="0" chnl="15" />
+ <char id="160" x="510" y="46" width="1" height="1" xoffset="0" yoffset="22" xadvance="6" page="0" chnl="15" />
+ <char id="161" x="281" y="231" width="4" height="19" xoffset="2" yoffset="9" xadvance="7" page="0" chnl="15" />
+ <char id="162" x="202" y="123" width="12" height="23" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="163" x="238" y="309" width="13" height="18" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="164" x="193" y="467" width="13" height="13" xoffset="0" yoffset="8" xadvance="13" page="0" chnl="15" />
+ <char id="165" x="224" y="311" width="13" height="18" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="166" x="165" y="147" width="3" height="23" xoffset="2" yoffset="5" xadvance="6" page="0" chnl="15" />
+ <char id="167" x="215" y="123" width="12" height="23" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="168" x="339" y="484" width="8" height="3" xoffset="0" yoffset="5" xadvance="8" page="0" chnl="15" />
+ <char id="169" x="40" y="275" width="18" height="18" xoffset="0" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="170" x="104" y="485" width="8" height="9" xoffset="0" yoffset="5" xadvance="9" page="0" chnl="15" />
+ <char id="171" x="378" y="462" width="12" height="12" xoffset="1" yoffset="10" xadvance="13" page="0" chnl="15" />
+ <char id="172" x="55" y="486" width="12" height="9" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="173" x="366" y="483" width="7" height="3" xoffset="1" yoffset="15" xadvance="8" page="0" chnl="15" />
+ <char id="174" x="59" y="275" width="18" height="18" xoffset="0" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="175" x="287" y="490" width="14" height="3" xoffset="0" yoffset="2" xadvance="13" page="0" chnl="15" />
+ <char id="176" x="232" y="481" width="8" height="8" xoffset="1" yoffset="5" xadvance="9" page="0" chnl="15" />
+ <char id="177" x="452" y="381" width="12" height="17" xoffset="0" yoffset="6" xadvance="13" page="0" chnl="15" />
+ <char id="178" x="140" y="484" width="7" height="9" xoffset="0" yoffset="5" xadvance="8" page="0" chnl="15" />
+ <char id="179" x="148" y="484" width="7" height="9" xoffset="0" yoffset="5" xadvance="8" page="0" chnl="15" />
+ <char id="180" x="185" y="490" width="5" height="4" xoffset="2" yoffset="5" xadvance="8" page="0" chnl="15" />
+ <char id="181" x="462" y="209" width="12" height="19" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="182" x="495" y="144" width="13" height="22" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="183" x="241" y="490" width="4" height="4" xoffset="1" yoffset="12" xadvance="6" page="0" chnl="15" />
+ <char id="184" x="471" y="472" width="7" height="5" xoffset="0" yoffset="22" xadvance="8" page="0" chnl="15" />
+ <char id="185" x="163" y="484" width="5" height="9" xoffset="1" yoffset="5" xadvance="8" page="0" chnl="15" />
+ <char id="186" x="113" y="485" width="8" height="9" xoffset="0" yoffset="5" xadvance="9" page="0" chnl="15" />
+ <char id="187" x="391" y="462" width="12" height="12" xoffset="1" yoffset="10" xadvance="13" page="0" chnl="15" />
+ <char id="188" x="420" y="248" width="19" height="18" xoffset="1" yoffset="5" xadvance="20" page="0" chnl="15" />
+ <char id="189" x="480" y="248" width="19" height="18" xoffset="1" yoffset="5" xadvance="20" page="0" chnl="15" />
+ <char id="190" x="153" y="254" width="20" height="18" xoffset="0" yoffset="5" xadvance="20" page="0" chnl="15" />
+ <char id="191" x="91" y="235" width="12" height="19" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="192" x="252" y="49" width="17" height="23" xoffset="0" yoffset="0" xadvance="17" page="0" chnl="15" />
+ <char id="193" x="270" y="49" width="17" height="23" xoffset="0" yoffset="0" xadvance="17" page="0" chnl="15" />
+ <char id="194" x="288" y="49" width="17" height="23" xoffset="0" yoffset="0" xadvance="17" page="0" chnl="15" />
+ <char id="195" x="306" y="49" width="17" height="23" xoffset="0" yoffset="0" xadvance="17" page="0" chnl="15" />
+ <char id="196" x="468" y="48" width="17" height="23" xoffset="0" yoffset="0" xadvance="17" page="0" chnl="15" />
+ <char id="197" x="292" y="145" width="17" height="22" xoffset="0" yoffset="1" xadvance="17" page="0" chnl="15" />
+ <char id="198" x="396" y="229" width="24" height="18" xoffset="-1" yoffset="5" xadvance="24" page="0" chnl="15" />
+ <char id="199" x="17" y="76" width="16" height="23" xoffset="1" yoffset="4" xadvance="17" page="0" chnl="15" />
+ <char id="200" x="283" y="97" width="13" height="23" xoffset="2" yoffset="0" xadvance="16" page="0" chnl="15" />
+ <char id="201" x="297" y="97" width="13" height="23" xoffset="2" yoffset="0" xadvance="16" page="0" chnl="15" />
+ <char id="202" x="311" y="97" width="13" height="23" xoffset="2" yoffset="0" xadvance="16" page="0" chnl="15" />
+ <char id="203" x="84" y="123" width="13" height="23" xoffset="2" yoffset="0" xadvance="16" page="0" chnl="15" />
+ <char id="204" x="149" y="147" width="5" height="23" xoffset="0" yoffset="0" xadvance="6" page="0" chnl="15" />
+ <char id="205" x="143" y="147" width="5" height="23" xoffset="1" yoffset="0" xadvance="6" page="0" chnl="15" />
+ <char id="206" x="38" y="148" width="8" height="23" xoffset="0" yoffset="0" xadvance="6" page="0" chnl="15" />
+ <char id="207" x="503" y="48" width="8" height="23" xoffset="0" yoffset="0" xadvance="6" page="0" chnl="15" />
+ <char id="208" x="336" y="268" width="17" height="18" xoffset="0" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="209" x="75" y="99" width="14" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
+ <char id="210" x="342" y="49" width="17" height="23" xoffset="1" yoffset="0" xadvance="18" page="0" chnl="15" />
+ <char id="211" x="360" y="49" width="17" height="23" xoffset="1" yoffset="0" xadvance="18" page="0" chnl="15" />
+ <char id="212" x="378" y="49" width="17" height="23" xoffset="1" yoffset="0" xadvance="18" page="0" chnl="15" />
+ <char id="213" x="396" y="49" width="17" height="23" xoffset="1" yoffset="0" xadvance="18" page="0" chnl="15" />
+ <char id="214" x="414" y="49" width="17" height="23" xoffset="1" yoffset="0" xadvance="18" page="0" chnl="15" />
+ <char id="215" x="365" y="462" width="12" height="12" xoffset="1" yoffset="8" xadvance="14" page="0" chnl="15" />
+ <char id="216" x="231" y="170" width="18" height="21" xoffset="0" yoffset="3" xadvance="18" page="0" chnl="15" />
+ <char id="217" x="45" y="100" width="14" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
+ <char id="218" x="210" y="99" width="14" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
+ <char id="219" x="233" y="74" width="14" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
+ <char id="220" x="248" y="74" width="14" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
+ <char id="221" x="54" y="51" width="17" height="23" xoffset="0" yoffset="0" xadvance="16" page="0" chnl="15" />
+ <char id="222" x="0" y="332" width="13" height="18" xoffset="2" yoffset="5" xadvance="16" page="0" chnl="15" />
+ <char id="223" x="416" y="344" width="12" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="224" x="429" y="343" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="225" x="442" y="343" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="226" x="455" y="343" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="227" x="468" y="343" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="228" x="481" y="343" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="229" x="473" y="167" width="12" height="20" xoffset="1" yoffset="3" xadvance="13" page="0" chnl="15" />
+ <char id="230" x="223" y="422" width="20" height="14" xoffset="1" yoffset="9" xadvance="21" page="0" chnl="15" />
+ <char id="231" x="0" y="370" width="12" height="18" xoffset="1" yoffset="9" xadvance="13" page="0" chnl="15" />
+ <char id="232" x="13" y="370" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="233" x="143" y="349" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="234" x="169" y="349" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="235" x="221" y="349" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="236" x="88" y="389" width="5" height="18" xoffset="0" yoffset="5" xadvance="6" page="0" chnl="15" />
+ <char id="237" x="100" y="389" width="5" height="18" xoffset="1" yoffset="5" xadvance="6" page="0" chnl="15" />
+ <char id="238" x="448" y="362" width="8" height="18" xoffset="0" yoffset="5" xadvance="6" page="0" chnl="15" />
+ <char id="239" x="502" y="362" width="8" height="18" xoffset="0" yoffset="5" xadvance="6" page="0" chnl="15" />
+ <char id="240" x="168" y="330" width="13" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="241" x="299" y="346" width="12" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="242" x="154" y="330" width="13" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="243" x="140" y="330" width="13" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="244" x="112" y="332" width="13" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="245" x="84" y="332" width="13" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="246" x="14" y="332" width="13" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="247" x="207" y="467" width="12" height="13" xoffset="0" yoffset="8" xadvance="13" page="0" chnl="15" />
+ <char id="248" x="478" y="399" width="13" height="15" xoffset="1" yoffset="8" xadvance="14" page="0" chnl="15" />
+ <char id="249" x="65" y="370" width="12" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="250" x="78" y="370" width="12" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="251" x="321" y="326" width="12" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="252" x="334" y="326" width="12" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="253" x="428" y="73" width="14" height="23" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="254" x="254" y="122" width="12" height="23" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="255" x="413" y="73" width="14" height="23" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="256" x="256" y="146" width="17" height="22" xoffset="0" yoffset="1" xadvance="16" page="0" chnl="15" />
+ <char id="257" x="426" y="382" width="12" height="17" xoffset="1" yoffset="6" xadvance="13" page="0" chnl="15" />
+ <char id="258" x="294" y="25" width="17" height="23" xoffset="0" yoffset="0" xadvance="16" page="0" chnl="15" />
+ <char id="259" x="117" y="370" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="260" x="179" y="27" width="19" height="23" xoffset="0" yoffset="5" xadvance="16" page="0" chnl="15" />
+ <char id="261" x="288" y="211" width="14" height="19" xoffset="1" yoffset="9" xadvance="13" page="0" chnl="15" />
+ <char id="262" x="51" y="76" width="16" height="23" xoffset="1" yoffset="0" xadvance="17" page="0" chnl="15" />
+ <char id="263" x="26" y="370" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="264" x="170" y="75" width="16" height="23" xoffset="1" yoffset="0" xadvance="17" page="0" chnl="15" />
+ <char id="265" x="208" y="349" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="266" x="486" y="48" width="16" height="23" xoffset="1" yoffset="0" xadvance="17" page="0" chnl="15" />
+ <char id="267" x="477" y="324" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="268" x="34" y="76" width="16" height="23" xoffset="1" yoffset="0" xadvance="17" page="0" chnl="15" />
+ <char id="269" x="308" y="326" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="270" x="187" y="75" width="15" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
+ <char id="271" x="17" y="294" width="16" height="18" xoffset="1" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="272" x="264" y="271" width="17" height="18" xoffset="0" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="273" x="486" y="286" width="14" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="274" x="467" y="144" width="13" height="22" xoffset="2" yoffset="1" xadvance="16" page="0" chnl="15" />
+ <char id="275" x="465" y="381" width="12" height="17" xoffset="1" yoffset="6" xadvance="13" page="0" chnl="15" />
+ <char id="276" x="367" y="97" width="13" height="23" xoffset="2" yoffset="0" xadvance="16" page="0" chnl="15" />
+ <char id="277" x="403" y="344" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="278" x="353" y="97" width="13" height="23" xoffset="2" yoffset="0" xadvance="16" page="0" chnl="15" />
+ <char id="279" x="494" y="343" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="280" x="70" y="124" width="13" height="23" xoffset="2" yoffset="5" xadvance="16" page="0" chnl="15" />
+ <char id="281" x="104" y="234" width="12" height="19" xoffset="1" yoffset="9" xadvance="13" page="0" chnl="15" />
+ <char id="282" x="479" y="96" width="13" height="23" xoffset="2" yoffset="0" xadvance="16" page="0" chnl="15" />
+ <char id="283" x="52" y="370" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="284" x="102" y="75" width="16" height="23" xoffset="1" yoffset="0" xadvance="18" page="0" chnl="15" />
+ <char id="285" x="267" y="122" width="12" height="23" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="286" x="85" y="75" width="16" height="23" xoffset="1" yoffset="0" xadvance="18" page="0" chnl="15" />
+ <char id="287" x="280" y="121" width="12" height="23" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="288" x="68" y="75" width="16" height="23" xoffset="1" yoffset="0" xadvance="18" page="0" chnl="15" />
+ <char id="289" x="293" y="121" width="12" height="23" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="290" x="323" y="0" width="16" height="24" xoffset="1" yoffset="4" xadvance="18" page="0" chnl="15" />
+ <char id="291" x="207" y="0" width="12" height="25" xoffset="1" yoffset="3" xadvance="14" page="0" chnl="15" />
+ <char id="292" x="353" y="73" width="14" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
+ <char id="293" x="306" y="121" width="12" height="23" xoffset="1" yoffset="0" xadvance="14" page="0" chnl="15" />
+ <char id="294" x="390" y="268" width="17" height="18" xoffset="0" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="295" x="336" y="307" width="13" height="18" xoffset="0" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="296" x="20" y="148" width="8" height="23" xoffset="0" yoffset="0" xadvance="6" page="0" chnl="15" />
+ <char id="297" x="475" y="362" width="8" height="18" xoffset="0" yoffset="5" xadvance="6" page="0" chnl="15" />
+ <char id="298" x="166" y="171" width="8" height="22" xoffset="0" yoffset="1" xadvance="6" page="0" chnl="15" />
+ <char id="299" x="0" y="408" width="8" height="17" xoffset="0" yoffset="6" xadvance="6" page="0" chnl="15" />
+ <char id="300" x="503" y="72" width="8" height="23" xoffset="0" yoffset="0" xadvance="6" page="0" chnl="15" />
+ <char id="301" x="439" y="362" width="8" height="18" xoffset="0" yoffset="5" xadvance="6" page="0" chnl="15" />
+ <char id="302" x="81" y="148" width="6" height="23" xoffset="0" yoffset="5" xadvance="6" page="0" chnl="15" />
+ <char id="303" x="88" y="147" width="6" height="23" xoffset="0" yoffset="5" xadvance="6" page="0" chnl="15" />
+ <char id="304" x="160" y="147" width="4" height="23" xoffset="1" yoffset="0" xadvance="6" page="0" chnl="15" />
+ <char id="305" x="119" y="470" width="4" height="14" xoffset="1" yoffset="9" xadvance="6" page="0" chnl="15" />
+ <char id="306" x="408" y="267" width="16" height="18" xoffset="1" yoffset="5" xadvance="19" page="0" chnl="15" />
+ <char id="307" x="493" y="120" width="10" height="23" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="308" x="0" y="124" width="13" height="23" xoffset="0" yoffset="0" xadvance="13" page="0" chnl="15" />
+ <char id="309" x="56" y="148" width="8" height="23" xoffset="-1" yoffset="5" xadvance="6" page="0" chnl="15" />
+ <char id="310" x="327" y="145" width="16" height="22" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="311" x="118" y="171" width="12" height="22" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="312" x="117" y="455" width="12" height="14" xoffset="1" yoffset="9" xadvance="13" page="0" chnl="15" />
+ <char id="313" x="319" y="121" width="12" height="23" xoffset="2" yoffset="0" xadvance="14" page="0" chnl="15" />
+ <char id="314" x="137" y="147" width="5" height="23" xoffset="1" yoffset="0" xadvance="6" page="0" chnl="15" />
+ <char id="315" x="27" y="172" width="12" height="22" xoffset="2" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="316" x="175" y="170" width="7" height="22" xoffset="0" yoffset="5" xadvance="6" page="0" chnl="15" />
+ <char id="317" x="91" y="351" width="12" height="18" xoffset="2" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="318" x="503" y="324" width="8" height="18" xoffset="1" yoffset="5" xadvance="9" page="0" chnl="15" />
+ <char id="319" x="234" y="349" width="12" height="18" xoffset="2" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="320" x="410" y="363" width="9" height="18" xoffset="1" yoffset="5" xadvance="11" page="0" chnl="15" />
+ <char id="321" x="165" y="311" width="14" height="18" xoffset="0" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="322" x="35" y="389" width="7" height="18" xoffset="0" yoffset="5" xadvance="6" page="0" chnl="15" />
+ <char id="323" x="165" y="99" width="14" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
+ <char id="324" x="312" y="345" width="12" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="325" x="438" y="145" width="14" height="22" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="326" x="325" y="345" width="12" height="18" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="327" x="105" y="99" width="14" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
+ <char id="328" x="338" y="345" width="12" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="329" x="354" y="268" width="17" height="18" xoffset="-1" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="330" x="119" y="214" width="15" height="19" xoffset="2" yoffset="4" xadvance="17" page="0" chnl="15" />
+ <char id="331" x="169" y="234" width="12" height="19" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="332" x="274" y="146" width="17" height="22" xoffset="1" yoffset="1" xadvance="18" page="0" chnl="15" />
+ <char id="333" x="358" y="383" width="13" height="17" xoffset="1" yoffset="6" xadvance="14" page="0" chnl="15" />
+ <char id="334" x="0" y="52" width="17" height="23" xoffset="1" yoffset="0" xadvance="18" page="0" chnl="15" />
+ <char id="335" x="420" y="305" width="13" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="336" x="492" y="24" width="17" height="23" xoffset="1" yoffset="0" xadvance="18" page="0" chnl="15" />
+ <char id="337" x="434" y="305" width="13" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="338" x="121" y="194" width="23" height="19" xoffset="1" yoffset="4" xadvance="24" page="0" chnl="15" />
+ <char id="339" x="159" y="422" width="21" height="14" xoffset="1" yoffset="9" xadvance="22" page="0" chnl="15" />
+ <char id="340" x="0" y="76" width="16" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
+ <char id="341" x="380" y="363" width="9" height="18" xoffset="1" yoffset="5" xadvance="9" page="0" chnl="15" />
+ <char id="342" x="310" y="145" width="16" height="22" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="343" x="369" y="363" width="10" height="18" xoffset="0" yoffset="9" xadvance="9" page="0" chnl="15" />
+ <char id="344" x="136" y="75" width="16" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
+ <char id="345" x="420" y="363" width="9" height="18" xoffset="1" yoffset="5" xadvance="9" page="0" chnl="15" />
+ <char id="346" x="15" y="100" width="14" height="23" xoffset="1" yoffset="0" xadvance="16" page="0" chnl="15" />
+ <char id="347" x="360" y="325" width="12" height="18" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="348" x="0" y="100" width="14" height="23" xoffset="1" yoffset="0" xadvance="16" page="0" chnl="15" />
+ <char id="349" x="286" y="347" width="12" height="18" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="350" x="473" y="72" width="14" height="23" xoffset="1" yoffset="4" xadvance="16" page="0" chnl="15" />
+ <char id="351" x="260" y="347" width="12" height="18" xoffset="0" yoffset="9" xadvance="13" page="0" chnl="15" />
+ <char id="352" x="458" y="72" width="14" height="23" xoffset="1" yoffset="0" xadvance="16" page="0" chnl="15" />
+ <char id="353" x="26" y="351" width="12" height="18" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="354" x="192" y="0" width="14" height="25" xoffset="1" yoffset="3" xadvance="15" page="0" chnl="15" />
+ <char id="355" x="410" y="0" width="8" height="24" xoffset="0" yoffset="4" xadvance="8" page="0" chnl="15" />
+ <char id="356" x="398" y="73" width="14" height="23" xoffset="1" yoffset="0" xadvance="15" page="0" chnl="15" />
+ <char id="357" x="351" y="345" width="12" height="18" xoffset="0" yoffset="5" xadvance="11" page="0" chnl="15" />
+ <char id="358" x="60" y="313" width="14" height="18" xoffset="1" yoffset="5" xadvance="15" page="0" chnl="15" />
+ <char id="359" x="18" y="389" width="8" height="18" xoffset="0" yoffset="5" xadvance="8" page="0" chnl="15" />
+ <char id="360" x="383" y="73" width="14" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
+ <char id="361" x="117" y="351" width="12" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="362" x="393" y="145" width="14" height="22" xoffset="2" yoffset="1" xadvance="17" page="0" chnl="15" />
+ <char id="363" x="439" y="381" width="12" height="17" xoffset="1" yoffset="6" xadvance="14" page="0" chnl="15" />
+ <char id="364" x="368" y="73" width="14" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
+ <char id="365" x="247" y="347" width="12" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="366" x="338" y="73" width="14" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
+ <char id="367" x="486" y="167" width="12" height="20" xoffset="1" yoffset="3" xadvance="14" page="0" chnl="15" />
+ <char id="368" x="308" y="73" width="14" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
+ <char id="369" x="39" y="370" width="12" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="370" x="293" y="73" width="14" height="23" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="371" x="213" y="212" width="14" height="19" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="372" x="48" y="27" width="23" height="23" xoffset="0" yoffset="0" xadvance="22" page="0" chnl="15" />
+ <char id="373" x="237" y="252" width="20" height="18" xoffset="0" yoffset="5" xadvance="19" page="0" chnl="15" />
+ <char id="374" x="312" y="25" width="17" height="23" xoffset="0" yoffset="0" xadvance="16" page="0" chnl="15" />
+ <char id="375" x="263" y="73" width="14" height="23" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="376" x="324" y="49" width="17" height="23" xoffset="0" yoffset="0" xadvance="16" page="0" chnl="15" />
+ <char id="377" x="218" y="74" width="14" height="23" xoffset="0" yoffset="0" xadvance="14" page="0" chnl="15" />
+ <char id="378" x="238" y="368" width="11" height="18" xoffset="0" yoffset="5" xadvance="12" page="0" chnl="15" />
+ <char id="379" x="150" y="99" width="14" height="23" xoffset="0" yoffset="0" xadvance="14" page="0" chnl="15" />
+ <char id="380" x="178" y="368" width="11" height="18" xoffset="0" yoffset="5" xadvance="12" page="0" chnl="15" />
+ <char id="381" x="135" y="99" width="14" height="23" xoffset="0" yoffset="0" xadvance="14" page="0" chnl="15" />
+ <char id="382" x="142" y="368" width="11" height="18" xoffset="0" yoffset="5" xadvance="12" page="0" chnl="15" />
+ <char id="383" x="51" y="389" width="7" height="18" xoffset="1" yoffset="5" xadvance="6" page="0" chnl="15" />
+ <char id="399" x="459" y="189" width="16" height="19" xoffset="1" yoffset="4" xadvance="17" page="0" chnl="15" />
+ <char id="402" x="120" y="99" width="14" height="23" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="416" x="256" y="191" width="20" height="19" xoffset="1" yoffset="4" xadvance="20" page="0" chnl="15" />
+ <char id="417" x="468" y="415" width="16" height="14" xoffset="1" yoffset="9" xadvance="17" page="0" chnl="15" />
+ <char id="431" x="97" y="275" width="18" height="18" xoffset="2" yoffset="5" xadvance="20" page="0" chnl="15" />
+ <char id="432" x="485" y="415" width="16" height="14" xoffset="1" yoffset="9" xadvance="17" page="0" chnl="15" />
+ <char id="461" x="474" y="24" width="17" height="23" xoffset="0" yoffset="0" xadvance="16" page="0" chnl="15" />
+ <char id="462" x="65" y="351" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="463" x="29" y="148" width="8" height="23" xoffset="0" yoffset="0" xadvance="6" page="0" chnl="15" />
+ <char id="464" x="0" y="389" width="8" height="18" xoffset="0" yoffset="5" xadvance="6" page="0" chnl="15" />
+ <char id="465" x="450" y="48" width="17" height="23" xoffset="1" yoffset="0" xadvance="18" page="0" chnl="15" />
+ <char id="466" x="280" y="309" width="13" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="467" x="195" y="99" width="14" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
+ <char id="468" x="273" y="347" width="12" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="469" x="225" y="98" width="14" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
+ <char id="470" x="384" y="121" width="12" height="23" xoffset="1" yoffset="0" xadvance="14" page="0" chnl="15" />
+ <char id="471" x="240" y="98" width="14" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
+ <char id="472" x="131" y="171" width="12" height="22" xoffset="1" yoffset="1" xadvance="14" page="0" chnl="15" />
+ <char id="473" x="443" y="72" width="14" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
+ <char id="474" x="79" y="172" width="12" height="22" xoffset="1" yoffset="1" xadvance="14" page="0" chnl="15" />
+ <char id="475" x="30" y="100" width="14" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
+ <char id="476" x="105" y="171" width="12" height="22" xoffset="1" yoffset="1" xadvance="14" page="0" chnl="15" />
+ <char id="506" x="287" y="0" width="17" height="24" xoffset="0" yoffset="-1" xadvance="16" page="0" chnl="15" />
+ <char id="507" x="332" y="121" width="12" height="23" xoffset="1" yoffset="0" xadvance="13" page="0" chnl="15" />
+ <char id="508" x="419" y="0" width="24" height="23" xoffset="-1" yoffset="0" xadvance="24" page="0" chnl="15" />
+ <char id="509" x="258" y="252" width="20" height="18" xoffset="1" yoffset="5" xadvance="21" page="0" chnl="15" />
+ <char id="510" x="249" y="0" width="18" height="24" xoffset="0" yoffset="0" xadvance="18" page="0" chnl="15" />
+ <char id="511" x="308" y="307" width="13" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="601" x="182" y="452" width="12" height="14" xoffset="0" yoffset="9" xadvance="13" page="0" chnl="15" />
+ <char id="710" x="149" y="494" width="8" height="4" xoffset="0" yoffset="5" xadvance="8" page="0" chnl="15" />
+ <char id="711" x="140" y="494" width="8" height="4" xoffset="0" yoffset="5" xadvance="8" page="0" chnl="15" />
+ <char id="713" x="348" y="484" width="8" height="3" xoffset="0" yoffset="5" xadvance="8" page="0" chnl="15" />
+ <char id="728" x="312" y="487" width="8" height="3" xoffset="0" yoffset="5" xadvance="8" page="0" chnl="15" />
+ <char id="729" x="399" y="482" width="4" height="3" xoffset="2" yoffset="5" xadvance="8" page="0" chnl="15" />
+ <char id="730" x="0" y="498" width="5" height="5" xoffset="1" yoffset="5" xadvance="8" page="0" chnl="15" />
+ <char id="731" x="412" y="475" width="6" height="6" xoffset="1" yoffset="22" xadvance="8" page="0" chnl="15" />
+ <char id="732" x="321" y="487" width="8" height="3" xoffset="0" yoffset="5" xadvance="8" page="0" chnl="15" />
+ <char id="733" x="130" y="495" width="9" height="4" xoffset="1" yoffset="5" xadvance="8" page="0" chnl="15" />
+ <char id="768" x="179" y="493" width="5" height="4" xoffset="-6" yoffset="0" xadvance="0" page="0" chnl="15" />
+ <char id="769" x="173" y="493" width="5" height="4" xoffset="-5" yoffset="0" xadvance="0" page="0" chnl="15" />
+ <char id="771" x="357" y="483" width="8" height="3" xoffset="-10" yoffset="1" xadvance="0" page="0" chnl="15" />
+ <char id="777" x="166" y="494" width="6" height="4" xoffset="-6" yoffset="0" xadvance="0" page="0" chnl="15" />
+ <char id="803" x="221" y="490" width="4" height="4" xoffset="-10" yoffset="24" xadvance="0" page="0" chnl="15" />
+ <char id="894" x="126" y="389" width="4" height="18" xoffset="2" yoffset="9" xadvance="8" page="0" chnl="15" />
+ <char id="900" x="197" y="490" width="5" height="4" xoffset="2" yoffset="5" xadvance="8" page="0" chnl="15" />
+ <char id="901" x="104" y="495" width="12" height="4" xoffset="0" yoffset="5" xadvance="11" page="0" chnl="15" />
+ <char id="902" x="154" y="273" width="18" height="18" xoffset="-1" yoffset="5" xadvance="16" page="0" chnl="15" />
+ <char id="903" x="226" y="490" width="4" height="4" xoffset="2" yoffset="9" xadvance="8" page="0" chnl="15" />
+ <char id="904" x="45" y="256" width="21" height="18" xoffset="-1" yoffset="5" xadvance="20" page="0" chnl="15" />
+ <char id="905" x="67" y="256" width="21" height="18" xoffset="-1" yoffset="5" xadvance="21" page="0" chnl="15" />
+ <char id="906" x="334" y="364" width="11" height="18" xoffset="-1" yoffset="5" xadvance="11" page="0" chnl="15" />
+ <char id="908" x="168" y="194" width="21" height="19" xoffset="-1" yoffset="4" xadvance="20" page="0" chnl="15" />
+ <char id="910" x="445" y="229" width="23" height="18" xoffset="0" yoffset="5" xadvance="22" page="0" chnl="15" />
+ <char id="911" x="190" y="192" width="21" height="19" xoffset="-1" yoffset="4" xadvance="20" page="0" chnl="15" />
+ <char id="912" x="390" y="344" width="12" height="18" xoffset="-2" yoffset="5" xadvance="6" page="0" chnl="15" />
+ <char id="913" x="372" y="268" width="17" height="18" xoffset="0" yoffset="5" xadvance="16" page="0" chnl="15" />
+ <char id="914" x="269" y="290" width="15" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="915" x="364" y="344" width="12" height="18" xoffset="2" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="916" x="116" y="273" width="18" height="18" xoffset="0" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="917" x="350" y="306" width="13" height="18" xoffset="2" yoffset="5" xadvance="16" page="0" chnl="15" />
+ <char id="918" x="150" y="311" width="14" height="18" xoffset="0" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="919" x="0" y="313" width="14" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="920" x="424" y="189" width="17" height="19" xoffset="1" yoffset="4" xadvance="18" page="0" chnl="15" />
+ <char id="921" x="507" y="343" width="4" height="18" xoffset="1" yoffset="5" xadvance="6" page="0" chnl="15" />
+ <char id="922" x="153" y="292" width="16" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="923" x="170" y="292" width="16" height="18" xoffset="0" yoffset="5" xadvance="16" page="0" chnl="15" />
+ <char id="924" x="210" y="273" width="17" height="18" xoffset="2" yoffset="5" xadvance="20" page="0" chnl="15" />
+ <char id="925" x="471" y="286" width="14" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="926" x="456" y="286" width="14" height="18" xoffset="1" yoffset="5" xadvance="15" page="0" chnl="15" />
+ <char id="927" x="388" y="189" width="17" height="19" xoffset="1" yoffset="4" xadvance="18" page="0" chnl="15" />
+ <char id="928" x="441" y="286" width="14" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="929" x="364" y="306" width="13" height="18" xoffset="2" yoffset="5" xadvance="16" page="0" chnl="15" />
+ <char id="931" x="392" y="306" width="13" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="932" x="426" y="286" width="14" height="18" xoffset="1" yoffset="5" xadvance="15" page="0" chnl="15" />
+ <char id="933" x="300" y="269" width="17" height="18" xoffset="0" yoffset="5" xadvance="16" page="0" chnl="15" />
+ <char id="934" x="296" y="190" width="18" height="19" xoffset="1" yoffset="4" xadvance="19" page="0" chnl="15" />
+ <char id="935" x="204" y="292" width="16" height="18" xoffset="0" yoffset="5" xadvance="16" page="0" chnl="15" />
+ <char id="936" x="173" y="273" width="18" height="18" xoffset="1" yoffset="5" xadvance="19" page="0" chnl="15" />
+ <char id="937" x="277" y="191" width="18" height="19" xoffset="0" yoffset="4" xadvance="19" page="0" chnl="15" />
+ <char id="938" x="65" y="148" width="8" height="23" xoffset="0" yoffset="0" xadvance="6" page="0" chnl="15" />
+ <char id="939" x="402" y="25" width="17" height="23" xoffset="0" yoffset="0" xadvance="16" page="0" chnl="15" />
+ <char id="940" x="294" y="308" width="13" height="18" xoffset="1" yoffset="5" xadvance="15" page="0" chnl="15" />
+ <char id="941" x="262" y="366" width="11" height="18" xoffset="1" yoffset="5" xadvance="11" page="0" chnl="15" />
+ <char id="942" x="163" y="123" width="12" height="23" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="943" x="94" y="389" width="5" height="18" xoffset="1" yoffset="5" xadvance="6" page="0" chnl="15" />
+ <char id="944" x="464" y="324" width="12" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="945" x="182" y="437" width="13" height="14" xoffset="1" yoffset="9" xadvance="15" page="0" chnl="15" />
+ <char id="946" x="189" y="123" width="12" height="23" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="947" x="167" y="214" width="15" height="19" xoffset="0" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="948" x="406" y="306" width="13" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="949" x="329" y="448" width="11" height="14" xoffset="1" yoffset="9" xadvance="11" page="0" chnl="15" />
+ <char id="950" x="482" y="120" width="10" height="23" xoffset="1" yoffset="5" xadvance="11" page="0" chnl="15" />
+ <char id="951" x="182" y="234" width="12" height="19" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="952" x="274" y="366" width="11" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="953" x="104" y="470" width="4" height="14" xoffset="1" yoffset="9" xadvance="6" page="0" chnl="15" />
+ <char id="954" x="375" y="432" width="12" height="14" xoffset="1" yoffset="9" xadvance="13" page="0" chnl="15" />
+ <char id="955" x="221" y="292" width="15" height="18" xoffset="0" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="956" x="195" y="234" width="12" height="19" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="957" x="79" y="441" width="14" height="14" xoffset="0" yoffset="9" xadvance="13" page="0" chnl="15" />
+ <char id="958" x="471" y="120" width="10" height="23" xoffset="1" yoffset="5" xadvance="10" page="0" chnl="15" />
+ <char id="959" x="168" y="437" width="13" height="14" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="960" x="284" y="420" width="18" height="14" xoffset="0" yoffset="9" xadvance="18" page="0" chnl="15" />
+ <char id="961" x="392" y="209" width="13" height="19" xoffset="1" yoffset="9" xadvance="15" page="0" chnl="15" />
+ <char id="962" x="257" y="232" width="11" height="19" xoffset="1" yoffset="9" xadvance="12" page="0" chnl="15" />
+ <char id="963" x="48" y="441" width="15" height="14" xoffset="1" yoffset="9" xadvance="16" page="0" chnl="15" />
+ <char id="964" x="418" y="446" width="10" height="14" xoffset="0" yoffset="9" xadvance="10" page="0" chnl="15" />
+ <char id="965" x="257" y="452" width="11" height="14" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="966" x="51" y="216" width="16" height="19" xoffset="1" yoffset="9" xadvance="17" page="0" chnl="15" />
+ <char id="967" x="273" y="211" width="14" height="19" xoffset="0" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="968" x="85" y="215" width="16" height="19" xoffset="1" yoffset="9" xadvance="18" page="0" chnl="15" />
+ <char id="969" x="264" y="422" width="19" height="14" xoffset="1" yoffset="9" xadvance="20" page="0" chnl="15" />
+ <char id="970" x="466" y="362" width="8" height="18" xoffset="0" yoffset="5" xadvance="6" page="0" chnl="15" />
+ <char id="971" x="310" y="365" width="11" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="972" x="490" y="305" width="13" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="973" x="322" y="364" width="11" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="974" x="440" y="248" width="19" height="18" xoffset="1" yoffset="5" xadvance="20" page="0" chnl="15" />
+ <char id="1025" x="56" y="124" width="13" height="23" xoffset="2" yoffset="0" xadvance="16" page="0" chnl="15" />
+ <char id="1026" x="132" y="254" width="20" height="18" xoffset="0" yoffset="5" xadvance="21" page="0" chnl="15" />
+ <char id="1027" x="228" y="122" width="12" height="23" xoffset="2" yoffset="0" xadvance="14" page="0" chnl="15" />
+ <char id="1028" x="151" y="214" width="15" height="19" xoffset="1" yoffset="4" xadvance="17" page="0" chnl="15" />
+ <char id="1029" x="258" y="211" width="14" height="19" xoffset="1" yoffset="4" xadvance="16" page="0" chnl="15" />
+ <char id="1030" x="131" y="387" width="4" height="18" xoffset="1" yoffset="5" xadvance="6" page="0" chnl="15" />
+ <char id="1031" x="47" y="148" width="8" height="23" xoffset="0" yoffset="0" xadvance="6" page="0" chnl="15" />
+ <char id="1032" x="346" y="364" width="11" height="18" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="1033" x="319" y="230" width="25" height="18" xoffset="0" yoffset="5" xadvance="26" page="0" chnl="15" />
+ <char id="1034" x="421" y="229" width="23" height="18" xoffset="2" yoffset="5" xadvance="25" page="0" chnl="15" />
+ <char id="1035" x="460" y="248" width="19" height="18" xoffset="0" yoffset="5" xadvance="21" page="0" chnl="15" />
+ <char id="1036" x="493" y="96" width="13" height="23" xoffset="2" yoffset="0" xadvance="14" page="0" chnl="15" />
+ <char id="1038" x="119" y="75" width="16" height="23" xoffset="0" yoffset="0" xadvance="15" page="0" chnl="15" />
+ <char id="1039" x="423" y="145" width="14" height="22" xoffset="2" yoffset="5" xadvance="18" page="0" chnl="15" />
+ <char id="1040" x="282" y="270" width="17" height="18" xoffset="0" yoffset="5" xadvance="16" page="0" chnl="15" />
+ <char id="1041" x="349" y="287" width="15" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="1042" x="333" y="288" width="15" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="1043" x="195" y="349" width="12" height="18" xoffset="2" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="1044" x="238" y="146" width="17" height="22" xoffset="0" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="1045" x="196" y="330" width="13" height="18" xoffset="2" yoffset="5" xadvance="16" page="0" chnl="15" />
+ <char id="1046" x="0" y="256" width="22" height="18" xoffset="0" yoffset="5" xadvance="21" page="0" chnl="15" />
+ <char id="1047" x="303" y="210" width="14" height="19" xoffset="0" yoffset="4" xadvance="15" page="0" chnl="15" />
+ <char id="1048" x="75" y="313" width="14" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="1049" x="278" y="73" width="14" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
+ <char id="1050" x="210" y="330" width="13" height="18" xoffset="2" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="1051" x="285" y="289" width="15" height="18" xoffset="0" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="1052" x="228" y="271" width="17" height="18" xoffset="2" yoffset="5" xadvance="20" page="0" chnl="15" />
+ <char id="1053" x="45" y="313" width="14" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="1054" x="370" y="190" width="17" height="19" xoffset="1" yoffset="4" xadvance="18" page="0" chnl="15" />
+ <char id="1055" x="30" y="313" width="14" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="1056" x="252" y="328" width="13" height="18" xoffset="2" yoffset="5" xadvance="16" page="0" chnl="15" />
+ <char id="1057" x="0" y="216" width="16" height="19" xoffset="1" yoffset="4" xadvance="17" page="0" chnl="15" />
+ <char id="1058" x="15" y="313" width="14" height="18" xoffset="1" yoffset="5" xadvance="15" page="0" chnl="15" />
+ <char id="1059" x="34" y="294" width="16" height="18" xoffset="0" yoffset="5" xadvance="15" page="0" chnl="15" />
+ <char id="1060" x="380" y="249" width="19" height="18" xoffset="1" yoffset="5" xadvance="20" page="0" chnl="15" />
+ <char id="1061" x="476" y="267" width="16" height="18" xoffset="0" yoffset="5" xadvance="16" page="0" chnl="15" />
+ <char id="1062" x="361" y="145" width="15" height="22" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="1063" x="182" y="330" width="13" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="1064" x="89" y="256" width="21" height="18" xoffset="2" yoffset="5" xadvance="24" page="0" chnl="15" />
+ <char id="1065" x="173" y="147" width="22" height="22" xoffset="2" yoffset="5" xadvance="24" page="0" chnl="15" />
+ <char id="1066" x="279" y="251" width="20" height="18" xoffset="0" yoffset="5" xadvance="21" page="0" chnl="15" />
+ <char id="1067" x="111" y="254" width="20" height="18" xoffset="2" yoffset="5" xadvance="23" page="0" chnl="15" />
+ <char id="1068" x="365" y="287" width="15" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="1069" x="135" y="214" width="15" height="19" xoffset="1" yoffset="4" xadvance="17" page="0" chnl="15" />
+ <char id="1070" x="145" y="194" width="22" height="19" xoffset="2" yoffset="4" xadvance="25" page="0" chnl="15" />
+ <char id="1071" x="425" y="267" width="16" height="18" xoffset="0" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="1072" x="349" y="433" width="12" height="14" xoffset="1" yoffset="9" xadvance="13" page="0" chnl="15" />
+ <char id="1073" x="434" y="209" width="13" height="19" xoffset="1" yoffset="4" xadvance="15" page="0" chnl="15" />
+ <char id="1074" x="308" y="435" width="13" height="14" xoffset="1" yoffset="9" xadvance="15" page="0" chnl="15" />
+ <char id="1075" x="451" y="446" width="9" height="14" xoffset="1" yoffset="9" xadvance="10" page="0" chnl="15" />
+ <char id="1076" x="299" y="385" width="15" height="17" xoffset="0" yoffset="9" xadvance="15" page="0" chnl="15" />
+ <char id="1077" x="453" y="430" width="12" height="14" xoffset="1" yoffset="9" xadvance="13" page="0" chnl="15" />
+ <char id="1078" x="379" y="417" width="18" height="14" xoffset="0" yoffset="9" xadvance="17" page="0" chnl="15" />
+ <char id="1079" x="245" y="452" width="11" height="14" xoffset="0" yoffset="9" xadvance="12" page="0" chnl="15" />
+ <char id="1080" x="479" y="430" width="12" height="14" xoffset="1" yoffset="9" xadvance="15" page="0" chnl="15" />
+ <char id="1081" x="91" y="370" width="12" height="18" xoffset="1" yoffset="5" xadvance="15" page="0" chnl="15" />
+ <char id="1082" x="281" y="452" width="11" height="14" xoffset="1" yoffset="9" xadvance="12" page="0" chnl="15" />
+ <char id="1083" x="94" y="440" width="14" height="14" xoffset="0" yoffset="9" xadvance="15" page="0" chnl="15" />
+ <char id="1084" x="16" y="442" width="15" height="14" xoffset="1" yoffset="9" xadvance="17" page="0" chnl="15" />
+ <char id="1085" x="13" y="457" width="12" height="14" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="1086" x="238" y="437" width="13" height="14" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="1087" x="388" y="432" width="12" height="14" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="1088" x="475" y="209" width="12" height="19" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="1089" x="466" y="430" width="12" height="14" xoffset="1" yoffset="9" xadvance="13" page="0" chnl="15" />
+ <char id="1090" x="414" y="431" width="12" height="14" xoffset="0" yoffset="9" xadvance="11" page="0" chnl="15" />
+ <char id="1091" x="183" y="214" width="14" height="19" xoffset="0" yoffset="9" xadvance="13" page="0" chnl="15" />
+ <char id="1092" x="492" y="0" width="19" height="23" xoffset="1" yoffset="5" xadvance="20" page="0" chnl="15" />
+ <char id="1093" x="109" y="440" width="14" height="14" xoffset="0" yoffset="9" xadvance="13" page="0" chnl="15" />
+ <char id="1094" x="372" y="382" width="13" height="17" xoffset="1" yoffset="9" xadvance="15" page="0" chnl="15" />
+ <char id="1095" x="233" y="452" width="11" height="14" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="1096" x="398" y="416" width="17" height="14" xoffset="1" yoffset="9" xadvance="19" page="0" chnl="15" />
+ <char id="1097" x="229" y="387" width="18" height="17" xoffset="1" yoffset="9" xadvance="20" page="0" chnl="15" />
+ <char id="1098" x="451" y="415" width="16" height="14" xoffset="1" yoffset="9" xadvance="17" page="0" chnl="15" />
+ <char id="1099" x="360" y="417" width="18" height="14" xoffset="1" yoffset="9" xadvance="20" page="0" chnl="15" />
+ <char id="1100" x="196" y="437" width="13" height="14" xoffset="1" yoffset="9" xadvance="15" page="0" chnl="15" />
+ <char id="1101" x="26" y="457" width="12" height="14" xoffset="1" yoffset="9" xadvance="13" page="0" chnl="15" />
+ <char id="1102" x="322" y="418" width="18" height="14" xoffset="1" yoffset="9" xadvance="20" page="0" chnl="15" />
+ <char id="1103" x="252" y="437" width="13" height="14" xoffset="0" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="1105" x="104" y="370" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="1106" x="14" y="124" width="13" height="23" xoffset="0" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="1107" x="390" y="363" width="9" height="18" xoffset="1" yoffset="5" xadvance="10" page="0" chnl="15" />
+ <char id="1108" x="0" y="457" width="12" height="14" xoffset="1" yoffset="9" xadvance="13" page="0" chnl="15" />
+ <char id="1109" x="492" y="430" width="12" height="14" xoffset="0" yoffset="9" xadvance="13" page="0" chnl="15" />
+ <char id="1110" x="136" y="387" width="4" height="18" xoffset="1" yoffset="5" xadvance="6" page="0" chnl="15" />
+ <char id="1111" x="457" y="362" width="8" height="18" xoffset="0" yoffset="5" xadvance="6" page="0" chnl="15" />
+ <char id="1112" x="130" y="147" width="6" height="23" xoffset="-1" yoffset="5" xadvance="6" page="0" chnl="15" />
+ <char id="1113" x="135" y="425" width="23" height="14" xoffset="0" yoffset="9" xadvance="23" page="0" chnl="15" />
+ <char id="1114" x="202" y="422" width="20" height="14" xoffset="1" yoffset="9" xadvance="22" page="0" chnl="15" />
+ <char id="1115" x="126" y="330" width="13" height="18" xoffset="0" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="1116" x="226" y="368" width="11" height="18" xoffset="1" yoffset="5" xadvance="12" page="0" chnl="15" />
+ <char id="1118" x="323" y="73" width="14" height="23" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="1119" x="413" y="382" width="12" height="17" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="1168" x="156" y="171" width="9" height="22" xoffset="2" yoffset="1" xadvance="11" page="0" chnl="15" />
+ <char id="1169" x="490" y="381" width="9" height="17" xoffset="1" yoffset="6" xadvance="10" page="0" chnl="15" />
+ <char id="1170" x="198" y="212" width="14" height="19" xoffset="0" yoffset="4" xadvance="13" page="0" chnl="15" />
+ <char id="1171" x="352" y="448" width="10" height="14" xoffset="0" yoffset="9" xadvance="10" page="0" chnl="15" />
+ <char id="1174" x="196" y="147" width="22" height="22" xoffset="0" yoffset="5" xadvance="21" page="0" chnl="15" />
+ <char id="1175" x="248" y="387" width="18" height="17" xoffset="0" yoffset="9" xadvance="17" page="0" chnl="15" />
+ <char id="1178" x="339" y="97" width="13" height="23" xoffset="2" yoffset="4" xadvance="14" page="0" chnl="15" />
+ <char id="1179" x="166" y="368" width="11" height="18" xoffset="1" yoffset="8" xadvance="12" page="0" chnl="15" />
+ <char id="1180" x="294" y="327" width="13" height="18" xoffset="2" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="1181" x="221" y="452" width="11" height="14" xoffset="1" yoffset="9" xadvance="12" page="0" chnl="15" />
+ <char id="1186" x="377" y="145" width="15" height="22" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="1187" x="344" y="383" width="13" height="17" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="1198" x="90" y="313" width="14" height="18" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="1199" x="105" y="313" width="14" height="18" xoffset="0" yoffset="9" xadvance="13" page="0" chnl="15" />
+ <char id="1200" x="120" y="311" width="14" height="18" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="1201" x="363" y="210" width="14" height="19" xoffset="0" yoffset="9" xadvance="13" page="0" chnl="15" />
+ <char id="1202" x="344" y="145" width="16" height="22" xoffset="0" yoffset="5" xadvance="16" page="0" chnl="15" />
+ <char id="1203" x="330" y="383" width="13" height="17" xoffset="0" yoffset="9" xadvance="13" page="0" chnl="15" />
+ <char id="1208" x="252" y="309" width="13" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="1209" x="293" y="452" width="11" height="14" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="1210" x="411" y="286" width="14" height="18" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="1211" x="39" y="351" width="12" height="18" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="1240" x="476" y="188" width="16" height="19" xoffset="1" yoffset="4" xadvance="17" page="0" chnl="15" />
+ <char id="1241" x="156" y="455" width="12" height="14" xoffset="0" yoffset="9" xadvance="13" page="0" chnl="15" />
+ <char id="1256" x="352" y="190" width="17" height="19" xoffset="1" yoffset="4" xadvance="18" page="0" chnl="15" />
+ <char id="1257" x="154" y="440" width="13" height="14" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="1456" x="17" y="498" width="2" height="5" xoffset="3" yoffset="23" xadvance="8" page="0" chnl="15" />
+ <char id="1457" x="462" y="473" width="8" height="5" xoffset="0" yoffset="23" xadvance="8" page="0" chnl="15" />
+ <char id="1458" x="479" y="471" width="7" height="5" xoffset="0" yoffset="23" xadvance="8" page="0" chnl="15" />
+ <char id="1459" x="487" y="471" width="7" height="5" xoffset="1" yoffset="23" xadvance="8" page="0" chnl="15" />
+ <char id="1460" x="175" y="467" width="2" height="2" xoffset="3" yoffset="25" xadvance="8" page="0" chnl="15" />
+ <char id="1461" x="423" y="481" width="5" height="2" xoffset="1" yoffset="25" xadvance="8" page="0" chnl="15" />
+ <char id="1462" x="501" y="471" width="5" height="5" xoffset="1" yoffset="23" xadvance="8" page="0" chnl="15" />
+ <char id="1463" x="183" y="192" width="5" height="1" xoffset="1" yoffset="25" xadvance="8" page="0" chnl="15" />
+ <char id="1464" x="209" y="490" width="5" height="4" xoffset="2" yoffset="24" xadvance="8" page="0" chnl="15" />
+ <char id="1465" x="414" y="482" width="2" height="3" xoffset="3" yoffset="6" xadvance="8" page="0" chnl="15" />
+ <char id="1466" x="411" y="482" width="2" height="3" xoffset="3" yoffset="6" xadvance="8" page="0" chnl="15" />
+ <char id="1467" x="453" y="473" width="8" height="5" xoffset="0" yoffset="23" xadvance="8" page="0" chnl="15" />
+ <char id="1468" x="408" y="482" width="2" height="3" xoffset="3" yoffset="14" xadvance="8" page="0" chnl="15" />
+ <char id="1469" x="509" y="152" width="1" height="5" xoffset="3" yoffset="23" xadvance="8" page="0" chnl="15" />
+ <char id="1470" x="330" y="486" width="8" height="3" xoffset="1" yoffset="9" xadvance="10" page="0" chnl="15" />
+ <char id="1471" x="169" y="467" width="5" height="2" xoffset="1" yoffset="7" xadvance="8" page="0" chnl="15" />
+ <char id="1472" x="146" y="387" width="3" height="18" xoffset="2" yoffset="7" xadvance="7" page="0" chnl="15" />
+ <char id="1473" x="420" y="481" width="2" height="3" xoffset="9" yoffset="6" xadvance="8" page="0" chnl="15" />
+ <char id="1474" x="417" y="482" width="2" height="3" xoffset="-3" yoffset="6" xadvance="8" page="0" chnl="15" />
+ <char id="1475" x="109" y="470" width="4" height="14" xoffset="2" yoffset="9" xadvance="8" page="0" chnl="15" />
+ <char id="1488" x="224" y="437" width="13" height="14" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="1489" x="266" y="437" width="13" height="14" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="1490" x="341" y="448" width="10" height="14" xoffset="0" yoffset="9" xadvance="11" page="0" chnl="15" />
+ <char id="1491" x="195" y="452" width="12" height="14" xoffset="0" yoffset="9" xadvance="13" page="0" chnl="15" />
+ <char id="1492" x="208" y="452" width="12" height="14" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="1493" x="114" y="470" width="4" height="14" xoffset="1" yoffset="9" xadvance="6" page="0" chnl="15" />
+ <char id="1494" x="0" y="472" width="9" height="14" xoffset="1" yoffset="9" xadvance="10" page="0" chnl="15" />
+ <char id="1495" x="336" y="433" width="12" height="14" xoffset="1" yoffset="9" xadvance="15" page="0" chnl="15" />
+ <char id="1496" x="362" y="432" width="12" height="14" xoffset="1" yoffset="9" xadvance="15" page="0" chnl="15" />
+ <char id="1497" x="287" y="481" width="4" height="8" xoffset="1" yoffset="9" xadvance="6" page="0" chnl="15" />
+ <char id="1498" x="245" y="232" width="11" height="19" xoffset="0" yoffset="9" xadvance="12" page="0" chnl="15" />
+ <char id="1499" x="429" y="446" width="10" height="14" xoffset="1" yoffset="9" xadvance="12" page="0" chnl="15" />
+ <char id="1500" x="501" y="286" width="10" height="18" xoffset="1" yoffset="5" xadvance="12" page="0" chnl="15" />
+ <char id="1501" x="401" y="431" width="12" height="14" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="1502" x="280" y="437" width="13" height="14" xoffset="0" yoffset="9" xadvance="15" page="0" chnl="15" />
+ <char id="1503" x="286" y="231" width="4" height="19" xoffset="1" yoffset="9" xadvance="6" page="0" chnl="15" />
+ <char id="1504" x="71" y="471" width="7" height="14" xoffset="1" yoffset="9" xadvance="9" page="0" chnl="15" />
+ <char id="1505" x="210" y="437" width="13" height="14" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="1506" x="171" y="405" width="12" height="16" xoffset="0" yoffset="9" xadvance="13" page="0" chnl="15" />
+ <char id="1507" x="488" y="208" width="12" height="19" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="1508" x="440" y="431" width="12" height="14" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="1509" x="221" y="232" width="11" height="19" xoffset="0" yoffset="9" xadvance="12" page="0" chnl="15" />
+ <char id="1510" x="427" y="431" width="12" height="14" xoffset="0" yoffset="9" xadvance="12" page="0" chnl="15" />
+ <char id="1511" x="0" y="236" width="12" height="19" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="1512" x="317" y="450" width="11" height="14" xoffset="0" yoffset="9" xadvance="12" page="0" chnl="15" />
+ <char id="1513" x="434" y="416" width="16" height="14" xoffset="1" yoffset="9" xadvance="17" page="0" chnl="15" />
+ <char id="1514" x="64" y="441" width="14" height="14" xoffset="0" yoffset="9" xadvance="16" page="0" chnl="15" />
+ <char id="1520" x="385" y="447" width="10" height="14" xoffset="1" yoffset="9" xadvance="13" page="0" chnl="15" />
+ <char id="1521" x="374" y="447" width="10" height="14" xoffset="1" yoffset="9" xadvance="13" page="0" chnl="15" />
+ <char id="1522" x="202" y="481" width="10" height="8" xoffset="1" yoffset="9" xadvance="13" page="0" chnl="15" />
+ <char id="1523" x="419" y="474" width="5" height="6" xoffset="1" yoffset="9" xadvance="7" page="0" chnl="15" />
+ <char id="1524" x="349" y="476" width="10" height="6" xoffset="1" yoffset="9" xadvance="12" page="0" chnl="15" />
+ <char id="1548" x="292" y="481" width="4" height="8" xoffset="2" yoffset="11" xadvance="7" page="0" chnl="15" />
+ <char id="1563" x="430" y="461" width="4" height="12" xoffset="1" yoffset="7" xadvance="7" page="0" chnl="15" />
+ <char id="1567" x="79" y="471" width="7" height="14" xoffset="1" yoffset="5" xadvance="8" page="0" chnl="15" />
+ <char id="1569" x="404" y="462" width="9" height="12" xoffset="1" yoffset="10" xadvance="11" page="0" chnl="15" />
+ <char id="1570" x="67" y="389" width="6" height="18" xoffset="0" yoffset="2" xadvance="5" page="0" chnl="15" />
+ <char id="1571" x="508" y="208" width="3" height="19" xoffset="1" yoffset="1" xadvance="5" page="0" chnl="15" />
+ <char id="1572" x="298" y="366" width="11" height="18" xoffset="0" yoffset="6" xadvance="11" page="0" chnl="15" />
+ <char id="1573" x="65" y="195" width="3" height="20" xoffset="1" yoffset="5" xadvance="5" page="0" chnl="15" />
+ <char id="1574" x="40" y="425" width="12" height="15" xoffset="2" yoffset="9" xadvance="15" page="0" chnl="15" />
+ <char id="1575" x="506" y="399" width="3" height="15" xoffset="1" yoffset="5" xadvance="5" page="0" chnl="15" />
+ <char id="1576" x="32" y="441" width="15" height="14" xoffset="0" yoffset="10" xadvance="15" page="0" chnl="15" />
+ <char id="1577" x="291" y="403" width="7" height="16" xoffset="0" yoffset="4" xadvance="8" page="0" chnl="15" />
+ <char id="1578" x="336" y="463" width="15" height="12" xoffset="0" yoffset="7" xadvance="15" page="0" chnl="15" />
+ <char id="1579" x="0" y="442" width="15" height="14" xoffset="0" yoffset="5" xadvance="15" page="0" chnl="15" />
+ <char id="1580" x="28" y="332" width="13" height="18" xoffset="1" yoffset="10" xadvance="14" page="0" chnl="15" />
+ <char id="1581" x="70" y="332" width="13" height="18" xoffset="1" yoffset="10" xadvance="14" page="0" chnl="15" />
+ <char id="1582" x="423" y="97" width="13" height="23" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="1583" x="467" y="460" width="7" height="11" xoffset="1" yoffset="8" xadvance="8" page="0" chnl="15" />
+ <char id="1584" x="17" y="408" width="7" height="17" xoffset="1" yoffset="2" xadvance="8" page="0" chnl="15" />
+ <char id="1585" x="246" y="467" width="11" height="13" xoffset="0" yoffset="11" xadvance="10" page="0" chnl="15" />
+ <char id="1586" x="130" y="368" width="11" height="18" xoffset="0" yoffset="6" xadvance="10" page="0" chnl="15" />
+ <char id="1587" x="124" y="470" width="21" height="13" xoffset="1" yoffset="11" xadvance="21" page="0" chnl="15" />
+ <char id="1588" x="212" y="192" width="21" height="19" xoffset="1" yoffset="5" xadvance="21" page="0" chnl="15" />
+ <char id="1589" x="109" y="425" width="25" height="14" xoffset="1" yoffset="10" xadvance="25" page="0" chnl="15" />
+ <char id="1590" x="95" y="194" width="25" height="19" xoffset="1" yoffset="5" xadvance="25" page="0" chnl="15" />
+ <char id="1591" x="127" y="408" width="14" height="16" xoffset="-1" yoffset="3" xadvance="12" page="0" chnl="15" />
+ <char id="1592" x="142" y="406" width="14" height="16" xoffset="-1" yoffset="3" xadvance="12" page="0" chnl="15" />
+ <char id="1593" x="459" y="168" width="13" height="20" xoffset="0" yoffset="8" xadvance="13" page="0" chnl="15" />
+ <char id="1594" x="164" y="0" width="13" height="26" xoffset="0" yoffset="2" xadvance="13" page="0" chnl="15" />
+ <char id="1600" x="382" y="482" width="6" height="3" xoffset="-1" yoffset="16" xadvance="5" page="0" chnl="15" />
+ <char id="1601" x="25" y="408" width="18" height="16" xoffset="0" yoffset="4" xadvance="18" page="0" chnl="15" />
+ <char id="1602" x="243" y="212" width="14" height="19" xoffset="0" yoffset="7" xadvance="14" page="0" chnl="15" />
+ <char id="1603" x="492" y="399" width="13" height="15" xoffset="0" yoffset="4" xadvance="13" page="0" chnl="15" />
+ <char id="1604" x="12" y="195" width="11" height="20" xoffset="0" yoffset="4" xadvance="11" page="0" chnl="15" />
+ <char id="1605" x="282" y="403" width="8" height="16" xoffset="0" yoffset="12" xadvance="8" page="0" chnl="15" />
+ <char id="1606" x="157" y="405" width="13" height="16" xoffset="0" yoffset="8" xadvance="13" page="0" chnl="15" />
+ <char id="1607" x="17" y="487" width="6" height="10" xoffset="1" yoffset="10" xadvance="8" page="0" chnl="15" />
+ <char id="1608" x="294" y="467" width="11" height="13" xoffset="0" yoffset="11" xadvance="11" page="0" chnl="15" />
+ <char id="1609" x="233" y="467" width="12" height="13" xoffset="2" yoffset="11" xadvance="15" page="0" chnl="15" />
+ <char id="1610" x="184" y="405" width="12" height="16" xoffset="2" yoffset="11" xadvance="15" page="0" chnl="15" />
+ <char id="1611" x="251" y="490" width="4" height="4" xoffset="1" yoffset="2" xadvance="5" page="0" chnl="15" />
+ <char id="1612" x="495" y="471" width="5" height="5" xoffset="0" yoffset="1" xadvance="5" page="0" chnl="15" />
+ <char id="1613" x="507" y="469" width="4" height="5" xoffset="1" yoffset="21" xadvance="5" page="0" chnl="15" />
+ <char id="1614" x="429" y="481" width="4" height="2" xoffset="1" yoffset="4" xadvance="5" page="0" chnl="15" />
+ <char id="1615" x="6" y="498" width="5" height="5" xoffset="0" yoffset="1" xadvance="5" page="0" chnl="15" />
+ <char id="1616" x="394" y="482" width="4" height="3" xoffset="1" yoffset="21" xadvance="5" page="0" chnl="15" />
+ <char id="1617" x="191" y="490" width="5" height="4" xoffset="0" yoffset="2" xadvance="5" page="0" chnl="15" />
+ <char id="1618" x="256" y="490" width="3" height="4" xoffset="1" yoffset="2" xadvance="4" page="0" chnl="15" />
+ <char id="1619" x="159" y="437" width="6" height="2" xoffset="0" yoffset="3" xadvance="5" page="0" chnl="15" />
+ <char id="1620" x="264" y="490" width="3" height="4" xoffset="1" yoffset="1" xadvance="5" page="0" chnl="15" />
+ <char id="1621" x="268" y="490" width="3" height="4" xoffset="1" yoffset="22" xadvance="5" page="0" chnl="15" />
+ <char id="1632" x="344" y="476" width="4" height="7" xoffset="4" yoffset="11" xadvance="13" page="0" chnl="15" />
+ <char id="1633" x="93" y="471" width="5" height="14" xoffset="4" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="1634" x="63" y="471" width="7" height="14" xoffset="3" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="1635" x="407" y="446" width="10" height="14" xoffset="2" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="1636" x="505" y="430" width="6" height="14" xoffset="3" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="1637" x="0" y="487" width="9" height="10" xoffset="2" yoffset="7" xadvance="13" page="0" chnl="15" />
+ <char id="1638" x="38" y="472" width="8" height="14" xoffset="2" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="1639" x="502" y="415" width="9" height="14" xoffset="2" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="1640" x="396" y="447" width="10" height="14" xoffset="2" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="1641" x="29" y="472" width="8" height="14" xoffset="3" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="1642" x="262" y="405" width="10" height="16" xoffset="1" yoffset="4" xadvance="12" page="0" chnl="15" />
+ <char id="1643" x="435" y="473" width="3" height="6" xoffset="2" yoffset="16" xadvance="7" page="0" chnl="15" />
+ <char id="1644" x="297" y="481" width="4" height="8" xoffset="2" yoffset="11" xadvance="7" page="0" chnl="15" />
+ <char id="1645" x="122" y="485" width="8" height="9" xoffset="2" yoffset="4" xadvance="12" page="0" chnl="15" />
+ <char id="1646" x="24" y="487" width="15" height="9" xoffset="0" yoffset="10" xadvance="15" page="0" chnl="15" />
+ <char id="1647" x="463" y="399" width="14" height="15" xoffset="0" yoffset="11" xadvance="14" page="0" chnl="15" />
+ <char id="1648" x="509" y="144" width="2" height="7" xoffset="0" yoffset="3" xadvance="0" page="0" chnl="15" />
+ <char id="1649" x="275" y="231" width="5" height="19" xoffset="0" yoffset="1" xadvance="5" page="0" chnl="15" />
+ <char id="1650" x="269" y="231" width="5" height="19" xoffset="0" yoffset="1" xadvance="5" page="0" chnl="15" />
+ <char id="1651" x="59" y="195" width="5" height="20" xoffset="0" yoffset="5" xadvance="5" page="0" chnl="15" />
+ <char id="1652" x="260" y="490" width="3" height="4" xoffset="1" yoffset="1" xadvance="5" page="0" chnl="15" />
+ <char id="1653" x="315" y="402" width="6" height="16" xoffset="1" yoffset="4" xadvance="5" page="0" chnl="15" />
+ <char id="1654" x="13" y="236" width="12" height="19" xoffset="0" yoffset="5" xadvance="11" page="0" chnl="15" />
+ <char id="1655" x="26" y="236" width="12" height="19" xoffset="0" yoffset="5" xadvance="11" page="0" chnl="15" />
+ <char id="1656" x="333" y="210" width="14" height="19" xoffset="2" yoffset="5" xadvance="15" page="0" chnl="15" />
+ <char id="1657" x="267" y="385" width="15" height="17" xoffset="0" yoffset="2" xadvance="15" page="0" chnl="15" />
+ <char id="1658" x="447" y="399" width="15" height="15" xoffset="0" yoffset="4" xadvance="15" page="0" chnl="15" />
+ <char id="1659" x="95" y="408" width="15" height="16" xoffset="0" yoffset="10" xadvance="15" page="0" chnl="15" />
+ <char id="1660" x="399" y="400" width="15" height="15" xoffset="0" yoffset="7" xadvance="15" page="0" chnl="15" />
+ <char id="1661" x="415" y="400" width="15" height="15" xoffset="0" yoffset="4" xadvance="15" page="0" chnl="15" />
+ <char id="1662" x="111" y="408" width="15" height="16" xoffset="0" yoffset="10" xadvance="15" page="0" chnl="15" />
+ <char id="1663" x="431" y="400" width="15" height="15" xoffset="0" yoffset="4" xadvance="15" page="0" chnl="15" />
+ <char id="1664" x="283" y="385" width="15" height="17" xoffset="0" yoffset="10" xadvance="15" page="0" chnl="15" />
+ <char id="1665" x="355" y="0" width="13" height="24" xoffset="1" yoffset="4" xadvance="14" page="0" chnl="15" />
+ <char id="1666" x="150" y="0" width="13" height="26" xoffset="1" yoffset="2" xadvance="14" page="0" chnl="15" />
+ <char id="1667" x="280" y="328" width="13" height="18" xoffset="1" yoffset="10" xadvance="14" page="0" chnl="15" />
+ <char id="1668" x="266" y="328" width="13" height="18" xoffset="1" yoffset="10" xadvance="14" page="0" chnl="15" />
+ <char id="1669" x="14" y="0" width="13" height="27" xoffset="1" yoffset="1" xadvance="14" page="0" chnl="15" />
+ <char id="1670" x="238" y="328" width="13" height="18" xoffset="1" yoffset="10" xadvance="14" page="0" chnl="15" />
+ <char id="1671" x="224" y="330" width="13" height="18" xoffset="1" yoffset="10" xadvance="14" page="0" chnl="15" />
+ <char id="1672" x="43" y="389" width="7" height="18" xoffset="1" yoffset="1" xadvance="8" page="0" chnl="15" />
+ <char id="1673" x="55" y="471" width="7" height="14" xoffset="1" yoffset="8" xadvance="8" page="0" chnl="15" />
+ <char id="1674" x="299" y="403" width="7" height="16" xoffset="1" yoffset="8" xadvance="8" page="0" chnl="15" />
+ <char id="1675" x="504" y="120" width="7" height="23" xoffset="1" yoffset="1" xadvance="8" page="0" chnl="15" />
+ <char id="1676" x="9" y="408" width="7" height="17" xoffset="1" yoffset="2" xadvance="8" page="0" chnl="15" />
+ <char id="1677" x="307" y="403" width="7" height="16" xoffset="1" yoffset="8" xadvance="8" page="0" chnl="15" />
+ <char id="1678" x="27" y="389" width="7" height="18" xoffset="1" yoffset="1" xadvance="8" page="0" chnl="15" />
+ <char id="1679" x="484" y="362" width="8" height="18" xoffset="0" yoffset="1" xadvance="8" page="0" chnl="15" />
+ <char id="1680" x="493" y="362" width="8" height="18" xoffset="0" yoffset="1" xadvance="8" page="0" chnl="15" />
+ <char id="1681" x="144" y="171" width="11" height="22" xoffset="0" yoffset="2" xadvance="10" page="0" chnl="15" />
+ <char id="1682" x="478" y="381" width="11" height="17" xoffset="0" yoffset="7" xadvance="10" page="0" chnl="15" />
+ <char id="1683" x="305" y="450" width="11" height="14" xoffset="0" yoffset="11" xadvance="10" page="0" chnl="15" />
+ <char id="1684" x="210" y="405" width="12" height="16" xoffset="0" yoffset="11" xadvance="10" page="0" chnl="15" />
+ <char id="1685" x="223" y="405" width="12" height="16" xoffset="0" yoffset="11" xadvance="10" page="0" chnl="15" />
+ <char id="1686" x="236" y="405" width="12" height="16" xoffset="0" yoffset="11" xadvance="10" page="0" chnl="15" />
+ <char id="1687" x="154" y="368" width="11" height="18" xoffset="0" yoffset="6" xadvance="10" page="0" chnl="15" />
+ <char id="1688" x="499" y="167" width="11" height="20" xoffset="0" yoffset="4" xadvance="10" page="0" chnl="15" />
+ <char id="1689" x="296" y="168" width="11" height="21" xoffset="0" yoffset="3" xadvance="10" page="0" chnl="15" />
+ <char id="1690" x="150" y="387" width="21" height="17" xoffset="1" yoffset="7" xadvance="21" page="0" chnl="15" />
+ <char id="1691" x="322" y="402" width="21" height="15" xoffset="1" yoffset="11" xadvance="21" page="0" chnl="15" />
+ <char id="1692" x="209" y="170" width="21" height="21" xoffset="1" yoffset="5" xadvance="21" page="0" chnl="15" />
+ <char id="1693" x="83" y="425" width="25" height="14" xoffset="1" yoffset="10" xadvance="25" page="0" chnl="15" />
+ <char id="1694" x="183" y="170" width="25" height="21" xoffset="1" yoffset="3" xadvance="25" page="0" chnl="15" />
+ <char id="1695" x="315" y="384" width="14" height="17" xoffset="-1" yoffset="2" xadvance="12" page="0" chnl="15" />
+ <char id="1696" x="0" y="0" width="13" height="27" xoffset="0" yoffset="1" xadvance="13" page="0" chnl="15" />
+ <char id="1697" x="435" y="461" width="18" height="11" xoffset="0" yoffset="9" xadvance="18" page="0" chnl="15" />
+ <char id="1698" x="364" y="401" width="18" height="15" xoffset="0" yoffset="9" xadvance="18" page="0" chnl="15" />
+ <char id="1699" x="381" y="168" width="18" height="20" xoffset="0" yoffset="4" xadvance="18" page="0" chnl="15" />
+ <char id="1700" x="315" y="190" width="18" height="19" xoffset="0" yoffset="1" xadvance="18" page="0" chnl="15" />
+ <char id="1701" x="172" y="387" width="18" height="17" xoffset="0" yoffset="9" xadvance="18" page="0" chnl="15" />
+ <char id="1702" x="78" y="275" width="18" height="18" xoffset="0" yoffset="2" xadvance="18" page="0" chnl="15" />
+ <char id="1703" x="416" y="168" width="14" height="20" xoffset="0" yoffset="6" xadvance="14" page="0" chnl="15" />
+ <char id="1704" x="408" y="145" width="14" height="22" xoffset="0" yoffset="4" xadvance="14" page="0" chnl="15" />
+ <char id="1705" x="303" y="420" width="18" height="14" xoffset="0" yoffset="5" xadvance="18" page="0" chnl="15" />
+ <char id="1706" x="146" y="470" width="18" height="13" xoffset="0" yoffset="6" xadvance="18" page="0" chnl="15" />
+ <char id="1707" x="341" y="418" width="18" height="14" xoffset="0" yoffset="5" xadvance="18" page="0" chnl="15" />
+ <char id="1708" x="448" y="305" width="13" height="18" xoffset="0" yoffset="1" xadvance="13" page="0" chnl="15" />
+ <char id="1709" x="386" y="382" width="13" height="17" xoffset="0" yoffset="2" xadvance="13" page="0" chnl="15" />
+ <char id="1710" x="453" y="145" width="13" height="22" xoffset="0" yoffset="4" xadvance="13" page="0" chnl="15" />
+ <char id="1711" x="191" y="387" width="18" height="17" xoffset="0" yoffset="2" xadvance="18" page="0" chnl="15" />
+ <char id="1712" x="210" y="387" width="18" height="17" xoffset="0" yoffset="2" xadvance="18" page="0" chnl="15" />
+ <char id="1713" x="135" y="273" width="18" height="18" xoffset="0" yoffset="1" xadvance="18" page="0" chnl="15" />
+ <char id="1714" x="219" y="147" width="18" height="22" xoffset="0" yoffset="2" xadvance="18" page="0" chnl="15" />
+ <char id="1715" x="268" y="0" width="18" height="24" xoffset="0" yoffset="2" xadvance="18" page="0" chnl="15" />
+ <char id="1716" x="493" y="228" width="18" height="18" xoffset="0" yoffset="1" xadvance="18" page="0" chnl="15" />
+ <char id="1717" x="423" y="121" width="11" height="23" xoffset="0" yoffset="1" xadvance="11" page="0" chnl="15" />
+ <char id="1718" x="435" y="121" width="11" height="23" xoffset="0" yoffset="1" xadvance="11" page="0" chnl="15" />
+ <char id="1719" x="459" y="120" width="11" height="23" xoffset="0" yoffset="1" xadvance="11" page="0" chnl="15" />
+ <char id="1720" x="447" y="121" width="11" height="23" xoffset="0" yoffset="4" xadvance="11" page="0" chnl="15" />
+ <char id="1721" x="431" y="168" width="13" height="20" xoffset="0" yoffset="8" xadvance="13" page="0" chnl="15" />
+ <char id="1722" x="179" y="467" width="13" height="13" xoffset="0" yoffset="11" xadvance="13" page="0" chnl="15" />
+ <char id="1723" x="268" y="169" width="13" height="21" xoffset="0" yoffset="3" xadvance="13" page="0" chnl="15" />
+ <char id="1724" x="420" y="209" width="13" height="19" xoffset="0" yoffset="8" xadvance="13" page="0" chnl="15" />
+ <char id="1725" x="445" y="168" width="13" height="20" xoffset="0" yoffset="4" xadvance="13" page="0" chnl="15" />
+ <char id="1726" x="282" y="467" width="11" height="13" xoffset="-1" yoffset="7" xadvance="11" page="0" chnl="15" />
+ <char id="1727" x="369" y="0" width="13" height="24" xoffset="1" yoffset="4" xadvance="14" page="0" chnl="15" />
+ <char id="1728" x="76" y="425" width="6" height="15" xoffset="1" yoffset="5" xadvance="8" page="0" chnl="15" />
+ <char id="1729" x="213" y="481" width="9" height="8" xoffset="0" yoffset="13" xadvance="9" page="0" chnl="15" />
+ <char id="1730" x="306" y="465" width="9" height="13" xoffset="0" yoffset="8" xadvance="9" page="0" chnl="15" />
+ <char id="1731" x="481" y="445" width="9" height="14" xoffset="0" yoffset="7" xadvance="9" page="0" chnl="15" />
+ <char id="1732" x="270" y="467" width="11" height="13" xoffset="0" yoffset="11" xadvance="11" page="0" chnl="15" />
+ <char id="1733" x="258" y="467" width="11" height="13" xoffset="0" yoffset="11" xadvance="11" page="0" chnl="15" />
+ <char id="1734" x="250" y="366" width="11" height="18" xoffset="0" yoffset="6" xadvance="11" page="0" chnl="15" />
+ <char id="1735" x="0" y="195" width="11" height="20" xoffset="0" yoffset="4" xadvance="11" page="0" chnl="15" />
+ <char id="1736" x="320" y="168" width="11" height="21" xoffset="0" yoffset="3" xadvance="11" page="0" chnl="15" />
+ <char id="1737" x="190" y="368" width="11" height="18" xoffset="0" yoffset="6" xadvance="11" page="0" chnl="15" />
+ <char id="1738" x="286" y="366" width="11" height="18" xoffset="0" yoffset="6" xadvance="11" page="0" chnl="15" />
+ <char id="1739" x="308" y="168" width="11" height="21" xoffset="0" yoffset="3" xadvance="11" page="0" chnl="15" />
+ <char id="1740" x="220" y="467" width="12" height="13" xoffset="2" yoffset="11" xadvance="15" page="0" chnl="15" />
+ <char id="1741" x="165" y="470" width="13" height="13" xoffset="1" yoffset="11" xadvance="15" page="0" chnl="15" />
+ <char id="1742" x="27" y="425" width="12" height="15" xoffset="2" yoffset="9" xadvance="15" page="0" chnl="15" />
+ <char id="1743" x="233" y="232" width="11" height="19" xoffset="0" yoffset="5" xadvance="11" page="0" chnl="15" />
+ <char id="1744" x="249" y="405" width="12" height="16" xoffset="2" yoffset="11" xadvance="15" page="0" chnl="15" />
+ <char id="1745" x="197" y="405" width="12" height="16" xoffset="2" yoffset="11" xadvance="15" page="0" chnl="15" />
+ <char id="1746" x="316" y="465" width="19" height="12" xoffset="0" yoffset="11" xadvance="19" page="0" chnl="15" />
+ <char id="1747" x="344" y="401" width="19" height="15" xoffset="0" yoffset="8" xadvance="19" page="0" chnl="15" />
+ <char id="1748" x="389" y="482" width="4" height="3" xoffset="0" yoffset="16" xadvance="5" page="0" chnl="15" />
+ <char id="1749" x="10" y="487" width="6" height="10" xoffset="1" yoffset="10" xadvance="8" page="0" chnl="15" />
+ <char id="1750" x="81" y="486" width="12" height="9" xoffset="-6" yoffset="1" xadvance="0" page="0" chnl="15" />
+ <char id="1751" x="94" y="486" width="9" height="9" xoffset="-5" yoffset="1" xadvance="0" page="0" chnl="15" />
+ <char id="1752" x="215" y="490" width="5" height="4" xoffset="-2" yoffset="6" xadvance="0" page="0" chnl="15" />
+ <char id="1753" x="256" y="481" width="5" height="8" xoffset="-2" yoffset="2" xadvance="0" page="0" chnl="15" />
+ <char id="1754" x="156" y="484" width="6" height="9" xoffset="-3" yoffset="1" xadvance="0" page="0" chnl="15" />
+ <char id="1755" x="404" y="482" width="3" height="3" xoffset="-1" yoffset="7" xadvance="0" page="0" chnl="15" />
+ <char id="1756" x="360" y="476" width="10" height="6" xoffset="-5" yoffset="4" xadvance="0" page="0" chnl="15" />
+ <char id="1757" x="55" y="0" width="26" height="26" xoffset="0" yoffset="1" xadvance="27" page="0" chnl="15" />
+ <char id="1758" x="28" y="0" width="26" height="26" xoffset="0" yoffset="1" xadvance="26" page="0" chnl="15" />
+ <char id="1759" x="440" y="479" width="2" height="2" xoffset="-1" yoffset="8" xadvance="0" page="0" chnl="15" />
+ <char id="1760" x="437" y="480" width="2" height="2" xoffset="-1" yoffset="8" xadvance="0" page="0" chnl="15" />
+ <char id="1761" x="158" y="494" width="7" height="4" xoffset="-3" yoffset="6" xadvance="0" page="0" chnl="15" />
+ <char id="1762" x="272" y="481" width="4" height="8" xoffset="-2" yoffset="2" xadvance="0" page="0" chnl="15" />
+ <char id="1763" x="322" y="478" width="10" height="7" xoffset="-5" yoffset="21" xadvance="0" page="0" chnl="15" />
+ <char id="1764" x="190" y="212" width="3" height="1" xoffset="-1" yoffset="9" xadvance="0" page="0" chnl="15" />
+ <char id="1765" x="333" y="478" width="5" height="7" xoffset="0" yoffset="3" xadvance="5" page="0" chnl="15" />
+ <char id="1766" x="402" y="475" width="9" height="6" xoffset="0" yoffset="4" xadvance="9" page="0" chnl="15" />
+ <char id="1767" x="382" y="475" width="9" height="6" xoffset="-4" yoffset="4" xadvance="0" page="0" chnl="15" />
+ <char id="1768" x="249" y="481" width="6" height="8" xoffset="-3" yoffset="2" xadvance="0" page="0" chnl="15" />
+ <char id="1769" x="282" y="169" width="13" height="21" xoffset="1" yoffset="2" xadvance="14" page="0" chnl="15" />
+ <char id="1770" x="12" y="498" width="4" height="5" xoffset="-2" yoffset="22" xadvance="0" page="0" chnl="15" />
+ <char id="1771" x="231" y="490" width="4" height="4" xoffset="-2" yoffset="6" xadvance="0" page="0" chnl="15" />
+ <char id="1772" x="434" y="481" width="2" height="2" xoffset="-1" yoffset="8" xadvance="0" page="0" chnl="15" />
+ <char id="1773" x="282" y="481" width="4" height="8" xoffset="-2" yoffset="20" xadvance="0" page="0" chnl="15" />
+ <char id="1776" x="339" y="476" width="4" height="7" xoffset="4" yoffset="11" xadvance="13" page="0" chnl="15" />
+ <char id="1777" x="87" y="471" width="5" height="14" xoffset="4" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="1778" x="47" y="471" width="7" height="14" xoffset="3" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="1779" x="363" y="447" width="10" height="14" xoffset="2" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="1780" x="501" y="445" width="9" height="14" xoffset="2" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="1781" x="491" y="445" width="9" height="14" xoffset="2" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="1782" x="471" y="445" width="9" height="14" xoffset="2" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="1783" x="461" y="445" width="9" height="14" xoffset="2" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="1784" x="440" y="446" width="10" height="14" xoffset="2" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="1785" x="20" y="472" width="8" height="14" xoffset="3" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="1786" x="234" y="192" width="21" height="19" xoffset="1" yoffset="5" xadvance="21" page="0" chnl="15" />
+ <char id="1787" x="69" y="195" width="25" height="19" xoffset="1" yoffset="5" xadvance="25" page="0" chnl="15" />
+ <char id="1788" x="178" y="0" width="13" height="26" xoffset="0" yoffset="2" xadvance="13" page="0" chnl="15" />
+ <char id="1789" x="500" y="381" width="9" height="17" xoffset="1" yoffset="10" xadvance="11" page="0" chnl="15" />
+ <char id="1790" x="273" y="403" width="8" height="16" xoffset="0" yoffset="12" xadvance="8" page="0" chnl="15" />
+ <char id="7808" x="468" y="0" width="23" height="23" xoffset="0" yoffset="0" xadvance="22" page="0" chnl="15" />
+ <char id="7809" x="174" y="254" width="20" height="18" xoffset="0" yoffset="5" xadvance="19" page="0" chnl="15" />
+ <char id="7810" x="24" y="28" width="23" height="23" xoffset="0" yoffset="0" xadvance="22" page="0" chnl="15" />
+ <char id="7811" x="195" y="254" width="20" height="18" xoffset="0" yoffset="5" xadvance="19" page="0" chnl="15" />
+ <char id="7812" x="444" y="0" width="23" height="23" xoffset="0" yoffset="0" xadvance="22" page="0" chnl="15" />
+ <char id="7813" x="216" y="252" width="20" height="18" xoffset="0" yoffset="5" xadvance="19" page="0" chnl="15" />
+ <char id="7840" x="330" y="25" width="17" height="23" xoffset="0" yoffset="5" xadvance="16" page="0" chnl="15" />
+ <char id="7841" x="39" y="236" width="12" height="19" xoffset="1" yoffset="9" xadvance="13" page="0" chnl="15" />
+ <char id="7842" x="348" y="25" width="17" height="23" xoffset="0" yoffset="0" xadvance="16" page="0" chnl="15" />
+ <char id="7843" x="78" y="236" width="12" height="19" xoffset="1" yoffset="4" xadvance="13" page="0" chnl="15" />
+ <char id="7844" x="144" y="51" width="17" height="23" xoffset="0" yoffset="0" xadvance="16" page="0" chnl="15" />
+ <char id="7845" x="176" y="123" width="12" height="23" xoffset="1" yoffset="0" xadvance="13" page="0" chnl="15" />
+ <char id="7846" x="36" y="52" width="17" height="23" xoffset="0" yoffset="0" xadvance="16" page="0" chnl="15" />
+ <char id="7847" x="150" y="123" width="12" height="23" xoffset="1" yoffset="0" xadvance="13" page="0" chnl="15" />
+ <char id="7848" x="420" y="24" width="17" height="23" xoffset="0" yoffset="0" xadvance="16" page="0" chnl="15" />
+ <char id="7849" x="137" y="123" width="12" height="23" xoffset="1" yoffset="0" xadvance="13" page="0" chnl="15" />
+ <char id="7850" x="432" y="48" width="17" height="23" xoffset="0" yoffset="0" xadvance="16" page="0" chnl="15" />
+ <char id="7851" x="40" y="172" width="12" height="22" xoffset="1" yoffset="1" xadvance="13" page="0" chnl="15" />
+ <char id="7852" x="82" y="0" width="17" height="26" xoffset="0" yoffset="2" xadvance="16" page="0" chnl="15" />
+ <char id="7853" x="124" y="123" width="12" height="23" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="7854" x="198" y="51" width="17" height="23" xoffset="0" yoffset="0" xadvance="16" page="0" chnl="15" />
+ <char id="7855" x="111" y="123" width="12" height="23" xoffset="1" yoffset="0" xadvance="13" page="0" chnl="15" />
+ <char id="7856" x="384" y="25" width="17" height="23" xoffset="0" yoffset="0" xadvance="16" page="0" chnl="15" />
+ <char id="7857" x="98" y="123" width="12" height="23" xoffset="1" yoffset="0" xadvance="13" page="0" chnl="15" />
+ <char id="7858" x="456" y="24" width="17" height="23" xoffset="0" yoffset="0" xadvance="16" page="0" chnl="15" />
+ <char id="7859" x="410" y="121" width="12" height="23" xoffset="1" yoffset="0" xadvance="13" page="0" chnl="15" />
+ <char id="7860" x="438" y="24" width="17" height="23" xoffset="0" yoffset="0" xadvance="16" page="0" chnl="15" />
+ <char id="7861" x="53" y="172" width="12" height="22" xoffset="1" yoffset="1" xadvance="13" page="0" chnl="15" />
+ <char id="7862" x="118" y="0" width="17" height="26" xoffset="0" yoffset="2" xadvance="16" page="0" chnl="15" />
+ <char id="7863" x="397" y="121" width="12" height="23" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="7864" x="395" y="97" width="13" height="23" xoffset="2" yoffset="5" xadvance="16" page="0" chnl="15" />
+ <char id="7865" x="117" y="234" width="12" height="19" xoffset="1" yoffset="9" xadvance="13" page="0" chnl="15" />
+ <char id="7866" x="255" y="98" width="13" height="23" xoffset="2" yoffset="0" xadvance="16" page="0" chnl="15" />
+ <char id="7867" x="130" y="234" width="12" height="19" xoffset="1" yoffset="4" xadvance="13" page="0" chnl="15" />
+ <char id="7868" x="269" y="97" width="13" height="23" xoffset="2" yoffset="0" xadvance="16" page="0" chnl="15" />
+ <char id="7869" x="377" y="344" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="7870" x="381" y="97" width="13" height="23" xoffset="2" yoffset="0" xadvance="16" page="0" chnl="15" />
+ <char id="7871" x="241" y="122" width="12" height="23" xoffset="1" yoffset="0" xadvance="13" page="0" chnl="15" />
+ <char id="7872" x="437" y="97" width="13" height="23" xoffset="2" yoffset="0" xadvance="16" page="0" chnl="15" />
+ <char id="7873" x="371" y="121" width="12" height="23" xoffset="1" yoffset="0" xadvance="13" page="0" chnl="15" />
+ <char id="7874" x="451" y="96" width="13" height="23" xoffset="2" yoffset="0" xadvance="16" page="0" chnl="15" />
+ <char id="7875" x="358" y="121" width="12" height="23" xoffset="1" yoffset="0" xadvance="13" page="0" chnl="15" />
+ <char id="7876" x="465" y="96" width="13" height="23" xoffset="2" yoffset="0" xadvance="16" page="0" chnl="15" />
+ <char id="7877" x="66" y="172" width="12" height="22" xoffset="1" yoffset="1" xadvance="13" page="0" chnl="15" />
+ <char id="7878" x="136" y="0" width="13" height="26" xoffset="2" yoffset="2" xadvance="16" page="0" chnl="15" />
+ <char id="7879" x="345" y="121" width="12" height="23" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="7880" x="95" y="147" width="6" height="23" xoffset="0" yoffset="0" xadvance="6" page="0" chnl="15" />
+ <char id="7881" x="501" y="208" width="6" height="19" xoffset="0" yoffset="4" xadvance="6" page="0" chnl="15" />
+ <char id="7882" x="507" y="96" width="4" height="23" xoffset="1" yoffset="5" xadvance="6" page="0" chnl="15" />
+ <char id="7883" x="155" y="147" width="4" height="23" xoffset="1" yoffset="5" xadvance="6" page="0" chnl="15" />
+ <char id="7884" x="305" y="0" width="17" height="24" xoffset="1" yoffset="4" xadvance="18" page="0" chnl="15" />
+ <char id="7885" x="448" y="209" width="13" height="19" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="7886" x="180" y="51" width="17" height="23" xoffset="1" yoffset="0" xadvance="18" page="0" chnl="15" />
+ <char id="7887" x="378" y="210" width="13" height="19" xoffset="1" yoffset="4" xadvance="14" page="0" chnl="15" />
+ <char id="7888" x="162" y="51" width="17" height="23" xoffset="1" yoffset="0" xadvance="18" page="0" chnl="15" />
+ <char id="7889" x="325" y="97" width="13" height="23" xoffset="1" yoffset="0" xadvance="14" page="0" chnl="15" />
+ <char id="7890" x="366" y="25" width="17" height="23" xoffset="1" yoffset="0" xadvance="18" page="0" chnl="15" />
+ <char id="7891" x="28" y="124" width="13" height="23" xoffset="1" yoffset="0" xadvance="14" page="0" chnl="15" />
+ <char id="7892" x="108" y="51" width="17" height="23" xoffset="1" yoffset="0" xadvance="18" page="0" chnl="15" />
+ <char id="7893" x="42" y="124" width="13" height="23" xoffset="1" yoffset="0" xadvance="14" page="0" chnl="15" />
+ <char id="7894" x="90" y="51" width="17" height="23" xoffset="1" yoffset="0" xadvance="18" page="0" chnl="15" />
+ <char id="7895" x="0" y="172" width="13" height="22" xoffset="1" yoffset="1" xadvance="14" page="0" chnl="15" />
+ <char id="7896" x="100" y="0" width="17" height="26" xoffset="1" yoffset="2" xadvance="18" page="0" chnl="15" />
+ <char id="7897" x="409" y="97" width="13" height="23" xoffset="1" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="7898" x="116" y="27" width="20" height="23" xoffset="1" yoffset="0" xadvance="20" page="0" chnl="15" />
+ <char id="7899" x="136" y="292" width="16" height="18" xoffset="1" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="7900" x="137" y="27" width="20" height="23" xoffset="1" yoffset="0" xadvance="20" page="0" chnl="15" />
+ <char id="7901" x="102" y="294" width="16" height="18" xoffset="1" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="7902" x="95" y="27" width="20" height="23" xoffset="1" yoffset="0" xadvance="20" page="0" chnl="15" />
+ <char id="7903" x="442" y="189" width="16" height="19" xoffset="1" yoffset="4" xadvance="17" page="0" chnl="15" />
+ <char id="7904" x="158" y="27" width="20" height="23" xoffset="1" yoffset="0" xadvance="20" page="0" chnl="15" />
+ <char id="7905" x="0" y="294" width="16" height="18" xoffset="1" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="7906" x="228" y="0" width="20" height="24" xoffset="1" yoffset="4" xadvance="20" page="0" chnl="15" />
+ <char id="7907" x="102" y="214" width="16" height="19" xoffset="1" yoffset="9" xadvance="17" page="0" chnl="15" />
+ <char id="7908" x="60" y="100" width="14" height="23" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="7909" x="143" y="234" width="12" height="19" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="7910" x="90" y="99" width="14" height="23" xoffset="2" yoffset="0" xadvance="17" page="0" chnl="15" />
+ <char id="7911" x="156" y="234" width="12" height="19" xoffset="1" yoffset="4" xadvance="14" page="0" chnl="15" />
+ <char id="7912" x="218" y="26" width="18" height="23" xoffset="2" yoffset="0" xadvance="20" page="0" chnl="15" />
+ <char id="7913" x="85" y="294" width="16" height="18" xoffset="1" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="7914" x="199" y="26" width="18" height="23" xoffset="2" yoffset="0" xadvance="20" page="0" chnl="15" />
+ <char id="7915" x="68" y="294" width="16" height="18" xoffset="1" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="7916" x="237" y="25" width="18" height="23" xoffset="2" yoffset="0" xadvance="20" page="0" chnl="15" />
+ <char id="7917" x="34" y="216" width="16" height="19" xoffset="1" yoffset="4" xadvance="17" page="0" chnl="15" />
+ <char id="7918" x="275" y="25" width="18" height="23" xoffset="2" yoffset="0" xadvance="20" page="0" chnl="15" />
+ <char id="7919" x="51" y="294" width="16" height="18" xoffset="1" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="7920" x="256" y="25" width="18" height="23" xoffset="2" yoffset="5" xadvance="20" page="0" chnl="15" />
+ <char id="7921" x="68" y="216" width="16" height="19" xoffset="1" yoffset="9" xadvance="17" page="0" chnl="15" />
+ <char id="7922" x="18" y="52" width="17" height="23" xoffset="0" yoffset="0" xadvance="16" page="0" chnl="15" />
+ <char id="7923" x="180" y="99" width="14" height="23" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="7924" x="216" y="50" width="17" height="23" xoffset="0" yoffset="5" xadvance="16" page="0" chnl="15" />
+ <char id="7925" x="318" y="210" width="14" height="19" xoffset="0" yoffset="9" xadvance="13" page="0" chnl="15" />
+ <char id="7926" x="234" y="50" width="17" height="23" xoffset="0" yoffset="0" xadvance="16" page="0" chnl="15" />
+ <char id="7927" x="340" y="0" width="14" height="24" xoffset="0" yoffset="4" xadvance="13" page="0" chnl="15" />
+ <char id="7928" x="126" y="51" width="17" height="23" xoffset="0" yoffset="0" xadvance="16" page="0" chnl="15" />
+ <char id="7929" x="488" y="72" width="14" height="23" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="8204" x="510" y="24" width="1" height="19" xoffset="0" yoffset="7" xadvance="0" page="0" chnl="15" />
+ <char id="8205" x="346" y="168" width="6" height="21" xoffset="-2" yoffset="5" xadvance="0" page="0" chnl="15" />
+ <char id="8206" x="24" y="195" width="6" height="20" xoffset="0" yoffset="6" xadvance="0" page="0" chnl="15" />
+ <char id="8207" x="31" y="195" width="6" height="20" xoffset="-5" yoffset="6" xadvance="0" page="0" chnl="15" />
+ <char id="8211" x="89" y="496" width="14" height="4" xoffset="0" yoffset="14" xadvance="13" page="0" chnl="15" />
+ <char id="8212" x="20" y="498" width="24" height="4" xoffset="0" yoffset="14" xadvance="24" page="0" chnl="15" />
+ <char id="8213" x="45" y="497" width="22" height="4" xoffset="1" yoffset="14" xadvance="24" page="0" chnl="15" />
+ <char id="8215" x="307" y="479" width="14" height="7" xoffset="0" yoffset="21" xadvance="13" page="0" chnl="15" />
+ <char id="8216" x="302" y="481" width="4" height="8" xoffset="1" yoffset="5" xadvance="6" page="0" chnl="15" />
+ <char id="8217" x="262" y="481" width="4" height="8" xoffset="1" yoffset="5" xadvance="6" page="0" chnl="15" />
+ <char id="8218" x="267" y="481" width="4" height="8" xoffset="1" yoffset="19" xadvance="6" page="0" chnl="15" />
+ <char id="8219" x="277" y="481" width="4" height="8" xoffset="1" yoffset="5" xadvance="6" page="0" chnl="15" />
+ <char id="8220" x="169" y="484" width="10" height="8" xoffset="1" yoffset="5" xadvance="12" page="0" chnl="15" />
+ <char id="8221" x="191" y="481" width="10" height="8" xoffset="1" yoffset="5" xadvance="12" page="0" chnl="15" />
+ <char id="8222" x="180" y="481" width="10" height="8" xoffset="1" yoffset="19" xadvance="12" page="0" chnl="15" />
+ <char id="8224" x="14" y="172" width="12" height="22" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="8225" x="481" y="144" width="13" height="22" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="8226" x="241" y="481" width="7" height="8" xoffset="1" yoffset="10" xadvance="8" page="0" chnl="15" />
+ <char id="8230" x="68" y="496" width="20" height="4" xoffset="2" yoffset="19" xadvance="24" page="0" chnl="15" />
+ <char id="8234" x="81" y="389" width="6" height="18" xoffset="0" yoffset="8" xadvance="0" page="0" chnl="15" />
+ <char id="8235" x="74" y="389" width="6" height="18" xoffset="-5" yoffset="8" xadvance="0" page="0" chnl="15" />
+ <char id="8236" x="38" y="195" width="6" height="20" xoffset="-3" yoffset="6" xadvance="0" page="0" chnl="15" />
+ <char id="8237" x="339" y="168" width="6" height="21" xoffset="-3" yoffset="5" xadvance="0" page="0" chnl="15" />
+ <char id="8238" x="332" y="168" width="6" height="21" xoffset="-3" yoffset="5" xadvance="0" page="0" chnl="15" />
+ <char id="8240" x="345" y="230" width="25" height="18" xoffset="0" yoffset="5" xadvance="24" page="0" chnl="15" />
+ <char id="8242" x="425" y="474" width="4" height="6" xoffset="2" yoffset="5" xadvance="6" page="0" chnl="15" />
+ <char id="8243" x="371" y="475" width="10" height="6" xoffset="1" yoffset="5" xadvance="11" page="0" chnl="15" />
+ <char id="8249" x="422" y="461" width="7" height="12" xoffset="1" yoffset="10" xadvance="8" page="0" chnl="15" />
+ <char id="8250" x="414" y="461" width="7" height="12" xoffset="1" yoffset="10" xadvance="8" page="0" chnl="15" />
+ <char id="8252" x="358" y="364" width="10" height="18" xoffset="2" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="8254" x="302" y="490" width="9" height="3" xoffset="0" yoffset="6" xadvance="8" page="0" chnl="15" />
+ <char id="8260" x="378" y="306" width="13" height="18" xoffset="-4" yoffset="5" xadvance="4" page="0" chnl="15" />
+ <char id="8298" x="353" y="168" width="6" height="21" xoffset="-3" yoffset="5" xadvance="0" page="0" chnl="15" />
+ <char id="8299" x="367" y="168" width="6" height="21" xoffset="-3" yoffset="5" xadvance="0" page="0" chnl="15" />
+ <char id="8300" x="374" y="168" width="6" height="21" xoffset="-3" yoffset="5" xadvance="0" page="0" chnl="15" />
+ <char id="8301" x="45" y="195" width="6" height="20" xoffset="-3" yoffset="6" xadvance="0" page="0" chnl="15" />
+ <char id="8302" x="52" y="195" width="6" height="20" xoffset="-3" yoffset="6" xadvance="0" page="0" chnl="15" />
+ <char id="8303" x="360" y="168" width="6" height="21" xoffset="-3" yoffset="5" xadvance="0" page="0" chnl="15" />
+ <char id="8319" x="131" y="484" width="8" height="9" xoffset="1" yoffset="8" xadvance="9" page="0" chnl="15" />
+ <char id="8355" x="42" y="332" width="13" height="18" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="8356" x="266" y="309" width="13" height="18" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="8359" x="291" y="231" width="27" height="18" xoffset="0" yoffset="5" xadvance="27" page="0" chnl="15" />
+ <char id="8362" x="416" y="416" width="17" height="14" xoffset="1" yoffset="9" xadvance="19" page="0" chnl="15" />
+ <char id="8363" x="65" y="425" width="10" height="15" xoffset="1" yoffset="5" xadvance="12" page="0" chnl="15" />
+ <char id="8364" x="406" y="209" width="13" height="19" xoffset="0" yoffset="4" xadvance="13" page="0" chnl="15" />
+ <char id="8453" x="23" y="256" width="21" height="18" xoffset="0" yoffset="5" xadvance="21" page="0" chnl="15" />
+ <char id="8467" x="214" y="368" width="11" height="18" xoffset="0" yoffset="5" xadvance="11" page="0" chnl="15" />
+ <char id="8470" x="371" y="230" width="24" height="18" xoffset="2" yoffset="5" xadvance="27" page="0" chnl="15" />
+ <char id="8482" x="475" y="460" width="19" height="10" xoffset="2" yoffset="5" xadvance="24" page="0" chnl="15" />
+ <char id="8486" x="406" y="189" width="17" height="19" xoffset="0" yoffset="4" xadvance="18" page="0" chnl="15" />
+ <char id="8494" x="322" y="433" width="13" height="14" xoffset="1" yoffset="9" xadvance="14" page="0" chnl="15" />
+ <char id="8531" x="400" y="248" width="19" height="18" xoffset="1" yoffset="5" xadvance="20" page="0" chnl="15" />
+ <char id="8532" x="360" y="249" width="19" height="18" xoffset="0" yoffset="5" xadvance="20" page="0" chnl="15" />
+ <char id="8539" x="320" y="249" width="19" height="18" xoffset="1" yoffset="5" xadvance="20" page="0" chnl="15" />
+ <char id="8540" x="300" y="250" width="19" height="18" xoffset="0" yoffset="5" xadvance="20" page="0" chnl="15" />
+ <char id="8541" x="0" y="275" width="19" height="18" xoffset="0" yoffset="5" xadvance="20" page="0" chnl="15" />
+ <char id="8542" x="20" y="275" width="19" height="18" xoffset="0" yoffset="5" xadvance="20" page="0" chnl="15" />
+ <char id="8706" x="202" y="368" width="11" height="18" xoffset="0" yoffset="5" xadvance="12" page="0" chnl="15" />
+ <char id="8710" x="253" y="290" width="15" height="18" xoffset="0" yoffset="5" xadvance="14" page="0" chnl="15" />
+ <char id="8719" x="72" y="51" width="17" height="23" xoffset="1" yoffset="5" xadvance="20" page="0" chnl="15" />
+ <char id="8721" x="203" y="75" width="14" height="23" xoffset="2" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="8722" x="117" y="495" width="12" height="4" xoffset="1" yoffset="12" xadvance="14" page="0" chnl="15" />
+ <char id="8725" x="98" y="332" width="13" height="18" xoffset="-4" yoffset="5" xadvance="4" page="0" chnl="15" />
+ <char id="8729" x="236" y="490" width="4" height="4" xoffset="1" yoffset="12" xadvance="6" page="0" chnl="15" />
+ <char id="8730" x="397" y="0" width="12" height="24" xoffset="1" yoffset="0" xadvance="13" page="0" chnl="15" />
+ <char id="8734" x="40" y="487" width="14" height="9" xoffset="1" yoffset="9" xadvance="17" page="0" chnl="15" />
+ <char id="8735" x="44" y="408" width="16" height="16" xoffset="4" yoffset="7" xadvance="23" page="0" chnl="15" />
+ <char id="8745" x="237" y="290" width="15" height="18" xoffset="1" yoffset="5" xadvance="17" page="0" chnl="15" />
+ <char id="8747" x="220" y="0" width="7" height="25" xoffset="0" yoffset="0" xadvance="6" page="0" chnl="15" />
+ <char id="8776" x="454" y="461" width="12" height="11" xoffset="0" yoffset="9" xadvance="13" page="0" chnl="15" />
+ <char id="8800" x="78" y="351" width="12" height="18" xoffset="0" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="8801" x="130" y="455" width="12" height="14" xoffset="1" yoffset="7" xadvance="14" page="0" chnl="15" />
+ <char id="8804" x="0" y="351" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="8805" x="490" y="324" width="12" height="18" xoffset="1" yoffset="5" xadvance="13" page="0" chnl="15" />
+ <char id="9786" x="61" y="408" width="16" height="16" xoffset="4" yoffset="8" xadvance="24" page="0" chnl="15" />
+ <char id="9787" x="78" y="408" width="16" height="16" xoffset="5" yoffset="8" xadvance="25" page="0" chnl="15" />
+ <char id="9788" x="72" y="27" width="22" height="23" xoffset="0" yoffset="3" xadvance="22" page="0" chnl="15" />
+ <char id="9792" x="383" y="0" width="13" height="24" xoffset="2" yoffset="4" xadvance="18" page="0" chnl="15" />
+ <char id="9794" x="153" y="75" width="16" height="23" xoffset="1" yoffset="3" xadvance="18" page="0" chnl="15" />
+ <char id="9824" x="14" y="426" width="12" height="15" xoffset="0" yoffset="8" xadvance="13" page="0" chnl="15" />
+ <char id="9827" x="383" y="400" width="15" height="15" xoffset="0" yoffset="8" xadvance="16" page="0" chnl="15" />
+ <char id="9829" x="0" y="426" width="13" height="15" xoffset="0" yoffset="8" xadvance="14" page="0" chnl="15" />
+ <char id="9830" x="53" y="425" width="11" height="15" xoffset="0" yoffset="8" xadvance="12" page="0" chnl="15" />
+ <char id="9834" x="400" y="382" width="12" height="17" xoffset="0" yoffset="6" xadvance="12" page="0" chnl="15" />
+ <char id="9835" x="400" y="168" width="15" height="20" xoffset="1" yoffset="4" xadvance="18" page="0" chnl="15" />
+ </chars>
+ <kernings count="397">
+ <kerning first="32" second="65" amount="-1" />
+ <kerning first="32" second="902" amount="-1" />
+ <kerning first="32" second="913" amount="-1" />
+ <kerning first="32" second="916" amount="-1" />
+ <kerning first="32" second="923" amount="-1" />
+ <kerning first="49" second="49" amount="-1" />
+ <kerning first="65" second="32" amount="-1" />
+ <kerning first="65" second="84" amount="-2" />
+ <kerning first="65" second="86" amount="-2" />
+ <kerning first="65" second="87" amount="-1" />
+ <kerning first="65" second="89" amount="-2" />
+ <kerning first="65" second="118" amount="-1" />
+ <kerning first="65" second="121" amount="-1" />
+ <kerning first="65" second="8217" amount="-1" />
+ <kerning first="70" second="44" amount="-2" />
+ <kerning first="70" second="46" amount="-2" />
+ <kerning first="70" second="65" amount="-1" />
+ <kerning first="76" second="84" amount="-2" />
+ <kerning first="76" second="86" amount="-2" />
+ <kerning first="76" second="87" amount="-1" />
+ <kerning first="76" second="89" amount="-2" />
+ <kerning first="76" second="121" amount="-1" />
+ <kerning first="76" second="8217" amount="-1" />
+ <kerning first="80" second="44" amount="-3" />
+ <kerning first="80" second="46" amount="-3" />
+ <kerning first="80" second="65" amount="-2" />
+ <kerning first="82" second="89" amount="-1" />
+ <kerning first="84" second="44" amount="-2" />
+ <kerning first="84" second="45" amount="-1" />
+ <kerning first="84" second="46" amount="-2" />
+ <kerning first="84" second="58" amount="-2" />
+ <kerning first="84" second="894" amount="-2" />
+ <kerning first="84" second="65" amount="-2" />
+ <kerning first="84" second="97" amount="-2" />
+ <kerning first="84" second="99" amount="-2" />
+ <kerning first="84" second="101" amount="-2" />
+ <kerning first="84" second="111" amount="-2" />
+ <kerning first="84" second="114" amount="-1" />
+ <kerning first="84" second="115" amount="-2" />
+ <kerning first="84" second="117" amount="-2" />
+ <kerning first="84" second="119" amount="-2" />
+ <kerning first="84" second="121" amount="-2" />
+ <kerning first="86" second="44" amount="-2" />
+ <kerning first="86" second="45" amount="-1" />
+ <kerning first="86" second="46" amount="-2" />
+ <kerning first="86" second="58" amount="-1" />
+ <kerning first="86" second="894" amount="-1" />
+ <kerning first="86" second="65" amount="-2" />
+ <kerning first="86" second="97" amount="-1" />
+ <kerning first="86" second="101" amount="-1" />
+ <kerning first="86" second="111" amount="-2" />
+ <kerning first="86" second="114" amount="-1" />
+ <kerning first="86" second="117" amount="-1" />
+ <kerning first="86" second="121" amount="-1" />
+ <kerning first="87" second="44" amount="-1" />
+ <kerning first="87" second="46" amount="-1" />
+ <kerning first="87" second="65" amount="-1" />
+ <kerning first="87" second="97" amount="-1" />
+ <kerning first="89" second="44" amount="-2" />
+ <kerning first="89" second="45" amount="-1" />
+ <kerning first="89" second="46" amount="-2" />
+ <kerning first="89" second="58" amount="-2" />
+ <kerning first="89" second="894" amount="-2" />
+ <kerning first="89" second="65" amount="-2" />
+ <kerning first="89" second="97" amount="-1" />
+ <kerning first="89" second="101" amount="-1" />
+ <kerning first="89" second="105" amount="-1" />
+ <kerning first="89" second="111" amount="-2" />
+ <kerning first="89" second="112" amount="-1" />
+ <kerning first="89" second="113" amount="-2" />
+ <kerning first="89" second="117" amount="-1" />
+ <kerning first="89" second="118" amount="-1" />
+ <kerning first="114" second="44" amount="-1" />
+ <kerning first="114" second="46" amount="-1" />
+ <kerning first="114" second="8217" amount="1" />
+ <kerning first="118" second="44" amount="-2" />
+ <kerning first="118" second="46" amount="-2" />
+ <kerning first="119" second="44" amount="-1" />
+ <kerning first="119" second="46" amount="-1" />
+ <kerning first="121" second="44" amount="-2" />
+ <kerning first="121" second="46" amount="-2" />
+ <kerning first="8216" second="8216" amount="-1" />
+ <kerning first="8217" second="32" amount="-1" />
+ <kerning first="8217" second="115" amount="-1" />
+ <kerning first="8217" second="8217" amount="-1" />
+ <kerning first="8222" second="1026" amount="-2" />
+ <kerning first="8222" second="1035" amount="-2" />
+ <kerning first="8222" second="1058" amount="-2" />
+ <kerning first="8222" second="1063" amount="-2" />
+ <kerning first="8222" second="1066" amount="-2" />
+ <kerning first="915" second="44" amount="-2" />
+ <kerning first="915" second="46" amount="-2" />
+ <kerning first="915" second="913" amount="-2" />
+ <kerning first="915" second="916" amount="-2" />
+ <kerning first="915" second="923" amount="-2" />
+ <kerning first="915" second="943" amount="-1" />
+ <kerning first="915" second="953" amount="-1" />
+ <kerning first="915" second="970" amount="1" />
+ <kerning first="948" second="967" amount="-1" />
+ <kerning first="966" second="967" amount="-1" />
+ <kerning first="902" second="932" amount="-2" />
+ <kerning first="902" second="933" amount="-2" />
+ <kerning first="902" second="939" amount="-2" />
+ <kerning first="902" second="947" amount="-1" />
+ <kerning first="902" second="957" amount="-1" />
+ <kerning first="902" second="967" amount="-1" />
+ <kerning first="910" second="920" amount="-1" />
+ <kerning first="910" second="934" amount="-1" />
+ <kerning first="910" second="945" amount="-2" />
+ <kerning first="910" second="948" amount="-1" />
+ <kerning first="910" second="963" amount="-2" />
+ <kerning first="910" second="966" amount="-2" />
+ <kerning first="910" second="912" amount="3" />
+ <kerning first="910" second="913" amount="-2" />
+ <kerning first="910" second="916" amount="-2" />
+ <kerning first="910" second="923" amount="-2" />
+ <kerning first="910" second="927" amount="-1" />
+ <kerning first="910" second="937" amount="-1" />
+ <kerning first="910" second="940" amount="-2" />
+ <kerning first="910" second="942" amount="-1" />
+ <kerning first="910" second="943" amount="-1" />
+ <kerning first="910" second="951" amount="-1" />
+ <kerning first="910" second="953" amount="-1" />
+ <kerning first="910" second="954" amount="-1" />
+ <kerning first="910" second="956" amount="-1" />
+ <kerning first="910" second="959" amount="-2" />
+ <kerning first="910" second="970" amount="1" />
+ <kerning first="910" second="972" amount="-2" />
+ <kerning first="913" second="8217" amount="-1" />
+ <kerning first="913" second="932" amount="-2" />
+ <kerning first="913" second="933" amount="-2" />
+ <kerning first="913" second="939" amount="-2" />
+ <kerning first="913" second="947" amount="-1" />
+ <kerning first="913" second="957" amount="-1" />
+ <kerning first="913" second="967" amount="-1" />
+ <kerning first="916" second="932" amount="-2" />
+ <kerning first="916" second="933" amount="-2" />
+ <kerning first="916" second="939" amount="-2" />
+ <kerning first="922" second="920" amount="-1" />
+ <kerning first="922" second="934" amount="-1" />
+ <kerning first="922" second="927" amount="-1" />
+ <kerning first="923" second="932" amount="-2" />
+ <kerning first="923" second="933" amount="-2" />
+ <kerning first="923" second="939" amount="-2" />
+ <kerning first="929" second="44" amount="-3" />
+ <kerning first="929" second="46" amount="-3" />
+ <kerning first="929" second="913" amount="-2" />
+ <kerning first="929" second="916" amount="-2" />
+ <kerning first="929" second="923" amount="-2" />
+ <kerning first="932" second="44" amount="-2" />
+ <kerning first="932" second="45" amount="-1" />
+ <kerning first="932" second="46" amount="-2" />
+ <kerning first="932" second="58" amount="-2" />
+ <kerning first="932" second="894" amount="-2" />
+ <kerning first="932" second="945" amount="-2" />
+ <kerning first="932" second="948" amount="-1" />
+ <kerning first="932" second="949" amount="-2" />
+ <kerning first="932" second="963" amount="-2" />
+ <kerning first="932" second="966" amount="-2" />
+ <kerning first="932" second="912" amount="3" />
+ <kerning first="932" second="913" amount="-2" />
+ <kerning first="932" second="916" amount="-2" />
+ <kerning first="932" second="923" amount="-2" />
+ <kerning first="932" second="940" amount="-2" />
+ <kerning first="932" second="941" amount="-2" />
+ <kerning first="932" second="947" amount="-2" />
+ <kerning first="932" second="951" amount="-2" />
+ <kerning first="932" second="956" amount="-2" />
+ <kerning first="932" second="957" amount="-2" />
+ <kerning first="932" second="959" amount="-2" />
+ <kerning first="932" second="965" amount="-2" />
+ <kerning first="932" second="967" amount="-1" />
+ <kerning first="932" second="968" amount="-2" />
+ <kerning first="932" second="970" amount="1" />
+ <kerning first="932" second="971" amount="-2" />
+ <kerning first="932" second="972" amount="-2" />
+ <kerning first="932" second="973" amount="-2" />
+ <kerning first="933" second="44" amount="-2" />
+ <kerning first="933" second="45" amount="-1" />
+ <kerning first="933" second="46" amount="-2" />
+ <kerning first="933" second="58" amount="-2" />
+ <kerning first="933" second="894" amount="-2" />
+ <kerning first="933" second="920" amount="-1" />
+ <kerning first="933" second="934" amount="-1" />
+ <kerning first="933" second="945" amount="-2" />
+ <kerning first="933" second="948" amount="-1" />
+ <kerning first="933" second="963" amount="-2" />
+ <kerning first="933" second="966" amount="-2" />
+ <kerning first="933" second="912" amount="3" />
+ <kerning first="933" second="913" amount="-2" />
+ <kerning first="933" second="916" amount="-2" />
+ <kerning first="933" second="923" amount="-2" />
+ <kerning first="933" second="927" amount="-1" />
+ <kerning first="933" second="937" amount="-1" />
+ <kerning first="933" second="940" amount="-2" />
+ <kerning first="933" second="942" amount="-1" />
+ <kerning first="933" second="943" amount="-1" />
+ <kerning first="933" second="947" amount="-1" />
+ <kerning first="933" second="951" amount="-1" />
+ <kerning first="933" second="953" amount="-1" />
+ <kerning first="933" second="954" amount="-1" />
+ <kerning first="933" second="956" amount="-1" />
+ <kerning first="933" second="959" amount="-2" />
+ <kerning first="933" second="970" amount="1" />
+ <kerning first="933" second="972" amount="-2" />
+ <kerning first="939" second="920" amount="-1" />
+ <kerning first="939" second="934" amount="-1" />
+ <kerning first="939" second="945" amount="-2" />
+ <kerning first="939" second="948" amount="-1" />
+ <kerning first="939" second="963" amount="-2" />
+ <kerning first="939" second="966" amount="-2" />
+ <kerning first="939" second="912" amount="3" />
+ <kerning first="939" second="913" amount="-2" />
+ <kerning first="939" second="916" amount="-2" />
+ <kerning first="939" second="923" amount="-2" />
+ <kerning first="939" second="927" amount="-1" />
+ <kerning first="939" second="937" amount="-1" />
+ <kerning first="939" second="940" amount="-2" />
+ <kerning first="939" second="942" amount="-1" />
+ <kerning first="939" second="943" amount="-1" />
+ <kerning first="939" second="951" amount="-1" />
+ <kerning first="939" second="953" amount="-1" />
+ <kerning first="939" second="954" amount="-1" />
+ <kerning first="939" second="956" amount="-1" />
+ <kerning first="939" second="959" amount="-2" />
+ <kerning first="939" second="970" amount="1" />
+ <kerning first="939" second="972" amount="-2" />
+ <kerning first="950" second="945" amount="-1" />
+ <kerning first="950" second="948" amount="-1" />
+ <kerning first="950" second="963" amount="-1" />
+ <kerning first="950" second="964" amount="-1" />
+ <kerning first="950" second="966" amount="-1" />
+ <kerning first="950" second="940" amount="-1" />
+ <kerning first="950" second="947" amount="-1" />
+ <kerning first="950" second="952" amount="-1" />
+ <kerning first="950" second="957" amount="-1" />
+ <kerning first="950" second="959" amount="-1" />
+ <kerning first="950" second="969" amount="-1" />
+ <kerning first="950" second="972" amount="-1" />
+ <kerning first="950" second="974" amount="-1" />
+ <kerning first="950" second="960" amount="-1" />
+ <kerning first="954" second="945" amount="-1" />
+ <kerning first="954" second="948" amount="-1" />
+ <kerning first="954" second="963" amount="-1" />
+ <kerning first="954" second="966" amount="-1" />
+ <kerning first="954" second="940" amount="-1" />
+ <kerning first="954" second="950" amount="-1" />
+ <kerning first="954" second="958" amount="-1" />
+ <kerning first="954" second="959" amount="-1" />
+ <kerning first="954" second="962" amount="-1" />
+ <kerning first="954" second="969" amount="-1" />
+ <kerning first="954" second="972" amount="-1" />
+ <kerning first="954" second="974" amount="-1" />
+ <kerning first="959" second="967" amount="-1" />
+ <kerning first="967" second="945" amount="-1" />
+ <kerning first="967" second="948" amount="-1" />
+ <kerning first="967" second="963" amount="-1" />
+ <kerning first="967" second="966" amount="-1" />
+ <kerning first="967" second="940" amount="-1" />
+ <kerning first="967" second="950" amount="-1" />
+ <kerning first="967" second="959" amount="-1" />
+ <kerning first="967" second="962" amount="-1" />
+ <kerning first="967" second="972" amount="-1" />
+ <kerning first="972" second="967" amount="-1" />
+ <kerning first="1027" second="44" amount="-2" />
+ <kerning first="1027" second="46" amount="-3" />
+ <kerning first="1027" second="171" amount="-1" />
+ <kerning first="1027" second="187" amount="-1" />
+ <kerning first="1033" second="8217" amount="-2" />
+ <kerning first="1034" second="8217" amount="-2" />
+ <kerning first="1040" second="8217" amount="-1" />
+ <kerning first="1040" second="1044" amount="1" />
+ <kerning first="1040" second="1058" amount="-1" />
+ <kerning first="1040" second="1059" amount="-1" />
+ <kerning first="1040" second="1063" amount="-2" />
+ <kerning first="1041" second="1040" amount="-1" />
+ <kerning first="1041" second="1063" amount="-1" />
+ <kerning first="1041" second="1066" amount="-1" />
+ <kerning first="1042" second="1040" amount="-1" />
+ <kerning first="1042" second="1046" amount="-1" />
+ <kerning first="1042" second="1057" amount="-1" />
+ <kerning first="1042" second="1058" amount="-1" />
+ <kerning first="1042" second="1059" amount="-1" />
+ <kerning first="1042" second="1061" amount="-1" />
+ <kerning first="1042" second="1063" amount="-1" />
+ <kerning first="1042" second="1066" amount="-1" />
+ <kerning first="1042" second="1095" amount="-1" />
+ <kerning first="1043" second="44" amount="-2" />
+ <kerning first="1043" second="46" amount="-3" />
+ <kerning first="1043" second="171" amount="-1" />
+ <kerning first="1043" second="187" amount="-1" />
+ <kerning first="1043" second="1040" amount="-1" />
+ <kerning first="1043" second="1076" amount="-1" />
+ <kerning first="1043" second="1077" amount="-1" />
+ <kerning first="1043" second="1083" amount="-1" />
+ <kerning first="1043" second="1084" amount="-1" />
+ <kerning first="1043" second="1086" amount="-1" />
+ <kerning first="1043" second="1088" amount="-1" />
+ <kerning first="1043" second="1091" amount="-1" />
+ <kerning first="1043" second="1099" amount="-1" />
+ <kerning first="1043" second="1100" amount="-1" />
+ <kerning first="1043" second="1102" amount="-1" />
+ <kerning first="1043" second="1103" amount="-1" />
+ <kerning first="1046" second="1066" amount="1" />
+ <kerning first="1047" second="1058" amount="-1" />
+ <kerning first="1047" second="1059" amount="-1" />
+ <kerning first="1047" second="1063" amount="-1" />
+ <kerning first="1050" second="1047" amount="1" />
+ <kerning first="1054" second="1061" amount="-1" />
+ <kerning first="1056" second="44" amount="-3" />
+ <kerning first="1056" second="46" amount="-3" />
+ <kerning first="1056" second="1040" amount="-2" />
+ <kerning first="1056" second="1044" amount="-1" />
+ <kerning first="1056" second="1051" amount="-1" />
+ <kerning first="1056" second="1061" amount="-1" />
+ <kerning first="1056" second="1076" amount="-1" />
+ <kerning first="1057" second="1061" amount="-1" />
+ <kerning first="1058" second="44" amount="-2" />
+ <kerning first="1058" second="46" amount="-2" />
+ <kerning first="1058" second="1040" amount="-1" />
+ <kerning first="1058" second="1060" amount="-1" />
+ <kerning first="1058" second="1074" amount="-1" />
+ <kerning first="1058" second="1077" amount="-1" />
+ <kerning first="1058" second="1080" amount="-1" />
+ <kerning first="1058" second="1082" amount="-1" />
+ <kerning first="1058" second="1083" amount="-1" />
+ <kerning first="1058" second="1084" amount="-1" />
+ <kerning first="1058" second="1086" amount="-1" />
+ <kerning first="1058" second="1088" amount="-1" />
+ <kerning first="1058" second="1089" amount="-1" />
+ <kerning first="1058" second="1091" amount="-1" />
+ <kerning first="1058" second="1093" amount="-1" />
+ <kerning first="1059" second="44" amount="-2" />
+ <kerning first="1059" second="46" amount="-3" />
+ <kerning first="1059" second="171" amount="-1" />
+ <kerning first="1059" second="187" amount="-1" />
+ <kerning first="1059" second="1040" amount="-2" />
+ <kerning first="1059" second="1044" amount="-1" />
+ <kerning first="1059" second="1051" amount="-1" />
+ <kerning first="1059" second="1060" amount="-1" />
+ <kerning first="1059" second="1074" amount="-1" />
+ <kerning first="1059" second="1075" amount="-1" />
+ <kerning first="1059" second="1076" amount="-1" />
+ <kerning first="1059" second="1077" amount="-1" />
+ <kerning first="1059" second="1079" amount="-1" />
+ <kerning first="1059" second="1080" amount="-1" />
+ <kerning first="1059" second="1081" amount="-1" />
+ <kerning first="1059" second="1082" amount="-1" />
+ <kerning first="1059" second="1083" amount="-1" />
+ <kerning first="1059" second="1084" amount="-1" />
+ <kerning first="1059" second="1085" amount="-1" />
+ <kerning first="1059" second="1086" amount="-1" />
+ <kerning first="1059" second="1087" amount="-1" />
+ <kerning first="1059" second="1088" amount="-1" />
+ <kerning first="1059" second="1089" amount="-1" />
+ <kerning first="1059" second="1094" amount="-1" />
+ <kerning first="1059" second="1096" amount="-1" />
+ <kerning first="1059" second="1097" amount="-1" />
+ <kerning first="1059" second="1102" amount="-1" />
+ <kerning first="1059" second="1103" amount="-1" />
+ <kerning first="1060" second="1044" amount="-1" />
+ <kerning first="1060" second="1051" amount="-1" />
+ <kerning first="1060" second="1058" amount="-1" />
+ <kerning first="1060" second="1059" amount="-1" />
+ <kerning first="1061" second="1057" amount="-1" />
+ <kerning first="1061" second="1060" amount="-1" />
+ <kerning first="1062" second="1072" amount="1" />
+ <kerning first="1066" second="8217" amount="-2" />
+ <kerning first="1066" second="1071" amount="-1" />
+ <kerning first="1068" second="8217" amount="-2" />
+ <kerning first="1068" second="1046" amount="-1" />
+ <kerning first="1068" second="1051" amount="-1" />
+ <kerning first="1068" second="1058" amount="-2" />
+ <kerning first="1068" second="1061" amount="-1" />
+ <kerning first="1068" second="1063" amount="-2" />
+ <kerning first="1068" second="1069" amount="-1" />
+ <kerning first="1068" second="1071" amount="-1" />
+ <kerning first="1069" second="1051" amount="-1" />
+ <kerning first="1070" second="1051" amount="-1" />
+ <kerning first="1070" second="1061" amount="-1" />
+ <kerning first="1074" second="1095" amount="-1" />
+ <kerning first="1075" second="44" amount="-2" />
+ <kerning first="1075" second="46" amount="-2" />
+ <kerning first="1075" second="1076" amount="-1" />
+ <kerning first="1079" second="1095" amount="-1" />
+ <kerning first="1090" second="44" amount="-2" />
+ <kerning first="1090" second="46" amount="-2" />
+ <kerning first="1091" second="44" amount="-2" />
+ <kerning first="1091" second="46" amount="-2" />
+ <kerning first="1100" second="1090" amount="-2" />
+ <kerning first="1100" second="1095" amount="-2" />
+ <kerning first="1102" second="1095" amount="-1" />
+ <kerning first="1118" second="44" amount="-2" />
+ <kerning first="1118" second="46" amount="-2" />
+ <kerning first="1168" second="44" amount="-1" />
+ <kerning first="1168" second="46" amount="-2" />
+ <kerning first="960" second="955" amount="-1" />
+ </kernings>
+</font>
diff --git a/ardor3d-core/src/test/java/com/ardor3d/bounding/TestBounding.java b/ardor3d-core/src/test/java/com/ardor3d/bounding/TestBounding.java
index e6f98e2..5a9fbab 100644
--- a/ardor3d-core/src/test/java/com/ardor3d/bounding/TestBounding.java
+++ b/ardor3d-core/src/test/java/com/ardor3d/bounding/TestBounding.java
@@ -1,40 +1,40 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.bounding;
-
-import org.junit.Test;
-
-import com.ardor3d.math.Vector3;
-
-public class TestBounding {
- @Test
- public void testBoundingBoxMerge() throws Exception {
- final BoundingBox obb = new BoundingBox();
- obb.setCenter(Vector3.ZERO);
- obb.setXExtent(1);
- obb.setYExtent(1);
- obb.setZExtent(1);
-
- // final ReadOnlyVector3 center = sceneBounds.getCenter();
- // for (int i = 0; i < _corners.length; i++) {
- // _corners[i].set(center);
- // }
- //
- // if (sceneBounds instanceof BoundingBox) {
- // final BoundingBox bbox = (BoundingBox) sceneBounds;
- // bbox.getExtent(_extents);
- // } else if (sceneBounds instanceof BoundingSphere) {
- // final BoundingSphere bsphere = (BoundingSphere) sceneBounds;
- // _extents.set(bsphere.getRadius(), bsphere.getRadius(), bsphere.getRadius());
- // }
-
- }
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.bounding;
+
+import org.junit.Test;
+
+import com.ardor3d.math.Vector3;
+
+public class TestBounding {
+ @Test
+ public void testBoundingBoxMerge() throws Exception {
+ final BoundingBox obb = new BoundingBox();
+ obb.setCenter(Vector3.ZERO);
+ obb.setXExtent(1);
+ obb.setYExtent(1);
+ obb.setZExtent(1);
+
+ // final ReadOnlyVector3 center = sceneBounds.getCenter();
+ // for (int i = 0; i < _corners.length; i++) {
+ // _corners[i].set(center);
+ // }
+ //
+ // if (sceneBounds instanceof BoundingBox) {
+ // final BoundingBox bbox = (BoundingBox) sceneBounds;
+ // bbox.getExtent(_extents);
+ // } else if (sceneBounds instanceof BoundingSphere) {
+ // final BoundingSphere bsphere = (BoundingSphere) sceneBounds;
+ // _extents.set(bsphere.getRadius(), bsphere.getRadius(), bsphere.getRadius());
+ // }
+
+ }
+}
diff --git a/ardor3d-core/src/test/java/com/ardor3d/bounding/TestRayBounding.java b/ardor3d-core/src/test/java/com/ardor3d/bounding/TestRayBounding.java
index 347ff4e..9c28b6c 100644
--- a/ardor3d-core/src/test/java/com/ardor3d/bounding/TestRayBounding.java
+++ b/ardor3d-core/src/test/java/com/ardor3d/bounding/TestRayBounding.java
@@ -1,94 +1,94 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.bounding;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import org.junit.Test;
-
-import com.ardor3d.intersection.IntersectionRecord;
-import com.ardor3d.math.MathUtils;
-import com.ardor3d.math.Quaternion;
-import com.ardor3d.math.Ray3;
-import com.ardor3d.math.Transform;
-import com.ardor3d.math.Vector3;
-
-public class TestRayBounding {
- @Test
- public void testRayAABBIntersection() throws Exception {
- final BoundingBox obb = new BoundingBox();
- obb.setCenter(Vector3.ZERO);
- obb.setXExtent(1);
- obb.setYExtent(1);
- obb.setZExtent(1);
-
- Ray3 ray = new Ray3(new Vector3(2, -10, 0), Vector3.UNIT_Y);
- assertFalse(obb.intersects(ray));
- IntersectionRecord record = obb.intersectsWhere(ray);
- assertEquals(null, record);
-
- final Quaternion rotation = new Quaternion();
- rotation.fromAngleAxis(MathUtils.QUARTER_PI, Vector3.UNIT_Z);
- final Transform transform = new Transform();
- transform.setRotation(rotation);
- obb.transform(transform, obb);
-
- ray = new Ray3(new Vector3(1, -10, 0), Vector3.UNIT_Y);
- assertTrue(obb.intersects(ray));
- record = obb.intersectsWhere(ray);
- assertEquals(2, record.getNumberOfIntersections());
- }
-
- @Test
- public void testRayOBBIntersection() throws Exception {
- final OrientedBoundingBox obb = new OrientedBoundingBox();
- obb.setCenter(Vector3.ZERO);
- obb.setExtent(Vector3.ONE);
-
- Ray3 ray = new Ray3(new Vector3(1.2, -10, 0), Vector3.UNIT_Y);
- assertFalse(obb.intersects(ray));
- IntersectionRecord record = obb.intersectsWhere(ray);
- assertEquals(null, record);
-
- final Quaternion rotation = new Quaternion();
- rotation.fromAngleAxis(MathUtils.QUARTER_PI, Vector3.UNIT_Z);
- final Transform transform = new Transform();
- transform.setRotation(rotation);
- obb.transform(transform, obb);
-
- ray = new Ray3(new Vector3(1.2, -10, 0), Vector3.UNIT_Y);
- assertTrue(obb.intersects(ray));
- record = obb.intersectsWhere(ray);
- assertEquals(2, record.getNumberOfIntersections());
- }
-
- @Test
- public void testRaySphereIntersection() throws Exception {
- final BoundingSphere bs = new BoundingSphere();
- bs.setCenter(Vector3.ZERO);
- bs.setRadius(1);
-
- final Ray3 ray = new Ray3(new Vector3(2, -3, 0), Vector3.UNIT_Y);
- assertFalse(bs.intersects(ray));
- IntersectionRecord record = bs.intersectsWhere(ray);
- assertEquals(null, record);
-
- final Transform transform = new Transform();
- transform.setTranslation(2, 0, .5);
- bs.transform(transform, bs);
-
- assertTrue(bs.intersects(ray));
- record = bs.intersectsWhere(ray);
- assertEquals(2, record.getNumberOfIntersections());
- }
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.bounding;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+import com.ardor3d.intersection.IntersectionRecord;
+import com.ardor3d.math.MathUtils;
+import com.ardor3d.math.Quaternion;
+import com.ardor3d.math.Ray3;
+import com.ardor3d.math.Transform;
+import com.ardor3d.math.Vector3;
+
+public class TestRayBounding {
+ @Test
+ public void testRayAABBIntersection() throws Exception {
+ final BoundingBox obb = new BoundingBox();
+ obb.setCenter(Vector3.ZERO);
+ obb.setXExtent(1);
+ obb.setYExtent(1);
+ obb.setZExtent(1);
+
+ Ray3 ray = new Ray3(new Vector3(2, -10, 0), Vector3.UNIT_Y);
+ assertFalse(obb.intersects(ray));
+ IntersectionRecord record = obb.intersectsWhere(ray);
+ assertEquals(null, record);
+
+ final Quaternion rotation = new Quaternion();
+ rotation.fromAngleAxis(MathUtils.QUARTER_PI, Vector3.UNIT_Z);
+ final Transform transform = new Transform();
+ transform.setRotation(rotation);
+ obb.transform(transform, obb);
+
+ ray = new Ray3(new Vector3(1, -10, 0), Vector3.UNIT_Y);
+ assertTrue(obb.intersects(ray));
+ record = obb.intersectsWhere(ray);
+ assertEquals(2, record.getNumberOfIntersections());
+ }
+
+ @Test
+ public void testRayOBBIntersection() throws Exception {
+ final OrientedBoundingBox obb = new OrientedBoundingBox();
+ obb.setCenter(Vector3.ZERO);
+ obb.setExtent(Vector3.ONE);
+
+ Ray3 ray = new Ray3(new Vector3(1.2, -10, 0), Vector3.UNIT_Y);
+ assertFalse(obb.intersects(ray));
+ IntersectionRecord record = obb.intersectsWhere(ray);
+ assertEquals(null, record);
+
+ final Quaternion rotation = new Quaternion();
+ rotation.fromAngleAxis(MathUtils.QUARTER_PI, Vector3.UNIT_Z);
+ final Transform transform = new Transform();
+ transform.setRotation(rotation);
+ obb.transform(transform, obb);
+
+ ray = new Ray3(new Vector3(1.2, -10, 0), Vector3.UNIT_Y);
+ assertTrue(obb.intersects(ray));
+ record = obb.intersectsWhere(ray);
+ assertEquals(2, record.getNumberOfIntersections());
+ }
+
+ @Test
+ public void testRaySphereIntersection() throws Exception {
+ final BoundingSphere bs = new BoundingSphere();
+ bs.setCenter(Vector3.ZERO);
+ bs.setRadius(1);
+
+ final Ray3 ray = new Ray3(new Vector3(2, -3, 0), Vector3.UNIT_Y);
+ assertFalse(bs.intersects(ray));
+ IntersectionRecord record = bs.intersectsWhere(ray);
+ assertEquals(null, record);
+
+ final Transform transform = new Transform();
+ transform.setTranslation(2, 0, .5);
+ bs.transform(transform, bs);
+
+ assertTrue(bs.intersects(ray));
+ record = bs.intersectsWhere(ray);
+ assertEquals(2, record.getNumberOfIntersections());
+ }
+}
diff --git a/ardor3d-core/src/test/java/com/ardor3d/input/TestKeyboardState.java b/ardor3d-core/src/test/java/com/ardor3d/input/TestKeyboardState.java
index 741d7de..b5b40e8 100644
--- a/ardor3d-core/src/test/java/com/ardor3d/input/TestKeyboardState.java
+++ b/ardor3d-core/src/test/java/com/ardor3d/input/TestKeyboardState.java
@@ -1,81 +1,81 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.input;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import java.util.EnumSet;
-
-import org.junit.Test;
-
-public class TestKeyboardState {
- KeyboardState ks1, ks2;
-
- @Test
- public void testKeysReleased1() throws Exception {
- ks1 = new KeyboardState(EnumSet.of(Key.A, Key.B), KeyEvent.NOTHING);
- ks2 = new KeyboardState(EnumSet.of(Key.A, Key.E), KeyEvent.NOTHING);
-
- final EnumSet<Key> released = ks2.getKeysReleasedSince(ks1);
-
- assertEquals("1 key", 1, released.size());
- assertTrue("b released", released.contains(Key.B));
- }
-
- @Test
- public void testKeysReleased2() throws Exception {
- ks1 = new KeyboardState(EnumSet.of(Key.A, Key.B), KeyEvent.NOTHING);
- ks2 = new KeyboardState(EnumSet.noneOf(Key.class), KeyEvent.NOTHING);
-
- final EnumSet<Key> released = ks2.getKeysReleasedSince(ks1);
-
- assertEquals("2 key", 2, released.size());
- assertTrue("a released", released.contains(Key.A));
- assertTrue("b released", released.contains(Key.B));
- }
-
- @Test
- public void testKeysPressed1() throws Exception {
- ks1 = new KeyboardState(EnumSet.of(Key.A, Key.B), KeyEvent.NOTHING);
- ks2 = new KeyboardState(EnumSet.of(Key.A, Key.C, Key.D), KeyEvent.NOTHING);
-
- final EnumSet<Key> pressed = ks2.getKeysPressedSince(ks1);
-
- assertEquals("2 key", 2, pressed.size());
- assertTrue("c pressed", pressed.contains(Key.C));
- assertTrue("d pressed", pressed.contains(Key.D));
- }
-
- @Test
- public void testKeysPressed2() throws Exception {
- ks1 = new KeyboardState(EnumSet.noneOf(Key.class), KeyEvent.NOTHING);
- ks2 = new KeyboardState(EnumSet.of(Key.A, Key.C, Key.D), KeyEvent.NOTHING);
-
- final EnumSet<Key> pressed = ks2.getKeysPressedSince(ks1);
-
- assertEquals("2 key", 3, pressed.size());
- assertTrue("a pressed", pressed.contains(Key.A));
- assertTrue("c pressed", pressed.contains(Key.C));
- assertTrue("d pressed", pressed.contains(Key.D));
- }
-
- @Test
- public void testKeysPressed3() throws Exception {
- ks1 = new KeyboardState(EnumSet.of(Key.A, Key.C, Key.D), KeyEvent.NOTHING);
- ks2 = new KeyboardState(EnumSet.of(Key.A), KeyEvent.NOTHING);
-
- final EnumSet<Key> pressed = ks2.getKeysPressedSince(ks1);
-
- assertEquals("0 key", 0, pressed.size());
- }
-
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.input;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.EnumSet;
+
+import org.junit.Test;
+
+public class TestKeyboardState {
+ KeyboardState ks1, ks2;
+
+ @Test
+ public void testKeysReleased1() throws Exception {
+ ks1 = new KeyboardState(EnumSet.of(Key.A, Key.B), KeyEvent.NOTHING);
+ ks2 = new KeyboardState(EnumSet.of(Key.A, Key.E), KeyEvent.NOTHING);
+
+ final EnumSet<Key> released = ks2.getKeysReleasedSince(ks1);
+
+ assertEquals("1 key", 1, released.size());
+ assertTrue("b released", released.contains(Key.B));
+ }
+
+ @Test
+ public void testKeysReleased2() throws Exception {
+ ks1 = new KeyboardState(EnumSet.of(Key.A, Key.B), KeyEvent.NOTHING);
+ ks2 = new KeyboardState(EnumSet.noneOf(Key.class), KeyEvent.NOTHING);
+
+ final EnumSet<Key> released = ks2.getKeysReleasedSince(ks1);
+
+ assertEquals("2 key", 2, released.size());
+ assertTrue("a released", released.contains(Key.A));
+ assertTrue("b released", released.contains(Key.B));
+ }
+
+ @Test
+ public void testKeysPressed1() throws Exception {
+ ks1 = new KeyboardState(EnumSet.of(Key.A, Key.B), KeyEvent.NOTHING);
+ ks2 = new KeyboardState(EnumSet.of(Key.A, Key.C, Key.D), KeyEvent.NOTHING);
+
+ final EnumSet<Key> pressed = ks2.getKeysPressedSince(ks1);
+
+ assertEquals("2 key", 2, pressed.size());
+ assertTrue("c pressed", pressed.contains(Key.C));
+ assertTrue("d pressed", pressed.contains(Key.D));
+ }
+
+ @Test
+ public void testKeysPressed2() throws Exception {
+ ks1 = new KeyboardState(EnumSet.noneOf(Key.class), KeyEvent.NOTHING);
+ ks2 = new KeyboardState(EnumSet.of(Key.A, Key.C, Key.D), KeyEvent.NOTHING);
+
+ final EnumSet<Key> pressed = ks2.getKeysPressedSince(ks1);
+
+ assertEquals("2 key", 3, pressed.size());
+ assertTrue("a pressed", pressed.contains(Key.A));
+ assertTrue("c pressed", pressed.contains(Key.C));
+ assertTrue("d pressed", pressed.contains(Key.D));
+ }
+
+ @Test
+ public void testKeysPressed3() throws Exception {
+ ks1 = new KeyboardState(EnumSet.of(Key.A, Key.C, Key.D), KeyEvent.NOTHING);
+ ks2 = new KeyboardState(EnumSet.of(Key.A), KeyEvent.NOTHING);
+
+ final EnumSet<Key> pressed = ks2.getKeysPressedSince(ks1);
+
+ assertEquals("0 key", 0, pressed.size());
+ }
+
+}
diff --git a/ardor3d-core/src/test/java/com/ardor3d/input/TestPhysicalLayer.java b/ardor3d-core/src/test/java/com/ardor3d/input/TestPhysicalLayer.java
index 6502656..cc0dbb8 100644
--- a/ardor3d-core/src/test/java/com/ardor3d/input/TestPhysicalLayer.java
+++ b/ardor3d-core/src/test/java/com/ardor3d/input/TestPhysicalLayer.java
@@ -1,373 +1,373 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.input;
-
-import static org.easymock.EasyMock.expect;
-import static org.easymock.classextension.EasyMock.createMock;
-import static org.easymock.classextension.EasyMock.replay;
-import static org.easymock.classextension.EasyMock.verify;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import java.util.LinkedList;
-import java.util.List;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-import com.google.common.collect.AbstractIterator;
-import com.google.common.collect.Iterators;
-import com.google.common.collect.PeekingIterator;
-
-public class TestPhysicalLayer {
- KeyboardWrapper keyboardWrapper;
- MouseWrapper mouseWrapper;
- FocusWrapper focusWrapper;
- ControllerWrapper controllerWrapper;
- PhysicalLayer pl;
-
- Object[] mocks;
-
- List<KeyEvent> noKeys = new LinkedList<KeyEvent>();
- List<KeyEvent> Adown = new LinkedList<KeyEvent>();
- List<KeyEvent> AdownBdown = new LinkedList<KeyEvent>();
- List<KeyEvent> AdownAup = new LinkedList<KeyEvent>();
-
- List<ControllerEvent> nothing = new LinkedList<ControllerEvent>();
-
- List<MouseState> buttonDown = new LinkedList<MouseState>();
- List<MouseState> noMice = new LinkedList<MouseState>();
-
- List<InputState> inputStates;
- InputState is;
-
- // @SuppressWarnings( { "unchecked" })
- @Before
- public void setup() throws Exception {
- keyboardWrapper = createMock("KeyboardWrapper", KeyboardWrapper.class);
- mouseWrapper = createMock("MouseWrapper", MouseWrapper.class);
- controllerWrapper = createMock("ControllerWrapper", ControllerWrapper.class);
- focusWrapper = createMock("FocusWrapper", FocusWrapper.class);
-
- pl = new PhysicalLayer(keyboardWrapper, mouseWrapper, controllerWrapper, focusWrapper);
-
- mocks = new Object[] { keyboardWrapper, mouseWrapper, controllerWrapper, focusWrapper };
-
- Adown.add(new KeyEvent(Key.A, KeyState.DOWN, 'a'));
-
- AdownBdown.add(new KeyEvent(Key.A, KeyState.DOWN, 'a'));
- AdownBdown.add(new KeyEvent(Key.B, KeyState.DOWN, 'b'));
-
- AdownAup.add(new KeyEvent(Key.A, KeyState.DOWN, 'a'));
- AdownAup.add(new KeyEvent(Key.A, KeyState.UP, 'a'));
-
- buttonDown.add(new MouseState(0, 0, 0, 0, 0, MouseButton.makeMap(ButtonState.DOWN, ButtonState.UP,
- ButtonState.UP), null));
- }
-
- @After
- public void verifyMocks() throws Exception {
- verify(mocks);
- }
-
- @Test
- public void testKeyboardBasic1() throws Exception {
- keyboardWrapper.init();
- mouseWrapper.init();
- controllerWrapper.init();
- focusWrapper.init();
-
- expect(keyboardWrapper.getEvents()).andReturn(Iterators.peekingIterator(Adown.iterator()));
- expect(keyboardWrapper.getEvents()).andReturn(Iterators.peekingIterator(noKeys.iterator()));
- expect(keyboardWrapper.getEvents()).andReturn(Iterators.peekingIterator(noKeys.iterator()));
-
- expect(mouseWrapper.getEvents()).andReturn(Iterators.peekingIterator(noMice.iterator())).times(3);
-
- expect(controllerWrapper.getEvents()).andReturn(Iterators.peekingIterator(nothing.iterator())).times(3);
-
- expect(focusWrapper.getAndClearFocusLost()).andReturn(false).atLeastOnce();
-
- replay(mocks);
-
- pl.readState();
- inputStates = pl.drainAvailableStates();
-
- assertEquals("1 state", 1, inputStates.size());
-
- is = inputStates.get(0);
-
- assertTrue("a down", is.getKeyboardState().isDown(Key.A));
- assertFalse("b down", is.getKeyboardState().isDown(Key.B));
-
- pl.readState();
- inputStates = pl.drainAvailableStates();
-
- assertEquals("0 states", 0, inputStates.size());
- }
-
- @Test
- public void testKeyboardBasic2() throws Exception {
- final PeekingIterator<KeyEvent> adau = Iterators.peekingIterator(AdownAup.iterator());
-
- keyboardWrapper.init();
- mouseWrapper.init();
- controllerWrapper.init();
- focusWrapper.init();
-
- expect(keyboardWrapper.getEvents()).andReturn(adau);
- expect(keyboardWrapper.getEvents()).andReturn(adau);
- expect(keyboardWrapper.getEvents()).andReturn(Iterators.peekingIterator(noKeys.iterator()));
- expect(keyboardWrapper.getEvents()).andReturn(Iterators.peekingIterator(noKeys.iterator()));
-
- expect(mouseWrapper.getEvents()).andReturn(Iterators.peekingIterator(noMice.iterator())).times(4);
- expect(controllerWrapper.getEvents()).andReturn(Iterators.peekingIterator(nothing.iterator())).times(4);
-
- expect(focusWrapper.getAndClearFocusLost()).andReturn(false).times(2);
-
- replay(mocks);
-
- pl.readState();
- inputStates = pl.drainAvailableStates();
-
- assertEquals("2 states", 2, inputStates.size());
-
- is = inputStates.get(0);
-
- assertTrue("a down", is.getKeyboardState().isDown(Key.A));
- assertFalse("b down", is.getKeyboardState().isDown(Key.B));
-
- is = inputStates.get(1);
-
- assertFalse("a down", is.getKeyboardState().isDown(Key.A));
- assertFalse("b down", is.getKeyboardState().isDown(Key.B));
-
- pl.readState();
- inputStates = pl.drainAvailableStates();
-
- assertEquals("0 states", 0, inputStates.size());
- }
-
- @Test
- public void testKeyboardBasic3() throws Exception {
- keyboardWrapper.init();
- mouseWrapper.init();
- focusWrapper.init();
- controllerWrapper.init();
-
- final PeekingIterator<KeyEvent> keyIterator = Iterators.peekingIterator(AdownBdown.iterator());
-
- expect(keyboardWrapper.getEvents()).andReturn(keyIterator).times(4);
- expect(mouseWrapper.getEvents()).andReturn(Iterators.peekingIterator(noMice.iterator())).times(4);
- expect(controllerWrapper.getEvents()).andReturn(Iterators.peekingIterator(nothing.iterator())).times(4);
- expect(focusWrapper.getAndClearFocusLost()).andReturn(false).times(2);
-
- replay(mocks);
-
- pl.readState();
- inputStates = pl.drainAvailableStates();
-
- assertEquals("2 states", 2, inputStates.size());
-
- is = inputStates.get(0);
-
- assertTrue("a down", is.getKeyboardState().isDown(Key.A));
- assertFalse("b down", is.getKeyboardState().isDown(Key.B));
-
- is = inputStates.get(1);
-
- assertTrue("a down", is.getKeyboardState().isDown(Key.A));
- assertTrue("b down", is.getKeyboardState().isDown(Key.B));
-
- pl.readState();
- inputStates = pl.drainAvailableStates();
-
- assertEquals("0 states", 0, inputStates.size());
- }
-
- @Test
- public void testTooManyChanges1() throws Exception {
- final PeekingIterator<KeyEvent> iter = new NeverEndingKeyIterator();
-
- keyboardWrapper.init();
- mouseWrapper.init();
- focusWrapper.init();
- controllerWrapper.init();
-
- expect(keyboardWrapper.getEvents()).andReturn(iter).atLeastOnce();
- expect(mouseWrapper.getEvents()).andReturn(Iterators.peekingIterator(noMice.iterator())).atLeastOnce();
- expect(controllerWrapper.getEvents()).andReturn(Iterators.peekingIterator(nothing.iterator())).atLeastOnce();
- expect(focusWrapper.getAndClearFocusLost()).andReturn(false).atLeastOnce();
-
- replay(mocks);
-
- pl.readState();
- }
-
- @Test
- public void testTooManyChanges2() throws Exception {
- final PeekingIterator<MouseState> iter = new NeverEndingMouseIterator();
-
- keyboardWrapper.init();
- mouseWrapper.init();
- focusWrapper.init();
- controllerWrapper.init();
-
- expect(keyboardWrapper.getEvents()).andReturn(Iterators.peekingIterator(noKeys.iterator())).atLeastOnce();
- expect(mouseWrapper.getEvents()).andReturn(iter).atLeastOnce();
- expect(controllerWrapper.getEvents()).andReturn(Iterators.peekingIterator(nothing.iterator())).atLeastOnce();
- expect(focusWrapper.getAndClearFocusLost()).andReturn(false).atLeastOnce();
-
- replay(mocks);
-
- pl.readState();
- }
-
- @Test
- public void testLostFocus1() throws Exception {
- keyboardWrapper.init();
- mouseWrapper.init();
- focusWrapper.init();
- controllerWrapper.init();
-
- expect(keyboardWrapper.getEvents()).andReturn(Iterators.peekingIterator(Adown.iterator()));
- expect(keyboardWrapper.getEvents()).andReturn(Iterators.peekingIterator(noKeys.iterator()));
- expect(mouseWrapper.getEvents()).andReturn(Iterators.peekingIterator(noMice.iterator())).times(2);
- expect(controllerWrapper.getEvents()).andReturn(Iterators.peekingIterator(nothing.iterator())).times(2);
- expect(focusWrapper.getAndClearFocusLost()).andReturn(true);
-
- replay(mocks);
-
- pl.readState();
-
- inputStates = pl.drainAvailableStates();
-
- assertEquals("2 states", 2, inputStates.size());
-
- is = inputStates.get(0);
-
- assertTrue("a down", is.getKeyboardState().isDown(Key.A));
- assertFalse("b down", is.getKeyboardState().isDown(Key.B));
-
- assertTrue("lost focus", InputState.LOST_FOCUS == inputStates.get(1));
- }
-
- @Test
- public void testLostFocus2() throws Exception {
- keyboardWrapper.init();
- mouseWrapper.init();
- focusWrapper.init();
- controllerWrapper.init();
-
- expect(keyboardWrapper.getEvents()).andReturn(Iterators.peekingIterator(Adown.iterator()));
- expect(keyboardWrapper.getEvents()).andReturn(Iterators.peekingIterator(noKeys.iterator()));
- expect(keyboardWrapper.getEvents()).andReturn(Iterators.peekingIterator(noKeys.iterator()));
- expect(mouseWrapper.getEvents()).andReturn(Iterators.peekingIterator(noMice.iterator())).times(3);
- expect(controllerWrapper.getEvents()).andReturn(Iterators.peekingIterator(nothing.iterator())).times(3);
- expect(focusWrapper.getAndClearFocusLost()).andReturn(false);
- expect(focusWrapper.getAndClearFocusLost()).andReturn(true);
-
- replay(mocks);
-
- pl.readState();
- pl.readState();
-
- inputStates = pl.drainAvailableStates();
-
- assertEquals("2 states", 2, inputStates.size());
-
- is = inputStates.get(0);
-
- assertTrue("a down", is.getKeyboardState().isDown(Key.A));
- assertFalse("b down", is.getKeyboardState().isDown(Key.B));
-
- is = inputStates.get(1);
-
- assertEquals("lost focus", InputState.LOST_FOCUS, is);
- assertFalse("a down", is.getKeyboardState().isDown(Key.A));
- assertFalse("b down", is.getKeyboardState().isDown(Key.B));
- }
-
- @Test
- public void testLostFocus3() throws Exception {
- keyboardWrapper.init();
- mouseWrapper.init();
- focusWrapper.init();
- controllerWrapper.init();
-
- expect(keyboardWrapper.getEvents()).andReturn(Iterators.peekingIterator(noKeys.iterator())).times(3);
- expect(mouseWrapper.getEvents()).andReturn(Iterators.peekingIterator(buttonDown.iterator()));
- expect(mouseWrapper.getEvents()).andReturn(Iterators.peekingIterator(noMice.iterator())).times(2);
- expect(controllerWrapper.getEvents()).andReturn(Iterators.peekingIterator(nothing.iterator())).times(3);
- expect(focusWrapper.getAndClearFocusLost()).andReturn(false);
- expect(focusWrapper.getAndClearFocusLost()).andReturn(true);
-
- replay(mocks);
-
- pl.readState();
- pl.readState();
-
- inputStates = pl.drainAvailableStates();
-
- assertEquals("2 states", 2, inputStates.size());
-
- is = inputStates.get(0);
-
- assertFalse("a down", is.getKeyboardState().isDown(Key.A));
- assertFalse("b down", is.getKeyboardState().isDown(Key.B));
- assertEquals("mb down", ButtonState.DOWN, is.getMouseState().getButtonState(MouseButton.LEFT));
-
- is = inputStates.get(1);
-
- assertEquals("lost focus", InputState.LOST_FOCUS, is);
- assertFalse("a down", is.getKeyboardState().isDown(Key.A));
- assertFalse("b down", is.getKeyboardState().isDown(Key.B));
- assertEquals("mb up", ButtonState.UP, is.getMouseState().getButtonState(MouseButton.LEFT));
- }
-
- private static class NeverEndingKeyIterator extends AbstractIterator<KeyEvent> implements PeekingIterator<KeyEvent> {
- final KeyEvent aUp = new KeyEvent(Key.A, KeyState.UP, 'a');
- final KeyEvent aDown = new KeyEvent(Key.A, KeyState.DOWN, 'a');
-
- int count = 0;
-
- @Override
- protected KeyEvent computeNext() {
- count++;
-
- if (count % 2 == 0) {
- return aUp;
- }
-
- return aDown;
- }
- }
-
- private static class NeverEndingMouseIterator extends AbstractIterator<MouseState> implements
- PeekingIterator<MouseState> {
- final MouseState m1 = new MouseState(0, 0, 0, 0, 0, null, null);
- final MouseState m2 = new MouseState(0, 1, 2, 0, 0, null, null);
-
- int count = 0;
-
- @Override
- protected MouseState computeNext() {
- count++;
-
- if (count % 2 == 0) {
- return m1;
- }
-
- return m2;
- }
- }
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.input;
+
+import static org.easymock.EasyMock.expect;
+import static org.easymock.classextension.EasyMock.createMock;
+import static org.easymock.classextension.EasyMock.replay;
+import static org.easymock.classextension.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.google.common.collect.AbstractIterator;
+import com.google.common.collect.Iterators;
+import com.google.common.collect.PeekingIterator;
+
+public class TestPhysicalLayer {
+ KeyboardWrapper keyboardWrapper;
+ MouseWrapper mouseWrapper;
+ FocusWrapper focusWrapper;
+ ControllerWrapper controllerWrapper;
+ PhysicalLayer pl;
+
+ Object[] mocks;
+
+ List<KeyEvent> noKeys = new LinkedList<KeyEvent>();
+ List<KeyEvent> Adown = new LinkedList<KeyEvent>();
+ List<KeyEvent> AdownBdown = new LinkedList<KeyEvent>();
+ List<KeyEvent> AdownAup = new LinkedList<KeyEvent>();
+
+ List<ControllerEvent> nothing = new LinkedList<ControllerEvent>();
+
+ List<MouseState> buttonDown = new LinkedList<MouseState>();
+ List<MouseState> noMice = new LinkedList<MouseState>();
+
+ List<InputState> inputStates;
+ InputState is;
+
+ // @SuppressWarnings( { "unchecked" })
+ @Before
+ public void setup() throws Exception {
+ keyboardWrapper = createMock("KeyboardWrapper", KeyboardWrapper.class);
+ mouseWrapper = createMock("MouseWrapper", MouseWrapper.class);
+ controllerWrapper = createMock("ControllerWrapper", ControllerWrapper.class);
+ focusWrapper = createMock("FocusWrapper", FocusWrapper.class);
+
+ pl = new PhysicalLayer(keyboardWrapper, mouseWrapper, controllerWrapper, focusWrapper);
+
+ mocks = new Object[] { keyboardWrapper, mouseWrapper, controllerWrapper, focusWrapper };
+
+ Adown.add(new KeyEvent(Key.A, KeyState.DOWN, 'a'));
+
+ AdownBdown.add(new KeyEvent(Key.A, KeyState.DOWN, 'a'));
+ AdownBdown.add(new KeyEvent(Key.B, KeyState.DOWN, 'b'));
+
+ AdownAup.add(new KeyEvent(Key.A, KeyState.DOWN, 'a'));
+ AdownAup.add(new KeyEvent(Key.A, KeyState.UP, 'a'));
+
+ buttonDown.add(new MouseState(0, 0, 0, 0, 0, MouseButton.makeMap(ButtonState.DOWN, ButtonState.UP,
+ ButtonState.UP), null));
+ }
+
+ @After
+ public void verifyMocks() throws Exception {
+ verify(mocks);
+ }
+
+ @Test
+ public void testKeyboardBasic1() throws Exception {
+ keyboardWrapper.init();
+ mouseWrapper.init();
+ controllerWrapper.init();
+ focusWrapper.init();
+
+ expect(keyboardWrapper.getEvents()).andReturn(Iterators.peekingIterator(Adown.iterator()));
+ expect(keyboardWrapper.getEvents()).andReturn(Iterators.peekingIterator(noKeys.iterator()));
+ expect(keyboardWrapper.getEvents()).andReturn(Iterators.peekingIterator(noKeys.iterator()));
+
+ expect(mouseWrapper.getEvents()).andReturn(Iterators.peekingIterator(noMice.iterator())).times(3);
+
+ expect(controllerWrapper.getEvents()).andReturn(Iterators.peekingIterator(nothing.iterator())).times(3);
+
+ expect(focusWrapper.getAndClearFocusLost()).andReturn(false).atLeastOnce();
+
+ replay(mocks);
+
+ pl.readState();
+ inputStates = pl.drainAvailableStates();
+
+ assertEquals("1 state", 1, inputStates.size());
+
+ is = inputStates.get(0);
+
+ assertTrue("a down", is.getKeyboardState().isDown(Key.A));
+ assertFalse("b down", is.getKeyboardState().isDown(Key.B));
+
+ pl.readState();
+ inputStates = pl.drainAvailableStates();
+
+ assertEquals("0 states", 0, inputStates.size());
+ }
+
+ @Test
+ public void testKeyboardBasic2() throws Exception {
+ final PeekingIterator<KeyEvent> adau = Iterators.peekingIterator(AdownAup.iterator());
+
+ keyboardWrapper.init();
+ mouseWrapper.init();
+ controllerWrapper.init();
+ focusWrapper.init();
+
+ expect(keyboardWrapper.getEvents()).andReturn(adau);
+ expect(keyboardWrapper.getEvents()).andReturn(adau);
+ expect(keyboardWrapper.getEvents()).andReturn(Iterators.peekingIterator(noKeys.iterator()));
+ expect(keyboardWrapper.getEvents()).andReturn(Iterators.peekingIterator(noKeys.iterator()));
+
+ expect(mouseWrapper.getEvents()).andReturn(Iterators.peekingIterator(noMice.iterator())).times(4);
+ expect(controllerWrapper.getEvents()).andReturn(Iterators.peekingIterator(nothing.iterator())).times(4);
+
+ expect(focusWrapper.getAndClearFocusLost()).andReturn(false).times(2);
+
+ replay(mocks);
+
+ pl.readState();
+ inputStates = pl.drainAvailableStates();
+
+ assertEquals("2 states", 2, inputStates.size());
+
+ is = inputStates.get(0);
+
+ assertTrue("a down", is.getKeyboardState().isDown(Key.A));
+ assertFalse("b down", is.getKeyboardState().isDown(Key.B));
+
+ is = inputStates.get(1);
+
+ assertFalse("a down", is.getKeyboardState().isDown(Key.A));
+ assertFalse("b down", is.getKeyboardState().isDown(Key.B));
+
+ pl.readState();
+ inputStates = pl.drainAvailableStates();
+
+ assertEquals("0 states", 0, inputStates.size());
+ }
+
+ @Test
+ public void testKeyboardBasic3() throws Exception {
+ keyboardWrapper.init();
+ mouseWrapper.init();
+ focusWrapper.init();
+ controllerWrapper.init();
+
+ final PeekingIterator<KeyEvent> keyIterator = Iterators.peekingIterator(AdownBdown.iterator());
+
+ expect(keyboardWrapper.getEvents()).andReturn(keyIterator).times(4);
+ expect(mouseWrapper.getEvents()).andReturn(Iterators.peekingIterator(noMice.iterator())).times(4);
+ expect(controllerWrapper.getEvents()).andReturn(Iterators.peekingIterator(nothing.iterator())).times(4);
+ expect(focusWrapper.getAndClearFocusLost()).andReturn(false).times(2);
+
+ replay(mocks);
+
+ pl.readState();
+ inputStates = pl.drainAvailableStates();
+
+ assertEquals("2 states", 2, inputStates.size());
+
+ is = inputStates.get(0);
+
+ assertTrue("a down", is.getKeyboardState().isDown(Key.A));
+ assertFalse("b down", is.getKeyboardState().isDown(Key.B));
+
+ is = inputStates.get(1);
+
+ assertTrue("a down", is.getKeyboardState().isDown(Key.A));
+ assertTrue("b down", is.getKeyboardState().isDown(Key.B));
+
+ pl.readState();
+ inputStates = pl.drainAvailableStates();
+
+ assertEquals("0 states", 0, inputStates.size());
+ }
+
+ @Test
+ public void testTooManyChanges1() throws Exception {
+ final PeekingIterator<KeyEvent> iter = new NeverEndingKeyIterator();
+
+ keyboardWrapper.init();
+ mouseWrapper.init();
+ focusWrapper.init();
+ controllerWrapper.init();
+
+ expect(keyboardWrapper.getEvents()).andReturn(iter).atLeastOnce();
+ expect(mouseWrapper.getEvents()).andReturn(Iterators.peekingIterator(noMice.iterator())).atLeastOnce();
+ expect(controllerWrapper.getEvents()).andReturn(Iterators.peekingIterator(nothing.iterator())).atLeastOnce();
+ expect(focusWrapper.getAndClearFocusLost()).andReturn(false).atLeastOnce();
+
+ replay(mocks);
+
+ pl.readState();
+ }
+
+ @Test
+ public void testTooManyChanges2() throws Exception {
+ final PeekingIterator<MouseState> iter = new NeverEndingMouseIterator();
+
+ keyboardWrapper.init();
+ mouseWrapper.init();
+ focusWrapper.init();
+ controllerWrapper.init();
+
+ expect(keyboardWrapper.getEvents()).andReturn(Iterators.peekingIterator(noKeys.iterator())).atLeastOnce();
+ expect(mouseWrapper.getEvents()).andReturn(iter).atLeastOnce();
+ expect(controllerWrapper.getEvents()).andReturn(Iterators.peekingIterator(nothing.iterator())).atLeastOnce();
+ expect(focusWrapper.getAndClearFocusLost()).andReturn(false).atLeastOnce();
+
+ replay(mocks);
+
+ pl.readState();
+ }
+
+ @Test
+ public void testLostFocus1() throws Exception {
+ keyboardWrapper.init();
+ mouseWrapper.init();
+ focusWrapper.init();
+ controllerWrapper.init();
+
+ expect(keyboardWrapper.getEvents()).andReturn(Iterators.peekingIterator(Adown.iterator()));
+ expect(keyboardWrapper.getEvents()).andReturn(Iterators.peekingIterator(noKeys.iterator()));
+ expect(mouseWrapper.getEvents()).andReturn(Iterators.peekingIterator(noMice.iterator())).times(2);
+ expect(controllerWrapper.getEvents()).andReturn(Iterators.peekingIterator(nothing.iterator())).times(2);
+ expect(focusWrapper.getAndClearFocusLost()).andReturn(true);
+
+ replay(mocks);
+
+ pl.readState();
+
+ inputStates = pl.drainAvailableStates();
+
+ assertEquals("2 states", 2, inputStates.size());
+
+ is = inputStates.get(0);
+
+ assertTrue("a down", is.getKeyboardState().isDown(Key.A));
+ assertFalse("b down", is.getKeyboardState().isDown(Key.B));
+
+ assertTrue("lost focus", InputState.LOST_FOCUS == inputStates.get(1));
+ }
+
+ @Test
+ public void testLostFocus2() throws Exception {
+ keyboardWrapper.init();
+ mouseWrapper.init();
+ focusWrapper.init();
+ controllerWrapper.init();
+
+ expect(keyboardWrapper.getEvents()).andReturn(Iterators.peekingIterator(Adown.iterator()));
+ expect(keyboardWrapper.getEvents()).andReturn(Iterators.peekingIterator(noKeys.iterator()));
+ expect(keyboardWrapper.getEvents()).andReturn(Iterators.peekingIterator(noKeys.iterator()));
+ expect(mouseWrapper.getEvents()).andReturn(Iterators.peekingIterator(noMice.iterator())).times(3);
+ expect(controllerWrapper.getEvents()).andReturn(Iterators.peekingIterator(nothing.iterator())).times(3);
+ expect(focusWrapper.getAndClearFocusLost()).andReturn(false);
+ expect(focusWrapper.getAndClearFocusLost()).andReturn(true);
+
+ replay(mocks);
+
+ pl.readState();
+ pl.readState();
+
+ inputStates = pl.drainAvailableStates();
+
+ assertEquals("2 states", 2, inputStates.size());
+
+ is = inputStates.get(0);
+
+ assertTrue("a down", is.getKeyboardState().isDown(Key.A));
+ assertFalse("b down", is.getKeyboardState().isDown(Key.B));
+
+ is = inputStates.get(1);
+
+ assertEquals("lost focus", InputState.LOST_FOCUS, is);
+ assertFalse("a down", is.getKeyboardState().isDown(Key.A));
+ assertFalse("b down", is.getKeyboardState().isDown(Key.B));
+ }
+
+ @Test
+ public void testLostFocus3() throws Exception {
+ keyboardWrapper.init();
+ mouseWrapper.init();
+ focusWrapper.init();
+ controllerWrapper.init();
+
+ expect(keyboardWrapper.getEvents()).andReturn(Iterators.peekingIterator(noKeys.iterator())).times(3);
+ expect(mouseWrapper.getEvents()).andReturn(Iterators.peekingIterator(buttonDown.iterator()));
+ expect(mouseWrapper.getEvents()).andReturn(Iterators.peekingIterator(noMice.iterator())).times(2);
+ expect(controllerWrapper.getEvents()).andReturn(Iterators.peekingIterator(nothing.iterator())).times(3);
+ expect(focusWrapper.getAndClearFocusLost()).andReturn(false);
+ expect(focusWrapper.getAndClearFocusLost()).andReturn(true);
+
+ replay(mocks);
+
+ pl.readState();
+ pl.readState();
+
+ inputStates = pl.drainAvailableStates();
+
+ assertEquals("2 states", 2, inputStates.size());
+
+ is = inputStates.get(0);
+
+ assertFalse("a down", is.getKeyboardState().isDown(Key.A));
+ assertFalse("b down", is.getKeyboardState().isDown(Key.B));
+ assertEquals("mb down", ButtonState.DOWN, is.getMouseState().getButtonState(MouseButton.LEFT));
+
+ is = inputStates.get(1);
+
+ assertEquals("lost focus", InputState.LOST_FOCUS, is);
+ assertFalse("a down", is.getKeyboardState().isDown(Key.A));
+ assertFalse("b down", is.getKeyboardState().isDown(Key.B));
+ assertEquals("mb up", ButtonState.UP, is.getMouseState().getButtonState(MouseButton.LEFT));
+ }
+
+ private static class NeverEndingKeyIterator extends AbstractIterator<KeyEvent> implements PeekingIterator<KeyEvent> {
+ final KeyEvent aUp = new KeyEvent(Key.A, KeyState.UP, 'a');
+ final KeyEvent aDown = new KeyEvent(Key.A, KeyState.DOWN, 'a');
+
+ int count = 0;
+
+ @Override
+ protected KeyEvent computeNext() {
+ count++;
+
+ if (count % 2 == 0) {
+ return aUp;
+ }
+
+ return aDown;
+ }
+ }
+
+ private static class NeverEndingMouseIterator extends AbstractIterator<MouseState> implements
+ PeekingIterator<MouseState> {
+ final MouseState m1 = new MouseState(0, 0, 0, 0, 0, null, null);
+ final MouseState m2 = new MouseState(0, 1, 2, 0, 0, null, null);
+
+ int count = 0;
+
+ @Override
+ protected MouseState computeNext() {
+ count++;
+
+ if (count % 2 == 0) {
+ return m1;
+ }
+
+ return m2;
+ }
+ }
} \ No newline at end of file
diff --git a/ardor3d-core/src/test/java/com/ardor3d/input/logical/TestLogicalLayer.java b/ardor3d-core/src/test/java/com/ardor3d/input/logical/TestLogicalLayer.java
index 1003e11..dc13728 100644
--- a/ardor3d-core/src/test/java/com/ardor3d/input/logical/TestLogicalLayer.java
+++ b/ardor3d-core/src/test/java/com/ardor3d/input/logical/TestLogicalLayer.java
@@ -1,249 +1,249 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.input.logical;
-
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.isA;
-import static org.easymock.classextension.EasyMock.createMock;
-import static org.easymock.classextension.EasyMock.replay;
-import static org.easymock.classextension.EasyMock.verify;
-
-import java.util.EnumSet;
-import java.util.LinkedList;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-import com.ardor3d.framework.Canvas;
-import com.ardor3d.input.ButtonState;
-import com.ardor3d.input.ControllerState;
-import com.ardor3d.input.InputState;
-import com.ardor3d.input.Key;
-import com.ardor3d.input.KeyEvent;
-import com.ardor3d.input.KeyboardState;
-import com.ardor3d.input.MouseButton;
-import com.ardor3d.input.MouseState;
-import com.ardor3d.input.PhysicalLayer;
-import com.google.common.base.Predicate;
-
-/**
- * Tests for the LogicalLayer
- */
-public class TestLogicalLayer {
- LogicalLayer ll;
- PhysicalLayer pl;
-
- TriggerAction ta1, ta2;
-
- Predicate<TwoInputStates> p1;
- Predicate<TwoInputStates> p2;
-
- KeyboardState ks;
- MouseState ms;
- ControllerState cs;
-
- Canvas canvas;
-
- Object[] mocks;
-
- @SuppressWarnings( { "unchecked" })
- @Before
- public void setup() throws Exception {
- pl = createMock("Physicallayer", PhysicalLayer.class);
-
- ta1 = createMock("TA1", TriggerAction.class);
- ta2 = createMock("TA2", TriggerAction.class);
-
- p1 = createMock("P1", Predicate.class);
- p2 = createMock("P2", Predicate.class);
-
- canvas = createMock("canvas", Canvas.class);
-
- ll = new LogicalLayer();
-
- ll.registerInput(canvas, pl);
-
- ks = new KeyboardState(EnumSet.noneOf(Key.class), KeyEvent.NOTHING);
- ms = new MouseState(0, 0, 0, 0, 0, MouseButton.makeMap(ButtonState.UP, ButtonState.UP, ButtonState.UP), null);
- cs = new ControllerState();
-
- mocks = new Object[] { pl, ta1, ta2, p1, p2, canvas };
- }
-
- @After
- public void verifyMocks() throws Exception {
- verify(mocks);
- }
-
- @Test
- public void testTriggers1() throws Exception {
- final InputState state1 = new InputState(ks, ms, cs);
- final InputState state2 = new InputState(ks, ms, cs);
-
- final double tpf = 14;
-
- final LinkedList<InputState> states1 = new LinkedList<InputState>();
- final LinkedList<InputState> states2 = new LinkedList<InputState>();
-
- states1.add(state1);
- states2.add(state2);
-
- pl.readState();
- pl.readState();
- expect(pl.drainAvailableStates()).andReturn(states1);
- expect(pl.drainAvailableStates()).andReturn(states2);
- expect(p1.apply(isA(TwoInputStates.class))).andReturn(false);
- expect(p1.apply(isA(TwoInputStates.class))).andReturn(true);
- ta1.perform(canvas, new TwoInputStates(state1, state2), tpf);
-
- replay(mocks);
-
- ll.registerTrigger(new InputTrigger(p1, ta1));
-
- ll.checkTriggers(tpf);
- ll.checkTriggers(tpf);
- }
-
- @Test
- public void testTriggers2() throws Exception {
- final InputState state1 = new InputState(ks, ms, cs);
- final InputState state2 = new InputState(ks, ms, cs);
-
- final double tpf = 14;
-
- final LinkedList<InputState> states1 = new LinkedList<InputState>();
- final LinkedList<InputState> states2 = new LinkedList<InputState>();
-
- states1.add(state1);
- states2.add(state2);
-
- pl.readState();
- pl.readState();
- expect(pl.drainAvailableStates()).andReturn(states1);
- expect(pl.drainAvailableStates()).andReturn(states2);
- expect(p1.apply(isA(TwoInputStates.class))).andReturn(false);
- expect(p1.apply(isA(TwoInputStates.class))).andReturn(true);
- expect(p2.apply(isA(TwoInputStates.class))).andReturn(true);
- expect(p2.apply(isA(TwoInputStates.class))).andReturn(true);
- ta1.perform(canvas, new TwoInputStates(state1, state2), tpf);
- ta2.perform(canvas, new TwoInputStates(InputState.EMPTY, state1), tpf);
- ta2.perform(canvas, new TwoInputStates(state1, state2), tpf);
-
- replay(mocks);
-
- ll.registerTrigger(new InputTrigger(p1, ta1));
- ll.registerTrigger(new InputTrigger(p2, ta2));
-
- ll.checkTriggers(tpf);
- ll.checkTriggers(tpf);
- }
-
- @Test
- public void testTriggers3() throws Exception {
- final InputState state1 = new InputState(ks, ms, cs);
- final InputState state2 = new InputState(ks, ms, cs);
-
- final double tpf = 14;
-
- final LinkedList<InputState> states1 = new LinkedList<InputState>();
- final LinkedList<InputState> states2 = new LinkedList<InputState>();
-
- states1.add(state1);
- states2.add(state2);
-
- pl.readState();
- pl.readState();
- expect(pl.drainAvailableStates()).andReturn(states1);
- expect(pl.drainAvailableStates()).andReturn(states2);
- expect(p1.apply(isA(TwoInputStates.class))).andReturn(false);
- expect(p1.apply(isA(TwoInputStates.class))).andReturn(true);
- expect(p2.apply(isA(TwoInputStates.class))).andReturn(true);
- ta1.perform(canvas, new TwoInputStates(state1, state2), tpf);
- ta2.perform(canvas, new TwoInputStates(InputState.EMPTY, state1), tpf);
-
- replay(mocks);
-
- final InputTrigger trigger2 = new InputTrigger(p2, ta2);
-
- ll.registerTrigger(new InputTrigger(p1, ta1));
- ll.registerTrigger(trigger2);
-
- ll.checkTriggers(tpf);
- ll.deregisterTrigger(trigger2);
- ll.checkTriggers(tpf);
- }
-
- @Test
- public void testTriggers4() throws Exception {
- final InputState state1 = new InputState(ks, ms, cs);
-
- final double tpf = 14;
-
- final LinkedList<InputState> states1 = new LinkedList<InputState>();
- final LinkedList<InputState> states2 = new LinkedList<InputState>();
-
- states1.add(state1);
-
- pl.readState();
- pl.readState();
- expect(pl.drainAvailableStates()).andReturn(states1);
- expect(pl.drainAvailableStates()).andReturn(states2);
- expect(p1.apply(isA(TwoInputStates.class))).andReturn(false);
- expect(p1.apply(isA(TwoInputStates.class))).andReturn(true);
- expect(p2.apply(isA(TwoInputStates.class))).andReturn(true);
- expect(p2.apply(isA(TwoInputStates.class))).andReturn(true);
- ta1.perform(canvas, new TwoInputStates(state1, state1), tpf);
- ta2.perform(canvas, new TwoInputStates(InputState.EMPTY, state1), tpf);
- ta2.perform(canvas, new TwoInputStates(state1, state1), tpf);
-
- replay(mocks);
-
- final InputTrigger trigger2 = new InputTrigger(p2, ta2);
-
- ll.registerTrigger(new InputTrigger(p1, ta1));
- ll.registerTrigger(trigger2);
-
- ll.checkTriggers(tpf);
- ll.checkTriggers(tpf);
- }
-
- @Test
- public void testLostFocus() throws Exception {
- final InputState state1 = new InputState(ks, ms, cs);
- final InputState state2 = new InputState(ks, ms, cs);
-
- final double tpf = 14;
-
- final LinkedList<InputState> states1 = new LinkedList<InputState>();
- final LinkedList<InputState> states2 = new LinkedList<InputState>();
-
- states1.add(state1);
- states2.add(InputState.LOST_FOCUS);
- states2.add(state2);
-
- pl.readState();
- pl.readState();
- expect(pl.drainAvailableStates()).andReturn(states1);
- expect(pl.drainAvailableStates()).andReturn(states2);
- expect(p1.apply(isA(TwoInputStates.class))).andReturn(true);
- expect(p1.apply(isA(TwoInputStates.class))).andReturn(false);
- ta1.perform(canvas, new TwoInputStates(InputState.EMPTY, state1), tpf);
-
- replay(mocks);
-
- ll.registerTrigger(new InputTrigger(p1, ta1));
-
- ll.checkTriggers(tpf);
- ll.checkTriggers(tpf);
-
- }
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.input.logical;
+
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.isA;
+import static org.easymock.classextension.EasyMock.createMock;
+import static org.easymock.classextension.EasyMock.replay;
+import static org.easymock.classextension.EasyMock.verify;
+
+import java.util.EnumSet;
+import java.util.LinkedList;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.ardor3d.framework.Canvas;
+import com.ardor3d.input.ButtonState;
+import com.ardor3d.input.ControllerState;
+import com.ardor3d.input.InputState;
+import com.ardor3d.input.Key;
+import com.ardor3d.input.KeyEvent;
+import com.ardor3d.input.KeyboardState;
+import com.ardor3d.input.MouseButton;
+import com.ardor3d.input.MouseState;
+import com.ardor3d.input.PhysicalLayer;
+import com.google.common.base.Predicate;
+
+/**
+ * Tests for the LogicalLayer
+ */
+public class TestLogicalLayer {
+ LogicalLayer ll;
+ PhysicalLayer pl;
+
+ TriggerAction ta1, ta2;
+
+ Predicate<TwoInputStates> p1;
+ Predicate<TwoInputStates> p2;
+
+ KeyboardState ks;
+ MouseState ms;
+ ControllerState cs;
+
+ Canvas canvas;
+
+ Object[] mocks;
+
+ @SuppressWarnings( { "unchecked" })
+ @Before
+ public void setup() throws Exception {
+ pl = createMock("Physicallayer", PhysicalLayer.class);
+
+ ta1 = createMock("TA1", TriggerAction.class);
+ ta2 = createMock("TA2", TriggerAction.class);
+
+ p1 = createMock("P1", Predicate.class);
+ p2 = createMock("P2", Predicate.class);
+
+ canvas = createMock("canvas", Canvas.class);
+
+ ll = new LogicalLayer();
+
+ ll.registerInput(canvas, pl);
+
+ ks = new KeyboardState(EnumSet.noneOf(Key.class), KeyEvent.NOTHING);
+ ms = new MouseState(0, 0, 0, 0, 0, MouseButton.makeMap(ButtonState.UP, ButtonState.UP, ButtonState.UP), null);
+ cs = new ControllerState();
+
+ mocks = new Object[] { pl, ta1, ta2, p1, p2, canvas };
+ }
+
+ @After
+ public void verifyMocks() throws Exception {
+ verify(mocks);
+ }
+
+ @Test
+ public void testTriggers1() throws Exception {
+ final InputState state1 = new InputState(ks, ms, cs);
+ final InputState state2 = new InputState(ks, ms, cs);
+
+ final double tpf = 14;
+
+ final LinkedList<InputState> states1 = new LinkedList<InputState>();
+ final LinkedList<InputState> states2 = new LinkedList<InputState>();
+
+ states1.add(state1);
+ states2.add(state2);
+
+ pl.readState();
+ pl.readState();
+ expect(pl.drainAvailableStates()).andReturn(states1);
+ expect(pl.drainAvailableStates()).andReturn(states2);
+ expect(p1.apply(isA(TwoInputStates.class))).andReturn(false);
+ expect(p1.apply(isA(TwoInputStates.class))).andReturn(true);
+ ta1.perform(canvas, new TwoInputStates(state1, state2), tpf);
+
+ replay(mocks);
+
+ ll.registerTrigger(new InputTrigger(p1, ta1));
+
+ ll.checkTriggers(tpf);
+ ll.checkTriggers(tpf);
+ }
+
+ @Test
+ public void testTriggers2() throws Exception {
+ final InputState state1 = new InputState(ks, ms, cs);
+ final InputState state2 = new InputState(ks, ms, cs);
+
+ final double tpf = 14;
+
+ final LinkedList<InputState> states1 = new LinkedList<InputState>();
+ final LinkedList<InputState> states2 = new LinkedList<InputState>();
+
+ states1.add(state1);
+ states2.add(state2);
+
+ pl.readState();
+ pl.readState();
+ expect(pl.drainAvailableStates()).andReturn(states1);
+ expect(pl.drainAvailableStates()).andReturn(states2);
+ expect(p1.apply(isA(TwoInputStates.class))).andReturn(false);
+ expect(p1.apply(isA(TwoInputStates.class))).andReturn(true);
+ expect(p2.apply(isA(TwoInputStates.class))).andReturn(true);
+ expect(p2.apply(isA(TwoInputStates.class))).andReturn(true);
+ ta1.perform(canvas, new TwoInputStates(state1, state2), tpf);
+ ta2.perform(canvas, new TwoInputStates(InputState.EMPTY, state1), tpf);
+ ta2.perform(canvas, new TwoInputStates(state1, state2), tpf);
+
+ replay(mocks);
+
+ ll.registerTrigger(new InputTrigger(p1, ta1));
+ ll.registerTrigger(new InputTrigger(p2, ta2));
+
+ ll.checkTriggers(tpf);
+ ll.checkTriggers(tpf);
+ }
+
+ @Test
+ public void testTriggers3() throws Exception {
+ final InputState state1 = new InputState(ks, ms, cs);
+ final InputState state2 = new InputState(ks, ms, cs);
+
+ final double tpf = 14;
+
+ final LinkedList<InputState> states1 = new LinkedList<InputState>();
+ final LinkedList<InputState> states2 = new LinkedList<InputState>();
+
+ states1.add(state1);
+ states2.add(state2);
+
+ pl.readState();
+ pl.readState();
+ expect(pl.drainAvailableStates()).andReturn(states1);
+ expect(pl.drainAvailableStates()).andReturn(states2);
+ expect(p1.apply(isA(TwoInputStates.class))).andReturn(false);
+ expect(p1.apply(isA(TwoInputStates.class))).andReturn(true);
+ expect(p2.apply(isA(TwoInputStates.class))).andReturn(true);
+ ta1.perform(canvas, new TwoInputStates(state1, state2), tpf);
+ ta2.perform(canvas, new TwoInputStates(InputState.EMPTY, state1), tpf);
+
+ replay(mocks);
+
+ final InputTrigger trigger2 = new InputTrigger(p2, ta2);
+
+ ll.registerTrigger(new InputTrigger(p1, ta1));
+ ll.registerTrigger(trigger2);
+
+ ll.checkTriggers(tpf);
+ ll.deregisterTrigger(trigger2);
+ ll.checkTriggers(tpf);
+ }
+
+ @Test
+ public void testTriggers4() throws Exception {
+ final InputState state1 = new InputState(ks, ms, cs);
+
+ final double tpf = 14;
+
+ final LinkedList<InputState> states1 = new LinkedList<InputState>();
+ final LinkedList<InputState> states2 = new LinkedList<InputState>();
+
+ states1.add(state1);
+
+ pl.readState();
+ pl.readState();
+ expect(pl.drainAvailableStates()).andReturn(states1);
+ expect(pl.drainAvailableStates()).andReturn(states2);
+ expect(p1.apply(isA(TwoInputStates.class))).andReturn(false);
+ expect(p1.apply(isA(TwoInputStates.class))).andReturn(true);
+ expect(p2.apply(isA(TwoInputStates.class))).andReturn(true);
+ expect(p2.apply(isA(TwoInputStates.class))).andReturn(true);
+ ta1.perform(canvas, new TwoInputStates(state1, state1), tpf);
+ ta2.perform(canvas, new TwoInputStates(InputState.EMPTY, state1), tpf);
+ ta2.perform(canvas, new TwoInputStates(state1, state1), tpf);
+
+ replay(mocks);
+
+ final InputTrigger trigger2 = new InputTrigger(p2, ta2);
+
+ ll.registerTrigger(new InputTrigger(p1, ta1));
+ ll.registerTrigger(trigger2);
+
+ ll.checkTriggers(tpf);
+ ll.checkTriggers(tpf);
+ }
+
+ @Test
+ public void testLostFocus() throws Exception {
+ final InputState state1 = new InputState(ks, ms, cs);
+ final InputState state2 = new InputState(ks, ms, cs);
+
+ final double tpf = 14;
+
+ final LinkedList<InputState> states1 = new LinkedList<InputState>();
+ final LinkedList<InputState> states2 = new LinkedList<InputState>();
+
+ states1.add(state1);
+ states2.add(InputState.LOST_FOCUS);
+ states2.add(state2);
+
+ pl.readState();
+ pl.readState();
+ expect(pl.drainAvailableStates()).andReturn(states1);
+ expect(pl.drainAvailableStates()).andReturn(states2);
+ expect(p1.apply(isA(TwoInputStates.class))).andReturn(true);
+ expect(p1.apply(isA(TwoInputStates.class))).andReturn(false);
+ ta1.perform(canvas, new TwoInputStates(InputState.EMPTY, state1), tpf);
+
+ replay(mocks);
+
+ ll.registerTrigger(new InputTrigger(p1, ta1));
+
+ ll.checkTriggers(tpf);
+ ll.checkTriggers(tpf);
+
+ }
+}
diff --git a/ardor3d-core/src/test/java/com/ardor3d/input/logical/TestStandardConditions.java b/ardor3d-core/src/test/java/com/ardor3d/input/logical/TestStandardConditions.java
index 8da445d..2fde296 100644
--- a/ardor3d-core/src/test/java/com/ardor3d/input/logical/TestStandardConditions.java
+++ b/ardor3d-core/src/test/java/com/ardor3d/input/logical/TestStandardConditions.java
@@ -1,202 +1,202 @@
-/**
- * Copyright (c) 2008-2012 Ardor Labs, Inc.
- *
- * This file is part of Ardor3D.
- *
- * Ardor3D is free software: you can redistribute it and/or modify it
- * under the terms of its license which may be found in the accompanying
- * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
- */
-
-package com.ardor3d.input.logical;
-
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertTrue;
-
-import java.util.EnumMap;
-import java.util.EnumSet;
-
-import org.junit.Test;
-
-import com.ardor3d.input.ButtonState;
-import com.ardor3d.input.ControllerState;
-import com.ardor3d.input.InputState;
-import com.ardor3d.input.Key;
-import com.ardor3d.input.KeyEvent;
-import com.ardor3d.input.KeyboardState;
-import com.ardor3d.input.MouseButton;
-import com.ardor3d.input.MouseState;
-
-public class TestStandardConditions {
- final KeyboardState ks = new KeyboardState(EnumSet.noneOf(Key.class), KeyEvent.NOTHING);
- final MouseState ms = new MouseState(0, 0, 0, 0, 0, MouseButton.makeMap(ButtonState.UP, ButtonState.UP,
- ButtonState.UP), null);
- final ControllerState cs = new ControllerState();
- InputState is1, is2, is3, is4, is5;
-
- KeyboardState aDown = new KeyboardState(EnumSet.of(Key.A), KeyEvent.NOTHING);
- KeyboardState bDown = new KeyboardState(EnumSet.of(Key.B), KeyEvent.NOTHING);
-
- EnumMap<MouseButton, ButtonState> bothUp = MouseButton.makeMap(ButtonState.UP, ButtonState.UP, ButtonState.UP);
- EnumMap<MouseButton, ButtonState> upDown = MouseButton.makeMap(ButtonState.UP, ButtonState.DOWN, ButtonState.UP);
- EnumMap<MouseButton, ButtonState> downUp = MouseButton.makeMap(ButtonState.DOWN, ButtonState.UP, ButtonState.UP);
- EnumMap<MouseButton, ButtonState> bothDown = MouseButton
- .makeMap(ButtonState.DOWN, ButtonState.DOWN, ButtonState.UP);
-
- @Test
- public void testKeyHeld1() throws Exception {
- final KeyHeldCondition kh = new KeyHeldCondition(Key.A);
-
- is1 = new InputState(ks, ms, cs);
- is2 = new InputState(aDown, ms, cs);
- is3 = new InputState(bDown, ms, cs);
-
- assertFalse("not down", kh.apply(new TwoInputStates(is1, is1)));
- assertTrue("down", kh.apply(new TwoInputStates(is1, is2)));
- assertFalse("not down", kh.apply(new TwoInputStates(is1, is3)));
- assertFalse("not down", kh.apply(new TwoInputStates(is2, is3)));
- assertTrue("not down", kh.apply(new TwoInputStates(is2, is2)));
-
- assertFalse("empty1", kh.apply(new TwoInputStates(InputState.EMPTY, InputState.EMPTY)));
- assertFalse("empty2", kh.apply(new TwoInputStates(is1, InputState.EMPTY)));
- assertFalse("empty3", kh.apply(new TwoInputStates(InputState.EMPTY, is1)));
- assertTrue("empty4", kh.apply(new TwoInputStates(InputState.EMPTY, is2)));
- }
-
- @Test(expected = NullPointerException.class)
- public void testKeyHeld2() throws Exception {
- new KeyHeldCondition(null);
- }
-
- @Test
- public void testKeyPressed() throws Exception {
- final KeyPressedCondition kh = new KeyPressedCondition(Key.A);
-
- is1 = new InputState(ks, ms, cs);
- is2 = new InputState(aDown, ms, cs);
- is3 = new InputState(bDown, ms, cs);
-
- assertFalse("not down", kh.apply(new TwoInputStates(is1, is1)));
- assertTrue("down", kh.apply(new TwoInputStates(is1, is2)));
- assertFalse("not down", kh.apply(new TwoInputStates(is1, is3)));
- assertFalse("not down", kh.apply(new TwoInputStates(is2, is3)));
- assertFalse("not down", kh.apply(new TwoInputStates(is2, is2)));
-
- assertFalse("empty1", kh.apply(new TwoInputStates(InputState.EMPTY, InputState.EMPTY)));
- assertFalse("empty2", kh.apply(new TwoInputStates(is1, InputState.EMPTY)));
- assertFalse("empty3", kh.apply(new TwoInputStates(InputState.EMPTY, is1)));
- assertTrue("empty4", kh.apply(new TwoInputStates(InputState.EMPTY, is2)));
- }
-
- @Test(expected = NullPointerException.class)
- public void testKeyPressedNull() throws Exception {
- new KeyPressedCondition(null);
- }
-
- @Test
- public void testKeyReleased() throws Exception {
- final KeyReleasedCondition kh = new KeyReleasedCondition(Key.A);
-
- is1 = new InputState(ks, ms, cs);
- is2 = new InputState(aDown, ms, cs);
- is3 = new InputState(bDown, ms, cs);
-
- assertFalse("not down", kh.apply(new TwoInputStates(is1, is1)));
- assertFalse("not down", kh.apply(new TwoInputStates(is1, is2)));
- assertFalse("not down", kh.apply(new TwoInputStates(is1, is3)));
- assertTrue("not down", kh.apply(new TwoInputStates(is2, is3)));
- assertFalse("not down", kh.apply(new TwoInputStates(is2, is2)));
-
- assertFalse("empty1", kh.apply(new TwoInputStates(InputState.EMPTY, InputState.EMPTY)));
- assertFalse("empty2", kh.apply(new TwoInputStates(is1, InputState.EMPTY)));
- assertFalse("empty3", kh.apply(new TwoInputStates(InputState.EMPTY, is1)));
- assertFalse("empty4", kh.apply(new TwoInputStates(InputState.EMPTY, is2)));
- }
-
- @Test(expected = NullPointerException.class)
- public void testKeyReleasedNull() throws Exception {
- new KeyReleasedCondition(null);
- }
-
- @Test
- public void testMouseMove() throws Exception {
- final MouseMovedCondition mm = TriggerConditions.mouseMoved();
-
- final MouseState ms2 = new MouseState(1, 0, 1, 0, 0, bothUp, null);
- final MouseState ms3 = new MouseState(1, 0, 0, 0, 0, bothDown, null);
- final MouseState ms4 = new MouseState(3, 1, 2, 1, 0, bothDown, null);
- final MouseState ms5 = new MouseState(3, 0, 0, -1, 0, bothDown, null);
-
- is1 = new InputState(ks, ms, cs);
- is2 = new InputState(ks, ms2, cs);
- is3 = new InputState(ks, ms3, cs);
- is4 = new InputState(ks, ms4, cs);
- is5 = new InputState(ks, ms5, cs);
-
- assertFalse("mm1", mm.apply(new TwoInputStates(is1, is1)));
- assertTrue("mm2", mm.apply(new TwoInputStates(is1, is2)));
- assertFalse("mm3", mm.apply(new TwoInputStates(is2, is3)));
- assertTrue("mm4", mm.apply(new TwoInputStates(is3, is4)));
- assertTrue("mm5", mm.apply(new TwoInputStates(is4, is5)));
- assertFalse("mm6", mm.apply(new TwoInputStates(is2, is2)));
-
- assertFalse("empty1", mm.apply(new TwoInputStates(InputState.EMPTY, InputState.EMPTY)));
- assertFalse("empty2", mm.apply(new TwoInputStates(is1, InputState.EMPTY)));
- assertFalse("empty3", mm.apply(new TwoInputStates(InputState.EMPTY, is1)));
- assertTrue("empty4", mm.apply(new TwoInputStates(InputState.EMPTY, is2)));
- }
-
- @Test
- public void testMouseButton1() throws Exception {
- final MouseButtonCondition mm = TriggerConditions.leftButtonDown();
-
- final MouseState ms2 = new MouseState(1, 0, 1, 0, 0, bothUp, null);
- final MouseState ms3 = new MouseState(1, 0, 0, 0, 0, bothDown, null);
- final MouseState ms4 = new MouseState(3, 1, 2, 1, 0, upDown, null);
- final MouseState ms5 = new MouseState(3, 0, 0, -1, 0, downUp, null);
-
- is1 = new InputState(ks, ms, cs);
- is2 = new InputState(ks, ms2, cs);
- is3 = new InputState(ks, ms3, cs);
- is4 = new InputState(ks, ms4, cs);
- is5 = new InputState(ks, ms5, cs);
-
- assertFalse("mm1", mm.apply(new TwoInputStates(is1, is1)));
- assertFalse("mm2", mm.apply(new TwoInputStates(is1, is2)));
- assertTrue("mm3", mm.apply(new TwoInputStates(is2, is3)));
- assertFalse("mm4", mm.apply(new TwoInputStates(is3, is4)));
- assertTrue("mm5", mm.apply(new TwoInputStates(is4, is5)));
-
- assertFalse("empty1", mm.apply(new TwoInputStates(InputState.EMPTY, InputState.EMPTY)));
- assertFalse("empty2", mm.apply(new TwoInputStates(is1, InputState.EMPTY)));
- assertFalse("empty3", mm.apply(new TwoInputStates(InputState.EMPTY, is1)));
- assertTrue("empty4", mm.apply(new TwoInputStates(InputState.EMPTY, is3)));
- }
-
- @Test
- public void testMouseButton2() throws Exception {
- final MouseButtonCondition mm = TriggerConditions.rightButtonDown();
-
- final MouseState ms2 = new MouseState(1, 0, 1, 0, 0, bothUp, null);
- final MouseState ms3 = new MouseState(1, 0, 0, 0, 0, bothDown, null);
- final MouseState ms4 = new MouseState(3, 1, 2, 1, 0, upDown, null);
- final MouseState ms5 = new MouseState(3, 0, 0, -1, 0, downUp, null);
-
- is1 = new InputState(ks, ms, cs);
- is2 = new InputState(ks, ms2, cs);
- is3 = new InputState(ks, ms3, cs);
- is4 = new InputState(ks, ms4, cs);
- is5 = new InputState(ks, ms5, cs);
-
- assertFalse("mm1", mm.apply(new TwoInputStates(is1, is1)));
- assertFalse("mm2", mm.apply(new TwoInputStates(is1, is2)));
- assertTrue("mm3", mm.apply(new TwoInputStates(is2, is3)));
- assertTrue("mm4", mm.apply(new TwoInputStates(is3, is4)));
- assertFalse("mm5", mm.apply(new TwoInputStates(is4, is5)));
-
- assertFalse("empty1", mm.apply(new TwoInputStates(InputState.EMPTY, InputState.EMPTY)));
- assertFalse("empty2", mm.apply(new TwoInputStates(is1, InputState.EMPTY)));
- assertFalse("empty3", mm.apply(new TwoInputStates(InputState.EMPTY, is1)));
- assertTrue("empty4", mm.apply(new TwoInputStates(InputState.EMPTY, is3)));
- }
-}
+/**
+ * Copyright (c) 2008-2012 Ardor Labs, Inc.
+ *
+ * This file is part of Ardor3D.
+ *
+ * Ardor3D is free software: you can redistribute it and/or modify it
+ * under the terms of its license which may be found in the accompanying
+ * LICENSE file or at <http://www.ardor3d.com/LICENSE>.
+ */
+
+package com.ardor3d.input.logical;
+
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+
+import java.util.EnumMap;
+import java.util.EnumSet;
+
+import org.junit.Test;
+
+import com.ardor3d.input.ButtonState;
+import com.ardor3d.input.ControllerState;
+import com.ardor3d.input.InputState;
+import com.ardor3d.input.Key;
+import com.ardor3d.input.KeyEvent;
+import com.ardor3d.input.KeyboardState;
+import com.ardor3d.input.MouseButton;
+import com.ardor3d.input.MouseState;
+
+public class TestStandardConditions {
+ final KeyboardState ks = new KeyboardState(EnumSet.noneOf(Key.class), KeyEvent.NOTHING);
+ final MouseState ms = new MouseState(0, 0, 0, 0, 0, MouseButton.makeMap(ButtonState.UP, ButtonState.UP,
+ ButtonState.UP), null);
+ final ControllerState cs = new ControllerState();
+ InputState is1, is2, is3, is4, is5;
+
+ KeyboardState aDown = new KeyboardState(EnumSet.of(Key.A), KeyEvent.NOTHING);
+ KeyboardState bDown = new KeyboardState(EnumSet.of(Key.B), KeyEvent.NOTHING);
+
+ EnumMap<MouseButton, ButtonState> bothUp = MouseButton.makeMap(ButtonState.UP, ButtonState.UP, ButtonState.UP);
+ EnumMap<MouseButton, ButtonState> upDown = MouseButton.makeMap(ButtonState.UP, ButtonState.DOWN, ButtonState.UP);
+ EnumMap<MouseButton, ButtonState> downUp = MouseButton.makeMap(ButtonState.DOWN, ButtonState.UP, ButtonState.UP);
+ EnumMap<MouseButton, ButtonState> bothDown = MouseButton
+ .makeMap(ButtonState.DOWN, ButtonState.DOWN, ButtonState.UP);
+
+ @Test
+ public void testKeyHeld1() throws Exception {
+ final KeyHeldCondition kh = new KeyHeldCondition(Key.A);
+
+ is1 = new InputState(ks, ms, cs);
+ is2 = new InputState(aDown, ms, cs);
+ is3 = new InputState(bDown, ms, cs);
+
+ assertFalse("not down", kh.apply(new TwoInputStates(is1, is1)));
+ assertTrue("down", kh.apply(new TwoInputStates(is1, is2)));
+ assertFalse("not down", kh.apply(new TwoInputStates(is1, is3)));
+ assertFalse("not down", kh.apply(new TwoInputStates(is2, is3)));
+ assertTrue("not down", kh.apply(new TwoInputStates(is2, is2)));
+
+ assertFalse("empty1", kh.apply(new TwoInputStates(InputState.EMPTY, InputState.EMPTY)));
+ assertFalse("empty2", kh.apply(new TwoInputStates(is1, InputState.EMPTY)));
+ assertFalse("empty3", kh.apply(new TwoInputStates(InputState.EMPTY, is1)));
+ assertTrue("empty4", kh.apply(new TwoInputStates(InputState.EMPTY, is2)));
+ }
+
+ @Test(expected = NullPointerException.class)
+ public void testKeyHeld2() throws Exception {
+ new KeyHeldCondition(null);
+ }
+
+ @Test
+ public void testKeyPressed() throws Exception {
+ final KeyPressedCondition kh = new KeyPressedCondition(Key.A);
+
+ is1 = new InputState(ks, ms, cs);
+ is2 = new InputState(aDown, ms, cs);
+ is3 = new InputState(bDown, ms, cs);
+
+ assertFalse("not down", kh.apply(new TwoInputStates(is1, is1)));
+ assertTrue("down", kh.apply(new TwoInputStates(is1, is2)));
+ assertFalse("not down", kh.apply(new TwoInputStates(is1, is3)));
+ assertFalse("not down", kh.apply(new TwoInputStates(is2, is3)));
+ assertFalse("not down", kh.apply(new TwoInputStates(is2, is2)));
+
+ assertFalse("empty1", kh.apply(new TwoInputStates(InputState.EMPTY, InputState.EMPTY)));
+ assertFalse("empty2", kh.apply(new TwoInputStates(is1, InputState.EMPTY)));
+ assertFalse("empty3", kh.apply(new TwoInputStates(InputState.EMPTY, is1)));
+ assertTrue("empty4", kh.apply(new TwoInputStates(InputState.EMPTY, is2)));
+ }
+
+ @Test(expected = NullPointerException.class)
+ public void testKeyPressedNull() throws Exception {
+ new KeyPressedCondition(null);
+ }
+
+ @Test
+ public void testKeyReleased() throws Exception {
+ final KeyReleasedCondition kh = new KeyReleasedCondition(Key.A);
+
+ is1 = new InputState(ks, ms, cs);
+ is2 = new InputState(aDown, ms, cs);
+ is3 = new InputState(bDown, ms, cs);
+
+ assertFalse("not down", kh.apply(new TwoInputStates(is1, is1)));
+ assertFalse("not down", kh.apply(new TwoInputStates(is1, is2)));
+ assertFalse("not down", kh.apply(new TwoInputStates(is1, is3)));
+ assertTrue("not down", kh.apply(new TwoInputStates(is2, is3)));
+ assertFalse("not down", kh.apply(new TwoInputStates(is2, is2)));
+
+ assertFalse("empty1", kh.apply(new TwoInputStates(InputState.EMPTY, InputState.EMPTY)));
+ assertFalse("empty2", kh.apply(new TwoInputStates(is1, InputState.EMPTY)));
+ assertFalse("empty3", kh.apply(new TwoInputStates(InputState.EMPTY, is1)));
+ assertFalse("empty4", kh.apply(new TwoInputStates(InputState.EMPTY, is2)));
+ }
+
+ @Test(expected = NullPointerException.class)
+ public void testKeyReleasedNull() throws Exception {
+ new KeyReleasedCondition(null);
+ }
+
+ @Test
+ public void testMouseMove() throws Exception {
+ final MouseMovedCondition mm = TriggerConditions.mouseMoved();
+
+ final MouseState ms2 = new MouseState(1, 0, 1, 0, 0, bothUp, null);
+ final MouseState ms3 = new MouseState(1, 0, 0, 0, 0, bothDown, null);
+ final MouseState ms4 = new MouseState(3, 1, 2, 1, 0, bothDown, null);
+ final MouseState ms5 = new MouseState(3, 0, 0, -1, 0, bothDown, null);
+
+ is1 = new InputState(ks, ms, cs);
+ is2 = new InputState(ks, ms2, cs);
+ is3 = new InputState(ks, ms3, cs);
+ is4 = new InputState(ks, ms4, cs);
+ is5 = new InputState(ks, ms5, cs);
+
+ assertFalse("mm1", mm.apply(new TwoInputStates(is1, is1)));
+ assertTrue("mm2", mm.apply(new TwoInputStates(is1, is2)));
+ assertFalse("mm3", mm.apply(new TwoInputStates(is2, is3)));
+ assertTrue("mm4", mm.apply(new TwoInputStates(is3, is4)));
+ assertTrue("mm5", mm.apply(new TwoInputStates(is4, is5)));
+ assertFalse("mm6", mm.apply(new TwoInputStates(is2, is2)));
+
+ assertFalse("empty1", mm.apply(new TwoInputStates(InputState.EMPTY, InputState.EMPTY)));
+ assertFalse("empty2", mm.apply(new TwoInputStates(is1, InputState.EMPTY)));
+ assertFalse("empty3", mm.apply(new TwoInputStates(InputState.EMPTY, is1)));
+ assertTrue("empty4", mm.apply(new TwoInputStates(InputState.EMPTY, is2)));
+ }
+
+ @Test
+ public void testMouseButton1() throws Exception {
+ final MouseButtonCondition mm = TriggerConditions.leftButtonDown();
+
+ final MouseState ms2 = new MouseState(1, 0, 1, 0, 0, bothUp, null);
+ final MouseState ms3 = new MouseState(1, 0, 0, 0, 0, bothDown, null);
+ final MouseState ms4 = new MouseState(3, 1, 2, 1, 0, upDown, null);
+ final MouseState ms5 = new MouseState(3, 0, 0, -1, 0, downUp, null);
+
+ is1 = new InputState(ks, ms, cs);
+ is2 = new InputState(ks, ms2, cs);
+ is3 = new InputState(ks, ms3, cs);
+ is4 = new InputState(ks, ms4, cs);
+ is5 = new InputState(ks, ms5, cs);
+
+ assertFalse("mm1", mm.apply(new TwoInputStates(is1, is1)));
+ assertFalse("mm2", mm.apply(new TwoInputStates(is1, is2)));
+ assertTrue("mm3", mm.apply(new TwoInputStates(is2, is3)));
+ assertFalse("mm4", mm.apply(new TwoInputStates(is3, is4)));
+ assertTrue("mm5", mm.apply(new TwoInputStates(is4, is5)));
+
+ assertFalse("empty1", mm.apply(new TwoInputStates(InputState.EMPTY, InputState.EMPTY)));
+ assertFalse("empty2", mm.apply(new TwoInputStates(is1, InputState.EMPTY)));
+ assertFalse("empty3", mm.apply(new TwoInputStates(InputState.EMPTY, is1)));
+ assertTrue("empty4", mm.apply(new TwoInputStates(InputState.EMPTY, is3)));
+ }
+
+ @Test
+ public void testMouseButton2() throws Exception {
+ final MouseButtonCondition mm = TriggerConditions.rightButtonDown();
+
+ final MouseState ms2 = new MouseState(1, 0, 1, 0, 0, bothUp, null);
+ final MouseState ms3 = new MouseState(1, 0, 0, 0, 0, bothDown, null);
+ final MouseState ms4 = new MouseState(3, 1, 2, 1, 0, upDown, null);
+ final MouseState ms5 = new MouseState(3, 0, 0, -1, 0, downUp, null);
+
+ is1 = new InputState(ks, ms, cs);
+ is2 = new InputState(ks, ms2, cs);
+ is3 = new InputState(ks, ms3, cs);
+ is4 = new InputState(ks, ms4, cs);
+ is5 = new InputState(ks, ms5, cs);
+
+ assertFalse("mm1", mm.apply(new TwoInputStates(is1, is1)));
+ assertFalse("mm2", mm.apply(new TwoInputStates(is1, is2)));
+ assertTrue("mm3", mm.apply(new TwoInputStates(is2, is3)));
+ assertTrue("mm4", mm.apply(new TwoInputStates(is3, is4)));
+ assertFalse("mm5", mm.apply(new TwoInputStates(is4, is5)));
+
+ assertFalse("empty1", mm.apply(new TwoInputStates(InputState.EMPTY, InputState.EMPTY)));
+ assertFalse("empty2", mm.apply(new TwoInputStates(is1, InputState.EMPTY)));
+ assertFalse("empty3", mm.apply(new TwoInputStates(InputState.EMPTY, is1)));
+ assertTrue("empty4", mm.apply(new TwoInputStates(InputState.EMPTY, is3)));
+ }
+}