diff options
author | Renanse <[email protected]> | 2013-03-14 21:52:41 -0500 |
---|---|---|
committer | Renanse <[email protected]> | 2013-03-14 21:52:41 -0500 |
commit | 19bd8d8e1e5de5d31fab60bf2a3dedc9778782d0 (patch) | |
tree | f14c233f6181afaf91d00f83d5e078af27c3cafd /ardor3d-core | |
parent | aedbc04cc0c605496fc5aa12ba074643ef16d6d9 (diff) | |
parent | c81013c8f8bec5588be7e762a254c509286cbb46 (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')
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 <http\://www.ardor3d.com/LICENSE>.\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 <http\://www.ardor3d.com/LICENSE>.\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 Binary files differdeleted file mode 100644 index 09c5449..0000000 --- a/ardor3d-core/lib/google/guava-13.0.1.jar +++ /dev/null diff --git a/ardor3d-core/lib/unittests/cglib-nodep-2.2.jar b/ardor3d-core/lib/unittests/cglib-nodep-2.2.jar Binary files differdeleted file mode 100644 index ed07cb5..0000000 --- a/ardor3d-core/lib/unittests/cglib-nodep-2.2.jar +++ /dev/null diff --git a/ardor3d-core/lib/unittests/easymock.jar b/ardor3d-core/lib/unittests/easymock.jar Binary files differdeleted file mode 100644 index de59168..0000000 --- a/ardor3d-core/lib/unittests/easymock.jar +++ /dev/null diff --git a/ardor3d-core/lib/unittests/easymockclassextension.jar b/ardor3d-core/lib/unittests/easymockclassextension.jar Binary files differdeleted file mode 100644 index 7d098a7..0000000 --- a/ardor3d-core/lib/unittests/easymockclassextension.jar +++ /dev/null diff --git a/ardor3d-core/lib/unittests/junit-4.5.jar b/ardor3d-core/lib/unittests/junit-4.5.jar Binary files differdeleted file mode 100644 index 7339216..0000000 --- a/ardor3d-core/lib/unittests/junit-4.5.jar +++ /dev/null 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,
-
- /**
- * @ 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, + + /** + * @ 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))); + } +} |